2010-01-27 21 views
25

İşaretlenmiş açı theta'yı a'dan b'ye nasıl buldunuz?Vektörler Arasında İmzalı Açı Bulma

Ve evet, biliyorum ki theta = arccos ((a.b)/(| a || b |)). Bununla birlikte, bu bir işaret içermemektedir (yani, saat yönünde veya saat yönünün tersine dönme arasında ayrım yapmamaktadır).

Bana a'dan b'ye dönmek için gereken minimum açıyı söyleyebilecek bir şeye ihtiyacım var. Pozitif bir işaret + x ekseninden + y eksenine doğru bir dönüşü gösterir. Tersine, negatif bir işaret + x ekseninden -y eksenine doğru bir dönüşü gösterir.

assert angle((1,0),(0,1)) == pi/2. 
assert angle((0,1),(1,0)) == -pi/2. 

cevap

30

Eğer seçtiğiniz matematik kütüphanesinde bir atan2() fonksiyonu varsa:

signed_angle = atan2(b.y,b.x) - atan2(a.y,a.x) 
+0

Mükemmel, teşekkür ederim. – Cerin

+9

a = (-1,1) ve b = (-1, -1) hakkında, burada cevap pi/2 olmalıdır? Mutlak değerin pi'den büyük olup olmadığını kontrol etmeli ve ardından 2 * pi ekleyiniz veya çıkarınız. –

+0

@ Derek İyi yakalama. Çözümü uygularken bunu kendim keşfettim. – Cerin

50

Ne vektör bulmak, yani sık sık “Suçlu nokta ürünü” denir kullanmak istiyorum Vektörlerden birine dik ve ardından diğer vektör ile nokta ürününü bulun.

if(a.x*b.y - a.y*b.x < 0) 
    angle = -angle; 

Ayrıca yapabilirsiniz:

angle = atan2(a.x*b.y - a.y*b.x, a.x*b.x + a.y*b.y); 
+0

İkinci denklemin her zaman 180 ° 'den az açılar mı olduğunu biliyor musunuz? – rraallvv

+2

Açı, -pi ve pi radyanlar arasında olacaktır. –

+0

, bu sorunu çözen bir = (-1,1) ve b = (-1, -1) – rraallvv

İlgili konular