Популярные услуги

Все письменные КМ под ключ за 7 суток! (КМ-1 + КМ-2 + КМ-3 + КМ-4 + КМ-5)
КМ-6. Динамические массивы. Семинар - выполню любой вариант!
КМ-2. Разработка простейших консольных программ с использованием ООП + КМ-4. Более сложные элементы ООП - под ключ!
Оба семинара по программированию под ключ! КМ-2. Разработка циклических алгоритмов + КМ-3. Функции и многофайловые программы в Си
Одно любое задание в mYsql
Любая задача на C/C++
Сделаю ваше задание: Лабораторная работа на Pascal / Lazarus
Любой тест по базам данных максимально быстро на хорошую оценку - или верну деньги!
Любой реферат по объектно-ориентированному программированию (ООП)
Повышение уникальности твоей работе

Отсечение выпуклым многоугольным окном

2021-03-09СтудИзба

Отсечение выпуклым многоугольным окном. Алгоритм Кируса-Бэка

Алгоритм Кируса–Бэка является одним из наиболее известных алгоритмов отсечения выпуклым многоугольником. Особенностью этого алгоритма является следующее.

Отрезок может пересекать выпуклый многоугольник не более, чем в двух точках, при этом, если рассматривать ориентированный отрезок, то он входит в тело многоугольника через одно ребро (назовем его фронтальным) и выходит через другое ребро (назовем его тыльным). Если отрезок рассматривать как вектор, то независимо от  положения этого вектора в двумерном пространстве, для заданной направленности вектора все множество ребер многоугольника можно разбить на подмножество фронтальных и подмножество тыльных ребер.

На приведенном рисунке (Рис. 3.2‑1) подмножество тыльных ребер включает ребра А1А2, А2А3, а подмножество А3А4, А4А5, А5А1. При различных положениях отрезка заданной ориентации, точка входа отрезка в тело многоугольника может быть только на фронтальных ребрах, а точка выхода – только на тыльных ребрах.

В качестве критерия отнесения отрезка к подмножеству тыльных или фронтальных ребер используется скалярное произведение вектора внутренней нормали nвт к соответствующему ребру и  вектора директрисы отрезка D, при этом если скалярное произведение  положительное, то ребро фронтальное, в противном случае ребро тыльное.


Рис. 3.21

Точкой входа отрезка в многоугольник может быть только одна из точек пересечения линий, несущих фронтальные ребра, и линии, несущей отрезок. На Рис. 3.2‑1 для отрезка РQ это точка  вх А1 (точка пересечения линий несущих отрезок и ребро А1А2) и точка вх А2(точка пересечения линий несущих отрезок и ребро А2А3), причем это должна быть наиболее удаленная от начала отрезка точка (в данном случае это точка вх А1).

Точкой выхода отрезка из многоугольника может быть только одна из точек пересечения линий, несущих тыльные ребра и линии, несущей отрезок. На рисунке для отрезка РQ это точка  вых А3 (точка пересечения линий несущих отрезок и ребро А3А4), точка вых А4 и точка вых А5, причем из всех точек выхода реальной точкой выхода отрезка из тела многоугольника может быть ближайшая из этих точек от начала отрезка  (в данном случае это точка вых А4). Таким образом, точками пересечения многоугольника и отрезка PQ будет точка входа, соответствующая точке вх А1, и точка выхода, соответствующая точке вых А4.

Рекомендуемые материалы

