Розробка алгоритму пошуку перетину відрізків
Задача про перетин прямолінійних відрізків в площині. Розробка програми, яка методом скануючої лінії визначає точки перетину відрізків. Залежність орієнтованої площі від положення точок. Формування черги точок подій, прохід скануючої лінії по точкам подій
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 04.06.2011 |
Размер файла | 806,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Вступ
Здача про перетин прямолінійних відрізків на площині коротко формулюється так: задана певна кількість відрізків, необхідно знайти їх перетин. Ця задача має багато різноманітних застосувань.
В геоінформаційних системах (і не тільки в них) використовуються різноманітні географічні карти. На картах зображується багато різних об'єктів: населені пункти, границі, ріки та інші водойми, гори, дороги різного типу, мости, лінії електропередач та інші промислові об'єкти. Всі ці об'єкти зображуються певними геометричними образами, багато з яких можна вважати так чи інакше так чи інакше складеними з прямолінійних відрізків. Тому визначення перетину географічних об'єктів, наприклад, доріг, рік, границь зводиться до знаходження перетинів множин відрізків.
В мікроелектроніці виникає необхідність перевірки перетину різних компонентів інтегральних схем, які складаються з великої кількості елементів (до мільйону і більше), що неможливо виконати без комп'ютерних методів, в том числі без алгоритмів перетину геометричних об'єктів.
В комп'ютерній графіці необхідні методи видалення невидимих ліній і поверхонь в трьохвимірному просторі, коли різноманітні невидимих ліній об'єкти частково закривають один одного. Без оптимального алгоритму визначення попарних перетинів відрізків з заданого набору, з яких, як правило, складається більшість об'єктів сцени, важко реалізувати видалення невидимих ліній. Деякі задач обчислюваної геометрії такі як перевірка простоти багатокутника, визначення перетину багатокутників зводяться до пошуку перетинаючихся відрізків.
Проблема виявлення перетину відрізків виникає в багатьох галузях та потребує швидкого та ефективного вирішення.
1. Постановка задачі
Завдання моєї курсової роботи - розробка програми яка методом скануючої лінії визначає точки перетину відрізків.
Програма отримує скінченну множину відрізків на площині, вони задаються як координати початку і кінця відрізку. Оскільки таких відрізків дуже багато програма зчитує інформацію з текстового файлу input.txt в якому спочатку стоїть кількість відрізків, а потім координати точок початку і кінця відрізків.
В результаті своєї роботи програма виводить номера відрізків і координати точки першого знайденого перетину, повідомлення що відрізки частково співпадають або повідомлення про відсутність перетинів.
2. Вибір методу розв'язання задачі
Найпростіша дія над відрізками - перевірка перетинаються два відрізки чи ні, виявляється несподівано складним через багато особливих випадків. Існує багато способів визначення перетину.
Перший варіант це визначити точки перетину прямих на яких лежать ці відрізки, а потім визначити приналежність цієї точки відрізкам. Крайові випадки даного методу це паралельні прямі (вони взагалі не перетинаються) і відрізки які лежать на одній прямій, в такому випадку просто необхідно перевірити перетин проекції відрізків на вісі координат.
Ще один метод визначення перетину це використання орієнтованої площі. Для того щоб відрізки перетиналися достатньо щоб початок і кінець одного відрізку був по різні сторони іншого, що легко визначити порівнявши знаки орієнтованої площі двох трикутників утворених двома точками першого відрізку і однією з точок другого.
Рис. 2.1 Залежність орієнтованої площі від положення точок
Крайові випадки - належність точки кінцевої точки одного відрізку прямій на якій знаходиться інший відрізок, бо в такому випадку орієнтована площа дорівнює нулю і необхідно перевіряти належність точки відрізку (для цього достатньо порівняти відповідні координати). Ще один крайовий випадок можливий коли відрізок перетинає пряму на якій лежить інший відрізок, але не перетинає сам відрізок. Цей випадок потребує перевірки, наприклад методами описаними далі.
Рис. 2.2 Крайові випадки методу орієнтованої площі
Обидва методи потребують досить складних обчислень, тому існують методи «грубої», або не точної, перевірки, такі як метод обмежуючих прямокутників.
Обмежуючий прямокутник відрізку - це найменший прямокутник який містить відрізок і його сторони паралельні координат.
Рис. 2.3 Обмежуючі прямокутники при перетині відрізків
Визначити такі обмежуючі прямокутники і факт їхнього перетину можна досить швидко. Якщо обмежуючи прямокутники не перетинаються то і відрізки не перетинаються, при їх перетині необхідно виконати додаткову перевірку.
Слід зауважити, що як видно на рисунку 2.2, перетин обмежуючих прямокутників виключає один з крайових випадків двох попередніх методів (відрізки знаходяться на одній прямій, але не перетинаються).
Беручи до уваги швидкодію і складність обробки крайових випадків в даному курсовому проекті найдоцільніше використовувати метод орієнтованої площі в поєднанні з методом обмежуючих прямокутників.
Оскільки необхідно визначити чи перетинаються між собою багато відрізків, а не два, слід обрати метод вибору відрізків, перетин яких слід перевіряти. Найпростіший варіант - метод повної перевірки перевірка перетину кожного відрізку з всіма іншим по черзі, але цей метод дуже повільний.
Більш доцільно використовувати метод скануючої лінії. Сканування на площині корисний інструмент розв'язку задач оброки геометричних об'єктів на площині. Уявна вертикальна лінія сканування пересувається з ліва на право, перетинає об'єкти. В процесі обробки лінії сканування розв'язуються задачі, які відносяться тільки до частин об'єктів зліва від лінії сканування.
При скануванні задача на площині зводиться до серії аналогічних задач в одномірному просторі (на лінії сканування). Це достатньо ефективний підхід, оскільки виникаючі одномірні задачі зазвичай розв'язувати на багато легше.
В даному випадку перевіряються на перетин лише відрізки які знаходяться один біля одного в так званих точках подій (початку чи кінці відрізку або точці перетину), що дозволяє значно прискорити роботи програми при не великій кількості точок перетину, або в задачах де необхідно знайти хоча б один перетин (перевірка простоти многокутника). Але при великій кількості перетинів, наприклад коли всі відрізки перетинаються утворюючи сітку цей метод може працювати навіть повільніше ніж метод повної перевірки.
Рис. 2.4. «Складний» випадок для методу скануючої лінії
3. Алгоритм розв'язку задачі
Алгоритм скануючої лінії складається з двох основних частин.
Перша частина - формування черги точок подій на основі отриманих даних. Абсциси кінцевих точок відрізків додаються до черги, крім того кожна точка помічається, як кінець чи початок відрізку, залежно від положення точок одна до одної. Точка відрізку з мінімальною абсцисою помічається, як початок. З максимальною помічається як кінець. Отримана черга сортується по зростанню абсцис.
Друга частина алгоритму - прохід скануючої лінії по точкам подій. Залежно від типу точки події виконується певна послідовність дій. Якщо це точка початку відрізку то відрізок додається до структури стану скануючої лінії, перевіряється перетин доданого відрізку з відрізком над ним і відрізком під ним, оскільки перетинатися можуть лише відрізки, які знаходяться поруч. Тому в структурі скануючої лінії положення відрізків відсортовано залежно від значення ординати відрізку в цій точці. При обробці точки кінця відрізку перевіряється перетин відрізків над і під поточним і поточний відрізок видаляється з структури стану.
Прохід скануючої лінії завершується коли в черзі не залишається жодної точки, або коли знайдено точку перетину. Після виведення інформації про результат алгоритм завершує свою роботу.
Перевірка перетину відрізків відбувається в кілька етапів. Спочатку неточна перевірка методом обмежуючих прямокутників яка виконується швидко і дозволяє відкинути відрізки розташовані далеко один від одного, потім обчислюються векторні добутки і на їх основі визначається перетин, або часткове співпадіння відрізків.
Рис. 3.1 Прохід скануючої лінії по точкам подій
Рис 3.2. Блок-схема роботи алгоритму скануючої лінії
Рис 3.3 - Блок-схема функції пошуку перетину відрізків
4. Математична модель алгоритму
перетин відрізок площина
В процесі роботи алгоритму будуть перевірені всі перетини, оскільки перетинатися можуть лише відрізки, які знаходяться, всі пари відрізків перевіряються принаймні раз. Більш того, кожен перетин перевіряється реєструється лише раз. Завдяки перевірці на повторення, перед додаванням в чергу точок подій.
Початкове сортування і формування черги точок подій виконується за час О(nlog n). Після цього в циклі для кожної точки подій виконується один з трьох наборів певних операцій, залежно від її типу (початок, кінець відрізку чи точка перетину). Кожний з цих блоків в гіршому випадку виконується за час О(log n), тобто кожне виконання основного циклу виконується за логарифмічний час. Якщо позначити кількість перетинів як k то головний цикл буде виконуватися рівно 2n + k раз.
На кожному кроці циклу виявляється і заноситься в чергу не більше двох перетинів. Можливо, що певний перетин буде виявлятися кілька разів, в випадку який зображений на рисунку 3.1.
Рис. 3.1 Виявлення перетину кілька разів.
Однак, якщо спів ставити кожний перетин з виконанням головного циклу на якому він був виявлений, то стане зрозуміло, загальна кількість виявлених перетинів рівно O(n + k). Тому перевірка перед додаванням в чергу точок подій виконується n + k разів, а кожне виконання потребує O(log(n + k)) = O(log n) часу, оскільки k ? n(n - 1)/2 - максимальна кількість перетинів. Тобто загальна оцінка часу головного циклу O((n + k)log n), що перевищує оцінку часу попереднього сортування тому час роботи алгоритму O((n + k)log n), і в при невеликому значно швидше O(n2) (час за який працює метод повної перевірки), але при максимальному k алгоритм працює за O((n2)log n), що гірше ніж повний перелік.
5 Опис програмної реалізації
Для зручності роботи з геометричними проектами в програмі створені структури точка(point) - дві координати x та y та відрізок(segment) - дві кінцеві точки відрізку. Координати відрізків зберігаються в динамічному масиві структур відрізок. Створені дві логічні змінні, які контролюють наявність перетину(intersection) і перекривання відрізків(paralel).
Черга точок подій реалізована на основі стандартної пріоритетної черги С ++ (priority_queue) , яка забезпечує додавання нових елементів за логарифмічний час. Для якої також була створена структура(qtype), що містить всі необхідні дані - координату по x, номер відрізку, який викликав подію та характеристика типу точки подію (початок чи кінець відрізку). Для типу qtype перевизначається оператор порівняння і структура порівнюється по координаті x, і у випадку їх рівності меншим вважається початок відрізку. Перевизначення оператору дозволяє також змінити порядок сортуванні, тобто єлементи розташовані не від більшого до меншого, а навпаки.
Структура стану скануючої лінії реалізована на основі мультимножини С++ (multiset), який дозволяє додавати, видаляти та отримувати розташовані поруч елементи за логарифмічний час. В неї заносилися номера відрізків. І оскільки відрізки повинні сортуватися згідно координаті y в поточній точці подій ця мультимножина використовує спеціальну функцію порівняння елементів ssf. Яка визначає ординати поточній точці і порівнює їх.
Для перевірки перетину відрізків створена функція check, яка використовує допоміжні функції визначення обмежуючого прямокутника - BounndingRectangle, та векторного множення - VectorMult.
Основна функція програми складається з двох циклів. Перший зчитує данні про відрізки і створює чергу точок подій. Другий цикл проходить всі елементи черги точок подій і залежно від їх типу перевіряє перетин відрізків.
Для спрошення обробки перетинів і вигляду програми створена функція Intersect. Яка перивіряє частвовий перетин відрізків і виводить інформацію про перетин.
Якщо перетинів не знайдено перед завершенням роботи програма про це повідомляє.
6. Приклад роботи програми, порівняння з іншими алгоритмами
Превагу алгоритму скануючої лінії зручно продемонструвати на такому прикладі.
Рис. 6.1. Відрізки які потрібно перевірити
Програма створює чергу точок подій і починає їх обробку
Рис. 6.2. Точки подій в даному випадку
Пересуваючись по вісі Х з ліва на право обробляються всі точки подій, в одній точці подій може відбутися не більше двох перевірок, оскільки перевіряються лише відрізки біля відрізка який є причиною точки подій. Тому не складно помітити що перетин буде знайдено вже після сімох перевірок, а для перевірки даного випадку методом повного переліку потрібно було б зробити 72 перевірки, тому що необхідно перевірити перетин кожного відрізку з кожним.
Навіть при такій невеликій кількості відрізків метод скануючої лінії ефективніший більше ніж в десять разів і при збільшенні кількості відрізків різниця в ефективності цих методів зростає стрімко зростає.
Рис. 6.3 Рух скануючої лінії по поверхні
Після завершення роботи програма видасть повідомлення про результат її роботи в якому буде вказано номера відрізків які перетинаються та точка їх перетину.
Рис. 6.4 Результат роботи програми.
Висновки
Застосований метод скануючої лінії є ефективним засобом розв'язку багатьох задач обчислювальної геометричних. Серед яких:
- пошук перетину відрізків, перевірка простоти многокутника;
- геометричний пошук: метод полос, метод ланцюгів (перед обробка);
- розбиття простого многокутника на монотонні многокутники;
- перетин, об'єднання і інші характеристики множин прямокутників;
- побудова діаграми Вороного і тріангуляції Делоне.
Список джерел інформації:
1. http://rain.ifmo.ru/cat/view.php/vis/geometry/segment-intersection-2008
2. http://www.cs.uwaterloo.ca/~bjlafren/segint/index.htm
3. http://window.edu.ru/window/library?p_rid=57788
4. http://ru.wikipedia.org/wiki/Пересечение_отрезков
5. «Вычислительная геометрия и комп. графика на С++» Майкл Ласло.
6. «Вычислительная геометрия. Вступление» М. Шеймос, Ф. Препара.
7. «Вычислительная геометрия» А. Фокс М. Прат.
Размещено на Allbest.ru
Подобные документы
Складання програми на мові Pascal розрахунку за методом трапецій площі між графіками функцій. Розрахунок за методом трапецій площі між графіками функцій. Алгоритм програми. Кількість відрізків, на які розбивається дільниця інтегрування. Межа інтегрування.
контрольная работа [1,2 M], добавлен 22.04.2009Алгоритм побудови лінії та використання графічної бібліотеки DirectX. Способи побудови довільної кількості довільного розміру точок на поверхні форми. Можливості комп'ютера виконувати мультимедійні програми під управлінням операційної системи Windows.
контрольная работа [416,9 K], добавлен 22.10.2009Технологія візуального проектування. Аналітичне розв’язання задачі в загальному вигляді. Програмування в консольному режимі. Сценарій розв’язання задачі в Delphi та блок-схема алгоритму. Програмний код додатку та опис інтерфейсу з екранними копіями.
курсовая работа [2,4 M], добавлен 22.06.2009Розробка програми для вирішення графічної задачі. При вирішенні задачі необхідно cтворювати програму у середовищі програмування Turbo Pascal. Розробка алгоритму функціонування програми і надання блок-схеми алгоритму. Демонстрація роботи програми.
курсовая работа [1,3 M], добавлен 23.06.2010Знаходження площі фігури методом трапеції. Обчислення площ криволінійних трапецій. Геометричний сенс чисельника. Розробка програми для демонстрації нижчезазначеної математичної функції. Використання базових бібліотек класів, написаних на мові С++.
курсовая работа [1,0 M], добавлен 24.12.2013Алгоритм покриття за методом "мінімальній стовпець - максимальний рядок". Підпрограми основного алгоритму. Розробка програми сортування методом простих включень (бульбашковим методом). Словесний опис алгоритму, його контрольний приклад та ефективність.
курсовая работа [36,4 K], добавлен 06.03.2013Методи первинної обробки даних - згладжування та характеристика сплайнів. Загальна характеристика об'єктно-орієнтованої мови Java. Принципи побудови графічного інтерфейсу. Розробка алгоритму програми та інтерфейсу користувача програмного продукту.
дипломная работа [3,3 M], добавлен 10.10.2013Основні розрахунки резисторів мікросхеми. Розробка алгоритму рішення задачі методом блок-схем. Характеристика та розробка програми на мові С++ з використанням принципів модульного і структурного програмування. План тестування і налагоджування програми.
курсовая работа [2,9 M], добавлен 05.12.2012Розв’язання нелінійних алгебраїчних рівнянь методом дихотомії. Вирішення задачі знаходження коренів рівняння. Розробка алгоритму розв’язання задачі і тестового прикладу. Блок-схеми алгоритмів основних функцій. Інструкція користувача програмою мовою С++.
курсовая работа [2,0 M], добавлен 24.09.2010Основні відомості з лінійної алгебри. Власні значення і вектори матриці. Метод обертання Якобі. Засоби формування інтерфейсу користувача. Текст програми алгоритму методу обертання Якобі. Вимоги до програмно-технічного забезпечення. Інструкція користувача.
курсовая работа [306,0 K], добавлен 18.11.2015