Bir daire üzerinde bir nokta verilen radyanlarda açı elde edin


14

Bir daire etrafında dönen bir kadran üzerinde çalışıyorum.

before click

Bu kadran, kadranın konumunu, çemberdeki tıklama ile aynı açıya sahip bir noktaya ayarlamak için dairenin herhangi bir yerine farenizi hareket ettirmenize izin vermelidir. Örneğin, yukarıdaki kadrandan, aşağıda pembe olarak gösterilen noktayı tıklarsanız kadranı bu noktanın üzerine, ancak dairenin üzerine taşırdım.

after click (pink)

Yarıçap ve açı (radyan cinsinden) verilen bir daire üzerindeki bir noktanın konumunu nasıl alacağımı biliyorum. Bu formül :

x = Cos(angle) * radius + CenterX;
y = Sin(angle) * radius + CenterY;

Ancak, biraz tersini yapmak istiyorum - bir daire (kontrol düğmesi nereye) bir noktaya dönüştürmek istiyorum bir tıklama noktası var. Kontrol noktasını daireye aynı açıda yerleştirebilmem için bu noktayı (ve belirli bir yarıçapı) radyan cinsinden açıyı anlamaya çalışıyorum.

Bunu başarmak için kullanabileceğim kullanışlı bir formül var mı?


Noktalar arasında bir açı elde etmek için formülü mü arıyorsunuz?
William Mariager

İki nokta arasında açı bulabilir misiniz? Eğimi hesaplayabilirim ama tahminim, bir üçgen oluşturmak ve bunu çözmek için ters bir trigonomik fonksiyon kullanmak için üçüncü bir noktaya ihtiyacım vardı.
editör

Nasıl yapılacağını gösteren bir cevap gönderdim.
William Mariager

3
Burada gerçekten sahip olduğunuz iki vektör arasındaki açı . Her ikisi de dairenin merkezinden kaynaklanır ve aynı büyüklüktedir (dairenin yarıçapı).
MichaelHouse

İşte arkasındaki matematik: ters trig fonksiyonları . atankısadır arctanve atan2yalnızca bağımsız değişkenleri kabul eden ve bölümü sizin için yapan bir işlevdir.
voithos

Yanıtlar:


25

Atan2 işlevini kontrol edin .

Size (0, 0) ve (x, y) arasındaki xve yişlev bağımsız değişkenleri arasındaki açıyı verir .

Düzenleme: dairenin merkezi (0, 0) değilse, ne olursa olsun, sadece bunu: atan2(y - cy, x - cx).


Dairemin merkezinin orada olmaması önemli (0,0)mi? Sanırım sadece atan2aşağıdaki @Luis tarafından gösterildiği gibi argümanlarını mahsup ?
editör

Sadece çıkararak çevir. Düzenlemeye bakın.
jcora

3
-1: atan2 için ilk parametrey
Luis Estrada

2
Teşekkürler @ LouisEstrada, sadece düzelttim. (Umarım +1
yaparsınız

+ Luis Estrada Bunu nnecro-bump için özür dilerim, ama teşekkür etmek zorundaydım. Bir buçuk gündür programımda hata ayıklamaya çalışıyorum. Anlaşılan atan2, geriye dönük tartışmalar !
Carcigenicate

8

Atan2 işleviyle birlikte düğmenin merkezine ve imlecin noktasına ihtiyacınız vardır . Daha sonra şu şekilde kullanırsınız:

 angle = atan2(mouseY - knobCenterY, mouseX - knobCenterX)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.