2

Мне нужно найти «внутренний» угол в градусах между двумя сегментами (линиями), который составляет менее 180 градусов. Любой быстрый способ сделать это в python2.7? (Изящный не кажется, чтобы иметь функцию для этого)угол менее 180 между двумя сегментами (линии)

segment1 является x1, y1, x2, y2

segment2 является х3, у3, х4, у4

enter image description here

+0

если вы можете рассчитать угол между 3 точками, то if> 180: innerAngle = 360.0 - angle; Ваше принятое решение не рекомендуется (плохой acos()), лучше искать дальше. – AlexWien

+1

Общий способ расчета угла между двумя сегментами линии [показан в этом ответе] (http://stackoverflow.com/a/3366569/327026). –

ответ

5

я первоначально предложил использовать law of cosines в векторной форме: если ваши два отрезка задаются векторами б и с, и угол между ними равен θ, то

b · c = |b| |c| cos θ

и так

θ = cos−1((b · c)/|b| |c|)

Но Alex Wien указывает в комментариях, это дает плохие результаты, когда θ близка к нулю:

>>> theta = 1e-6 
>>> a = Vector(1, 0) 
>>> b = Vector(cos(theta), sin(theta)) 
>>> acos(a.dot(b)/(a.length * b.length)) 
9.999334257726859e-07 
>>> abs(theta - _)/theta 
6.657422731408927e-05 

который является относительная погрешность получения в течение одного часть в десять тысяч. Для очень малых углов вы можете получить 100% относительную погрешность:

>>> theta = 1e-9 
>>> a = Vector(1, 0) 
>>> b = Vector(cos(theta), sin(theta)) 
>>> acos(a.dot(b)/(a.length * b.length)) 
0.0 

Альтернативы формула использует арктангенс вместо дуги косинуса:

θ = tan−1(|a × b|/(a · b))

и это дает более точный результат для малых углов:

>>> atan2(abs(a.cross(b)), a.dot(b)) 
1e-09 
>>> theta == _ 
True 

(альтернативная формула следует из property of the cross product, что | × б | = | a | | b | грех θ. Разделите это по закону косинусов, чтобы получить результат, использованный здесь.)

+0

Как написать этот cos^-1 (и т. Д.) В python? – OHTO

+0

Ну, вы читаете руководство! Математические функции, такие как arc cosine, находятся в модуле ['math'] (http://docs.python.org/3/library/math.html). –

+0

:) немного RTFM всегда хорошо, вы правы! – OHTO

Смежные вопросы