Легко убедиться, что если не существует пересечения линии, несущей отрезок, и многоугольника, то точка входа, определенная выше описанным способом, будет располагаться дальше от начала отрезка, чем точка выхода (см. отрезок P2Q2 на рисунке (Рис. 3.2‑1).

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

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

Представим заданный отрезок PQ в виде вектора, как это показано на Рис. 3.3‑2, и запишем уравнение несущей его прямой в параметрической форме в виде:


Рис. 3.22


где:

- p(t) – точка, лежащая на прямой, несущей отрезок PQ;

- t – параметр задания прямой, несущей отрезок.

Координаты точки p(t), принадлежащей линии, несущей отрезок, для заданного значения параметра t рассчитываются следующим образом:

x=xР+t(xQ-xP);

y=yР+t(yQ-yP);

z=zР+t(zQ-zP).

Условием принадлежности точки заданному отрезку является выполнение условия:

0 <= t <= 1.

Для поиска точки пересечения линии, несущей отрезок, и линии, несущей очередное ребро, возьмем некоторую произвольную точку F (Рис. 3.2‑2) на линии, несущей это ребро, (в качестве этой точки можно использовать один из концов рассматриваемого ребра многоугольника) и  введем вектор Fp:


Возьмем внутреннею нормаль nвт для текущего ребра многоугольника и запишем скалярное произведение:


Обозначим вектор в первой скобке через v  (вектор, определяющий положение ребра по отношению к начальной точке отрезка), а вектор во второй скобке – через D (директриса, определяющая направленность отрезка),  и запишем   уравнение (3.2-1) в виде:


Для положения точки p(t), соответствующей искомой точки пересечения ребра и отрезка,  вектор Fp будет совпадать с линией, несущей анализируемое ребро многоугольника, а, следовательно, этот вектор будет перпендикулярен вектору внутренней нормали к этому ребру. Это позволяет для точки пересечения записать:

              (3.2-2)

Выражение (3.2-2) позволяет рассчитать значение параметра t для точки пересечения линий, несущих анализируемое ребро, и линии, несущей заданный отрезок.

Деление на ноль не допустимо, поэтому рассмотрим случаи, когда знаменатель рассматриваемого выражения равен нулю:


1 случай.

D = 0, что соответствует отрезку, вырожденному в точку. В этом случае  будем иметь три различных значения скалярного произведения:


2 случай.

D не равна нулю.

Так как вектор внутренней нормали nвт не равен нулю, равенство нулю рассматриваемого скалярного произведение может быть только из-за того, что вектор nвт перпендикулярен директрисе D, т.е. рассматриваемый отрезок параллелен анализируемому ребру. В этом случае  в зваиситости от знака скалярного произведения вектора nвт и   вектора v  будем иметь три различных варианта:


На следующем рисунке (Рис. 3.2‑3)  приведена граф-схема описанного алгоритма.

Оператор 1 осуществляет задание начальных значений для точки входа tвх, точки выхода tвых, начальный номера очередного ребра i, количество ребер многоугольника «к» и рассчитывает директрису для заданного отрезка.


Рис. 3.23

Оператор 2 осуществляет расчет внутренней нормали nвт и вектора v  для текущего ребра.

Оператор 5 определяет вид текущего ребра (тыльное или фронтальное).

Операторы 6 определяют текущее экстремальное значение для точки входа tвх, и точки выхода tвых.

В данном алгоритме для найденной точки пересечения линии, несущей отрезок, и линии, несущей текущее ребро многоугольника, непосредственно принадлежность отрезку не определяется. Эта задача решается за счет задания начального значения для tвх, равного 0, что соответствует началу отрезка, и начального значения для tвых, равного 1, что соответствует концу отрезка.

Рассмотрим процедуры формирования скалярного произведения  и внутренней нормали, которые используются в рассматриваемом алгоритме.

Скалярное произведение вектора V и W, заданных проекциями по осям координат Vx,Vy и Wx,Wy, в общем случае записывается следующим образом:


Расчет скалярного произведения вектора V, соответствующего очередному ребру,  и вектора  n, соответствующего  нормали к этому ребру, (Рис. 3.2‑4), осуществляется следующим образом:


где:

- nx, ny – проекции вектора нормали на координатные оси;

- Ai      -  вектор, соответствующий  i-ому ребру многоугольника;

- Axi, Ayi – проекции на координатные оси вектора Ai.


Рис. 3.24

Ещё посмотрите лекцию "Введение в дисциплину" по этой теме.

Так как интерес представляет только направленность нормали, зададим nx, равной  «1». Тогда ny рассчитывается как:

ny = - Axi / Ayi                                           (3.2-3)                  .

 

Выражение (3.2-3) дает возможность рассчитать нормаль к ребру Аi, однако это может быть или внутренняя нормаль или внешняя. Для того, чтобы проверить какая это нормаль, найдем скалярное произведение найденной нормали и вектора Ai+1 Ai+2, соответствующего соседнему  (i +1)-ому ребру многоугольника, и проанализируем знак полученного результата:


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

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Нашёл ошибку?
Или хочешь предложить что-то улучшить на этой странице? Напиши об этом и получи бонус!
Бонус рассчитывается индивидуально в каждом случае и может быть в виде баллов или бесплатной услуги от студизбы.
Предложить исправление
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5136
Авторов
на СтудИзбе
443
Средний доход
с одного платного файла
Обучение Подробнее