
- •Задачи вычислительной геометрии
- •Задача локализации
- •Случай массового запроса задачи локализации
- •Построение выпуклой оболочки по Грехэму
- •Пересечение луча с плоскостью
- •Пересечение с прямоугольным параллелепипедом
- •Прямоугольный параллелепипед со сторонами, параллельными координатным плоскостям, однозначно определяется любыми двумя своими вершинами, примыкающими к одной из его диагоналей:

Построение выпуклой оболочки по Грехэму
Центр координат в какой-нибудь внутренней точке. Упорядочим точки относительно полярного угла, если таковые совпадают относительно расстояния от центра координат.
Сущность алгоритма в последовательном просмотре отсортированного списка и удалении внутренних вершин.
Обходим список, начиная с начальной точки, против часовой стрелки и проверяем внутренний угол для текущей
точки. Если он больше либо равен π, то удаляем вершину, в противном случае переходим к следующей.
Так как за каждый просмотр мы или удаляем одну вершину, или переходим к следующей, а просмотр заканчиваем при достижении начальной вершины, которая не будет удалятся, то мы выполняем не более N шагов.

Быстрые методы построения выпуклой оболочки

Задача о ближайшей паре — одномерный случай
Постановка задачи: задано N точек, необходимо найти пару наиболее близких точек.
Простейший алгоритм заключается в переборе всех пар точек и сравнении расстояний между ними. Всего N(N-1) пар, таким образом, сложность алгоритма O(N2).
l1 |
l3 |
|
l2 |
|
|||
|
|||
|
|
|
|
lmin = min(l1,l2 ,l3 )
Если множество точек делится прямой пополам, то общее количество сравнений равно:

Задача о ближайшей паре — двумерный случай
l3=min(l1,l2)
l1 |
l2 |
|
l3 l3
Найдем ближайшую пару в каждой половине (например, простым перебором), пусть минимальные расстояния соответственно равны l1 и l2. Для объединения решений необходимо учесть расстояние между точками, ближайшими к линии. Для этого найдем минимальное из
двух расстояний l3 = min(l1,l2 ) .
Проведем параллельно разбивающей прямой две прямые на расстоянии l3 от нее. Среди точек, попавших в получившиеся полосы, найдем ближайшую пару l4.
lmin = min(l3 ,l4 ).

Вычисления точек пересечений
Пусть луч задается двумя точками, через которые он проходит, с координатами (x0,y0,z0) и (x1,y1,z1).
Луч можно описать с помощью параметрических уравнений:
Пересечение луча со сферой
Сфера радиуса r c центром в точке C(xc, yc, zc) описывается уравнением вида:
|
(x − x )2 |
+ ( y − y |
c |
)2 + (z − z |
c |
)2 = r2 |
|
|
|||||||||
|
c |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
(x + lt − x )2 + ( y + mt − y |
c |
)2 + (z |
0 |
+ nt − z |
c |
)2 |
= r2 |
||||||||||
0 |
c |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|||
где |
At2 + |
Bt + C = |
0 |
|
|
|
|
|
|
|
|
|
|
||||
A = l2 + m2 + n2 ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
B = 2(x0 − xc )l + 2( y0 − yc )m + 2(z0 − zc )n; |
|
|
|
|||||||||||||
|
C = (x − x )2 + ( y − y |
) |
2 + (z |
0 |
− z |
)2 − r2 . |
|
|
|
||||||||
|
0 |
c |
0 |
|
c |
|
|
|
|
|
c |
|
|
|
|
|
|
|
|
x* = |
x0 + |
|
lt*; |
|
|
|
|
|
|
|
|
|
|||
|
|
y* = |
y0 + |
|
mt*; |
|
|
|
|
|
|
|
|
|
|||
|
|
z* = |
z0 + |
nt*; |
|
|
|
|
|
|
|
|
|