Я думаю, что 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";
Некоторые из предлагаемых методов не работают в случае невыпуклого многоугольника, например, полумесяца. Вот простой способ, который будет работать с невыпуклыми многоугольниками (он будет работать даже с самопересекающимися многоугольниками, такими как восьмерка, сообщая вам, в основном ли по часовой стрелке).
Суммируйте по ребра, (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
найдите центр масс этих точек.
предположим, что есть прямые от этой точки до ваших точек.
найдите угол между двумя линиями для line0 line1
, чем для line1 и line2
...
...
], если этот угол монотонно увеличивается, чем против часовой стрелки,
иначе, если монотонно уменьшается, то по часовой стрелке
иначе (он не монотонный)
вы не можете решить, поэтому это неразумно
Начните с одной из вершин и вычислите угол между каждой стороной.
Первый и последний будут нулевыми (пропустите их); в остальном синус угла будет дан как перекрестное произведение нормировок на единицу длины (точка [n] -точка [0]) и (точка [n-1] -точка [0]).
Если сумма значений положительна, то ваш многоугольник рисуется против часовой стрелки.
Найдите вершину с наименьшим y (и наибольшим x, если есть связи). Пусть вершина будет A
, предыдущая вершина в списке будет B
, а следующая вершина в списке будет C
. Теперь вычислите знак перекрестного произведения AB
и AC
.
Ссылки:
Как найти ориентацию простого многоугольника? дюйм Часто задаваемые вопросы: comp.graphics.algorithms .
Ориентация кривой в Википедии.
Перекрестное произведение измеряет степень перпендикулярности двух векторов. Представьте, что каждое ребро вашего многоугольника является вектором в плоскости 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 точек вокруг замкнутого пути и сложите значения из этого вычисления в каждой вершине ..
Если окончательная сумма положительна, вы пошли по часовой стрелке, отрицательно,