( Bu yaklaşımı daha önce test ettim ve doğru çalıştığını hatırlıyorum, ancak bu soru için özel olarak test etmedim. )
Anlayabildiğim kadarıyla, hem ve , neredeyse paralel / dikey olmaları durumunda felaket iptaline maruz kalabilirler - atan2, her iki giriş de kapalı olursa size iyi bir doğruluk sağlayamaz.∥v1×v2∥v1⋅v2
Sorunu, kenar uzunluklarına sahip bir üçgenin açısını bularak yeniden biçimlendirerek başlayın. ,ve(bunların hepsi kayan nokta aritmetiğinde doğru olarak hesaplanır). Yan uzunluklarıyla belirtilen bir üçgenin alanını ve açısını ( ve arasında ) hesaplamanızı sağlayan Kahan ( Yanlış Hesaplanan Alan ve İğne Benzeri Üçgenin Açıları) nedeniyle Heron formülünün iyi bilinen bir çeşidi vardır , ve bunu sayısal olarak kararlı bir şekilde yapın. Bu alt problemin azaltılması da doğru olduğundan, bu yaklaşım keyfi girdiler için işe yaramalıdır.a=|v1|b=|v2|c=|v1−v2|ab
Varsayarak (s.3 bakınız) kağıttan teklif ,
Buradaki tüm parantezler dikkatlice yerleştirilmiştir ve önemlidir; Kendinizi negatif bir sayının kare kökünü alırsanız, giriş tarafı uzunlukları bir üçgenin yan uzunlukları değildir.a≥b
μ=⎧⎩⎨c−(a−b),b−(a−c),invalid triangle,if b≥c≥0,if c>b≥0,otherwise
angle=2arctan(((a−b)+c)μ(a+(b+c))((a−c)+b)−−−−−−−−−−−−−−−−−−−−√)
Kahan'ın makalesinde, diğer formüllerin başarısız olduğu değerlerin örnekleri de dahil olmak üzere, bunun nasıl çalıştığına dair bir açıklama var. Sizin ilk formülü olduğu sayfa 4.αC′′
Kahan'ın Heron'un formülünü önermemin ana nedeni, çok güzel bir ilkel yapmasıdır - potansiyel olarak zor düzlemsel geometri sorularının çoğu, rastgele bir üçgenin alanını / açısını bulmak için azaltılabilir, bu nedenle sorununuzu buna indirgeyebilirseniz, bunun için güzel ve kararlı bir formül ve kendi başınıza bir şey bulmanıza gerek yok.
Düzenle Stefano'nun yorumunu takiben , ( kod ) için göreceli hata grafiği . İki çizgi ve , için yatay eksen boyunca ilerleyen göreceli hatalardır . Görünüşe göre çalışıyor.
v1=(1,0)v2=(cosθ,sinθ)θ=ϵθ=π/2−ϵϵ