я первоначально предложил использовать 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 | грех θ. Разделите это по закону косинусов, чтобы получить результат, использованный здесь.)
если вы можете рассчитать угол между 3 точками, то if> 180: innerAngle = 360.0 - angle; Ваше принятое решение не рекомендуется (плохой acos()), лучше искать дальше. – AlexWien
Общий способ расчета угла между двумя сегментами линии [показан в этом ответе] (http://stackoverflow.com/a/3366569/327026). –