Во-первых, мы знаем, что если sin(a)
отрицательно, то угол составляет более 180 градусов.
Как мы находим знак sin(a)
?Вот где в игру вступает перекрестное произведение.
Сначала давайте определим два вектора:
v1 = p1-p2
v2 = p3-p2
Это означает, что два вектора начинаются с p2
, а один указывает на p1
идругие точки указывают на p3
.
Суммарное произведение определяется как:
(x1, y1, z1) x (x2, y2, z2) = (y1z2-y2z1, z1x2-z2x1, x1y2-x2y1)
Поскольку ваши векторы находятся в 2d, то z1
и z2
равны 0 и, следовательно:
(x1, y1, 0) x (x2, y2, 0) = (0, 0, x1y2-x2y1)
Именно поэтому они называют это zcross , потому что только элемент z продукта имеет значение, отличное от 0.
Теперь, с другой стороны, мызнать, что:
||v1 x v2|| = ||v1|| * ||v2|| * abs(sin(a))
, где ||v||
- норма (размер) вектора v
.Также мы знаем, что если угол a
меньше 180, то v1 x v2
будет указывать вверх (правило правой руки), а если он больше 180, он будет указывать вниз.Итак, в вашем особом случае:
(v1 x v2).z = ||v1|| * ||v2|| * sin(a)
Проще говоря, если значение z v1 x v2
положительное, то a
меньше 180. Если оно отрицательное, то оно больше (значение zбыло x1y2-x2y1
).Если перекрестное произведение равно 0, тогда два вектора параллельны, а угол равен 0 или 180, в зависимости от того, имеют ли два вектора соответственно одинаковое или противоположное направление.