Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Геометрические Алгоритмы.doc
Скачиваний:
10
Добавлен:
10.12.2018
Размер:
652.29 Кб
Скачать

Геометрические Алгоритмы.

Основные задачи:

Системы координат

Структуры геометрических данных, основные операции классы 'Точка', 'Многоугольник', 'Ребро/Линия'

Уравнения различных фигур и их составление по разным данным Окружность по трем точкам, уравнение плоскости и т.п.

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

Нахождение пересечения и объединения геометрических объектов Отрезки, прямые, окружности и т.п. Установка количества точек пересечения и их координат...

Принадлежит или не принадлежит? Плоскости, многоугольнику, прямой....

Нахождение расстояния между различными объектами Точкой, прямой, отрезком....

Работа с многоугольниками

Алгоритм Бентли — Оттмана (1979) позволяет найти все точки пересечений прямолинейных отрезков на плоскости. В нем применяется метод выметающей прямой (заметающей прямой, движущейся прямой, сканирующей линии; англ. sweeping line). В методе используется вертикальная выметающая прямая движущаяся слева направо, при этом отрезки, которые она пересекает при данной координате x, можно упорядочить по координате y, тем самым их можно сравнивать между собой (какой выше, какой ниже). Это сравнение можно осуществить, например, используя уравнение прямой, проходящей через две точки (отрезки заданы двумя своими конечными точками): , где x1, y1 и x2, y2 — координаты, соответственно, первой и второй точек отрезка. Выметающая прямая перемещается по так называемым точкам событиям (левым и правым концам отрезков, а также точкам пересечения отрезков). После точки пересечения отрезки следует менять местами, так как, например, самый верхний из пересекающихся отрезков после точки пересечения становится самым нижним.

Алгоритм Брезенхе́ма (англ. Bresenhams line algorithm) — это алгоритм, определяющий, какие точки двумерного растра нужно закрасить, чтобы получить близкое приближение прямой линии между двумя заданными точками. Это один из старейших алгоритмов в машинной графике — он был разработан Джеком Е. Брезенхэмом (Jack E. Bresenham) в компании IBM в 1962 году. Алгоритм широко используется, в частности, для рисования линий на экране компьютера. Существует обобщение алгоритма Брезенхэма для построения кривых 2-го порядка.

Marching Squares (англ. движущиеся квадраты) – алгоритм в компьютерной графике, который генерирует изолинии на двухмерном скалярном поле.

Алгоритм Гилберта — Джонсона — Кёрти (англ. GilbertJohnsonKeerthi algorithm, сокращённо GJK) — алгоритм для определения минимального расстояния между двумя выпуклыми множествами (объектами). В отличие от многих других алгоритмов нахождения расстояния, GJK не требует, чтобы геометрические данные были сохранены в каком-либо специфическом формате. Вместо этого алгоритм GJK полностью полагается на носитель функции и итерационным методом (с помощью итераций) генерирует ближайшие симплексы для корректного определения минимального расстояния между двумя выпуклыми объектами.

СПЛАЙНЫ. ……..

Диаграмма Вороного

Диаграмма Вороного случайного множества точек на плоскости

Диаграмма Вороного конечного множества точек S на плоскости представляет такое разбиение плоскости, при котором каждая область этого разбиения образует множество точек, более близких к одному из элементов множества S, чем к любому другому элементу множества.

Алгоритм Чана (Тимоти М. Чан, 1996) — алгоритм построения выпуклой оболочки конечного множества точек на плоскости. Является комбинацией двух более медленных алгоритмов (сканирование по Грэхему O(nlogn) и заворачивание по Джарвису O(nh)). Недостатком сканирования по Грэхему является необходимость сортировки всех точек по полярному углу, что занимает достаточно много времени O(nlogn). Заворачивание по Джарвису требует перебора всех точек для каждой из h точек выпуклой оболочки, что в худшем случае занимает O(n2).

Алгоритм Грэхема — алгоритм построения выпуклой оболочки в двухмерном пространстве. В этом алгоритме задача о выпуклой оболочке решается с помощью стека, сформированного из точек-кандидатов. Все точки входного множества заносятся в стек, а потом точки, не являющиеся вершинами выпуклой оболочки, со временем удаляются из него. По завершении работы алгоритма в стеке остаются только вершины оболочки в порядке их обхода против часовой стрелки.

Алгоритм DDA-линии растеризует отрезок прямой между двумя заданными точками, используя вычисления с вещественными числами. Аббревиатура DDA в названии этого алгоритма машинной графики происходит от англ. Digital Differential Analyzer (цифровой дифференциальный анализатор) — вычислительное устройство, применявшееся ранее для генерации векторов...

Алгоритм

Пусть отрезок задан вещественными координатами концов (x1,y1); (x2,y2). Растровыми (целочисленными) координатами концевых точек становятся округлённые значения исходных координат: xstart = round(x1), ystart = round(y1); xend = round(x2), yend = round(y2).

Большее из двух чисел — (xendxstart) или (yendystart) — по абсолютной величине принимается за количество шагов L цикла растеризации, увеличенное на 1.

В начале цикла вспомогательным вещественным переменным x и y присваиваются исходные координаты начала отрезка: x = x1; y = y1. На каждом шаге цикла эти вещественные переменные получают приращения (xendxstart) / L; (yendystart) / L. Растровые же координаты, продуцируемые на каждом шаге, являются результатом округления соответствующих вещественных значений x и y.

Применение вычислений с вещественными числами и лишь однократное использование округления для окончательного получения значения растровой координаты обусловливают высокую точность и низкое быстродействие алгоритма.

Далее представлен программный код реализации алгоритма DDA-линии. Значения вспомогательных переменных x и y здесь сохраняются в виде массивов.

void dda_line (float x1, float y1, float x2, float y2)

{

int i, L, xstart, ystart, xend, yend;

float dX, dY, x[1000], y[1000];

xstart = roundf(x1);

ystart = roundf(y1);

xend = roundf(x2);

yend = roundf(y2);

L = max(abs(xend-xstart), abs(yend-ystart));

dX = (x2-x1) / L;

dY = (y2-y1) / L;

i = 0;

x[i] = x1;

y[i] = y1;

i++;

while (i < L)

{

x[i] = x[i-1] + dX;

y[i] = y[i-1] + dY;

i++;

}

x[i] = x2;

y[i] = y2;

/* Output: -----------------------*/

i = 0;

while (i <= L)

{

plot (roundf(x[i]), roundf(y[i])); /* Draws a point. */

i++;

}

/* -------------------------------*/

Модифицированный алгоритм DDA-линии применяется для растеризации окружностей.

Marching cubes (англ. движущиеся кубики) — алгоритм в компьютерной графике, впервые предложенный в 1987 году Вильямом Лоренсеном (англ. William E. Lorensen) и Харви Клайном (англ. Harvey E. Cline), для обработки полигональной сетки изоповерхности трехмерного скалярного поля (чаще называемой сеткой вокселей - Voxel — образовано из слов: объёмный (англ. volumetric) и пиксел (англ. pixel) ).

Аналогичный алгоритм на плоскости называется marching squares.