Как определить, находится ли список точек полигона в по часовой стрелке порядке?

Я думаю, что TimeSpan имеет все, в чем мы нуждаемся в нем, не имея необходимость обращаться к 365,25 (или любое другое приближение). Подробно останавливаясь на примере в августе:

DateTime myBD = new DateTime(1980, 10, 10);
TimeSpan difference = DateTime.Now.Subtract(myBD);

textBox1.Text = difference.Years + " years " + difference.Months + " Months " + difference.Days + " days";
242
задан Machavity 24 January 2019 в 03:31
поделиться

5 ответов

Некоторые из предлагаемых методов не работают в случае невыпуклого многоугольника, например, полумесяца. Вот простой способ, который будет работать с невыпуклыми многоугольниками (он будет работать даже с самопересекающимися многоугольниками, такими как восьмерка, сообщая вам, в основном ли по часовой стрелке).

Суммируйте по ребра, (x 2 - x 1 ) (y 2 + y 1 ). Если результат положительный, кривая идет по часовой стрелке, если отрицательный, кривая идет против часовой стрелки. (Результат - вдвое больше замкнутой области с условным обозначением +/-.)

point[0] = (5,0)   edge[0]: (6-5)(4+0) =   4
point[1] = (6,4)   edge[1]: (4-6)(5+4) = -18
point[2] = (4,5)   edge[2]: (1-4)(5+5) = -30
point[3] = (1,5)   edge[3]: (1-1)(0+5) =   0
point[4] = (1,0)   edge[4]: (5-1)(0+0) =   0
                                         ---
                                         -44  counter-clockwise
395
ответ дан 23 November 2019 в 03:12
поделиться

найдите центр масс этих точек.

предположим, что есть прямые от этой точки до ваших точек.

найдите угол между двумя линиями для line0 line1

, чем для line1 и line2

...

...

], если этот угол монотонно увеличивается, чем против часовой стрелки,

иначе, если монотонно уменьшается, то по часовой стрелке

иначе (он не монотонный)

вы не можете решить, поэтому это неразумно

-4
ответ дан 23 November 2019 в 03:12
поделиться

Начните с одной из вершин и вычислите угол между каждой стороной.

Первый и последний будут нулевыми (пропустите их); в остальном синус угла будет дан как перекрестное произведение нормировок на единицу длины (точка [n] -точка [0]) и (точка [n-1] -точка [0]).

Если сумма значений положительна, то ваш многоугольник рисуется против часовой стрелки.

6
ответ дан 23 November 2019 в 03:12
поделиться

Найдите вершину с наименьшим y (и наибольшим x, если есть связи). Пусть вершина будет A , предыдущая вершина в списке будет B , а следующая вершина в списке будет C . Теперь вычислите знак перекрестного произведения AB и AC .


Ссылки:

31
ответ дан 23 November 2019 в 03:12
поделиться

Перекрестное произведение измеряет степень перпендикулярности двух векторов. Представьте, что каждое ребро вашего многоугольника является вектором в плоскости xy трехмерного (3-D) xyz-пространства. Тогда перекрестное произведение двух последовательных ребер представляет собой вектор в направлении z (положительное направление z, если второй сегмент направлен по часовой стрелке, минус направление z, если это направление против часовой стрелки). Величина этого вектора пропорциональна синусу угла между двумя исходными краями, поэтому он достигает максимума, когда они перпендикулярны, и сужается, чтобы исчезнуть, когда края коллинеарны (параллельны).

Итак, для каждого вершина (точка) многоугольника, вычислите величину перекрестного произведения двух смежных ребер:

Using your data:
point[0] = (5, 0)
point[1] = (6, 4)
point[2] = (4, 5)
point[3] = (1, 5)
point[4] = (1, 0)

Обозначьте края последовательно, как
edgeA - это сегмент от point0 до point1 и
edgeB между point1 ] до point2
...
edgeE находится между point4 и point0 .

Тогда Вершина A ( point0 ) находится между
edgeE [От point4 до point0 ]
edgeA [ От point0 до `point1 '

Эти два ребра сами являются векторами, чьи координаты x и y могут быть определены путем вычитания координат их начальной и конечной точек:

edgeE = point0 - point4 = (1, 0) - (5, 0) = (- 4, 0) и
edgeA = point1 - point0 = (6, 4) - (1, 0) = ] (5, 4) и

И перекрестное произведение этих двух смежных ребер вычисляется с использованием определителя следующей матрицы, которая строится путем помещения координат двух векторов под символами, представляющими три координаты ось ( i , j , & k ). Третья (нулевая) координата присутствует, потому что концепция перекрестного произведения является трехмерной конструкцией, и поэтому мы расширяем эти двумерные векторы в трехмерные, чтобы применить перекрестное произведение:

 i    j    k 
-4    0    0
 1    4    0    

Учитывая, что все перекрестные произведения образуют вектор, перпендикулярный плоскости двух перемножаемых векторов, определитель матрицы выше имеет только компонент k (или ось z). Формула для вычисления величины компонента k или оси z:
a1 * b2 - a2 * b1 = -4 * 4 - 0 * 1 = -16

Величина этого значения ( -16 ) является мерой синуса угла между двумя исходными векторами, умноженного на произведение величин двух векторов.
Фактически, другая формула для его значения -
AXB (Cross Product) = | A | * | B | * sin (AB) .

Итак, чтобы вернуться к измерению угла, вам нужно разделить это значение ( -16 ) на произведение величин двух векторов.

| A | * | B | = 4 * Sqrt (17) = 16,4924 ...

Таким образом, мера греха (AB) = -16 / 16,4924 = -. 97014 ...

Это мера того, изогнулся ли следующий за вершиной сегмент влево или вправо и насколько. Арксинус брать не нужно. Все, о чем мы будем заботиться, это его величина и, конечно же, его знак (положительный или отрицательный)!

Сделайте это для каждой из других 4 точек вокруг замкнутого пути и сложите значения из этого вычисления в каждой вершине ..

Если окончательная сумма положительна, вы пошли по часовой стрелке, отрицательно,

49
ответ дан 23 November 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: