TravisG'nin yorumunda biraz genişleyeceğim ve sorunuzun "2D" etiketine sahip olduğu gerçeğinden yararlanarak başka bir cevap vereceğim.
Nokta ürününü kullanarak iki vektör arasındaki açıyı elde edebilirsiniz, ancak iki vektör arasındaki işaretli açıyı kullanarak elde edemezsiniz . Başka bir deyişle, zaman içinde bir karakteri bir noktaya çevirmek istiyorsanız, nokta ürün size ne kadar döneceğinizi, ancak hangi yöne dönmeyeceğinizi söyleyecektir. Bununla birlikte, nokta ürünle birleştirildiğinde çok yararlı olan başka bir basit formül vardır. Sadece sahip değil
dot(A,B) = |A| * |B| * cos(angle)
Başka bir formülünüz de olabilir (adını politik doğruluk için oluşturduğum):
pseudoCross(A,B) = |A| * |B| * sin(angle)
burada A = (a, b), B = (x, y) ise pseudoCross (A, B), çapraz ürünün (a, b, 0) x (x, y, 0) üçüncü bileşeni olarak tanımlanır ). Diğer bir deyişle:
a*x+b*y = |A| * |B| * cos(angle)
-b*x+a*y = |A| * |B| * sin(angle)
Ardından tam işaretli açı angle=atanfull(-b*x+a*y,a*x+b*y)
(normalflaştırılmamış değerlerden geçerseniz atanfull veya atan2 işlevleri sizi affeder). A ve B normalleştirilirse, yani |A|=|B|=1
bunlar basitçe:
a*x+b*y = cos(angle)
-b*x+a*y = sin(angle)
Daha derin bir açıklama için yukarıdaki denklemlerin matris denklemi ile ifade edilebileceğini unutmayın:
[ a,b] [x] [cos(angle)]
[-b,a] * [y] = [sin(angle)]
Ancak a ve b olarak ifade edilebilir a=cos(ang1)
, b=sin(ang1)
bazı değeri ang1
(değil angle
). Bu nedenle, soldaki matris, vektörü (x, y) -ang1 miktarı ile döndüren bir döndürme matrisidir. Bu, birim vektörü (A) vektör / eksen (1,0) olarak değerlendirildiği bir referans çerçevesine geçişle eşdeğerdir! Böylece, sadece bu çerçevede birim daire / sağ üçgeni çizerek, o ürünün ortaya çıkan vektörün neden (cos (açı), günah (açı)) olduğunu görebilirsiniz.
Kutup biçiminde (a, b) ve (x, y) yazarsanız cos(l)*cos(m)+sin(l)*sin(m)=cos(l-m)
ve açı farkı formüllerini uygularsanız, sin(l)*cos(m)-cos(l)*sin(m)=sin(l-m)
(lm) = açı olduğundan sinüslerin / kosinüslerin bu ürün tarafından verildiğini tekrar ifade edersiniz. Alternatif olarak, bu kimlikler yukarıda verilen doğrusal ürünün neden bir vektörü döndürdüğünü görmek için kullanılabilir.
Tüm bu kimlikler nadiren açılara ihtiyacınız olduğu anlamına gelir. Açılar garip olabilir - radyan / derece, ters sinüs / kosinüs için kurallar, her 2 * pi tekrarladıkları gerçeği - bu aslında daha yararlı olabilir ve bir sürü "if (ang <180)" vb mantıktan kurtarabilir.