Відсікання відрізків — Вікіпедія

У комп'ютерній графіці, відсікання відрізків — це процес видалення відрізків або частин відрізків за межами оброблюваної ділянки. Як правило, будь-який відрізок або його частина, розташована за межами зони огляду, видаляється.

Є два загальних алгоритми для відсікання відрізків: Коена — Сазерленда і Ляна — Барського.

Метод відсікання відрізка складається з різних частин. Спочатку перевіряється, чи дана частина відрізка потрапляє в область видимості. Потім розраховуються перетини з однією (або декількома) межами відсікання.[1]

Міститься частина відрізка всередині чи за межами області відсікання, визначається опрацюванням кінців відрізка перетину.

Алгоритм Коена — Сазерленда[ред. | ред. код]

Алгоритм Коена — Сазерленда (названий на честь Дена Коена[en] і Айвена Сазерленда) — це алгоритм відсікання відрізка. Алгоритм ділить двовимірний простір на 9 ділянок, з яких тільки середня ділянка (вікно перегляду) є видимою.

1967 року робота Дена Коена з моделювання польоту привела до розвитку алгоритмів відсікання відрізків для дво- і тривимірної комп'ютерної графіки, створених з Айваном Сазерлендом.

Алгоритм Ляна — Барського[ред. | ред. код]

Алгоритм Ляна — Барського використовує параметричне рівняння відрізків і нерівності, що описують діапазон області відсікання для визначення перетину між відрізком і областю відсікання. За допомогою цих перетинів визначається, яку частину відрізка слід намалювати. Цей алгоритм є значно ефективнішим, ніж алгоритм Коена — Сазерленда, але другий швидше виконує тривіальні прийняття і відкидння, тому його варто використовувати тоді, коли більшість відрізків слід повністю вилучити.

Кірус — Бек[ред. | ред. код]

Дуже схожий на алгоритм відсікання відрізків Ляна — Барського. Різниця полягає в тому, що алгоритм Ляна — Барського є спрощеним різновидом алгоритму Кіруса — Бека, оптимізованим для прямокутного вікна відсікання.

Алгоритм Кіруса — Бека зі складністю O(N), в першу чергу призначений для відсікання відрізків у параметричній формі відносно опуклого многокутника в 2-х вимірах або відносно опуклого многогранника в 3-х вимірах.[2]

Алгоритм Нікола — Лі — Нікола[ред. | ред. код]

Алгоритм Нікола — Лі — Нікола — це алгоритмом швидкого відсікання відрізків, що зменшує ймовірність відсікання одної частини відрізка кілька разів, як це може статися в алгоритмі Коена — Сазерленда. Вікно відсікання розділене на безліч різних областей, в залежності від положення початкової точки відрізка, яку потрібно відсікти.

Алгоритм O(lg N)[ред. | ред. код]

Цей алгоритм класифікує вершини за прямою, заданою в неявному вигляді р: ах + by + с = 0. Оскільки многокутник вважається опуклим і вершини впорядковано за годинниковою стрілкою або проти годинникової стрілки, то можна застосувати двійковий пошук, що приводить до часової складності O(lg N).[3]

Швидке відсікання[ред. | ред. код]

Цей алгоритм схожий з алгоритмом Коена — Сазерленда. Розташування початку і кінця класифікуються за тим, у якій із 9 частин площини вони лежать. Оператор-перемикач спрямовує їх до відповідних обробників. На противагу, алгоритм Коена —Сазерленда, один і той самий випадок може оброблятися кілька разів.[4]

Алгоритм Скали[ред. | ред. код]

Цей алгоритм заснований на однорідних координатах і двоїстості.[5] Його можна використати для відсікання прямої або відрізків прямокутним вікном або опуклим многокутником. Алгоритм заснований на класифікації вершини вікна відсікання відносно півплощини, заданої прямою р: Ax + By + С = 0. Результат класифікації визначає ребра, які перетинає пряма р. Алгоритм простий, легко реалізується і розширюється на опуклі вікна. Пряму або відрізок р можна обчислити за точками x1, x2, заданих однорідними координатами безпосередньо, за допомогою векторного добутку:

p = x1 x x2 = [x1,y1,w1] x [x2,y2,w2] або

p = x1 x x2 = [x1,y1,1] x [x2,y2,1]

Див. також[ред. | ред. код]

Примітки[ред. | ред. код]

  1. Renka, R. J. (19 жовтня 2014). Line Clipping (PDF). Department of Computer Science & Engineering, University of North Texas. Архів оригіналу (PDF) за 17 квітня 2016. Процитовано 10 травня 2017.
  2. Cyrus, M., Beck, J.: Generalized Two and Three Dimensional Clipping, Computers&Graphics, Vol.3, No.1, pp.23-28, 1978
  3. Skala, V.: O(lg N) Line Clipping Algorithm in E2, Computers & Graphics, Pergamon Press, Vol.18, No.4, 1994
  4. Mark S. Sobkow, Paul Pospisil and Yee-Hong Yang. A Fast Two-Dimensional Line Clipping Algorithm via Line Encoding//Computer & Graphics, Vol. 11, No. 4, pp. 459–467, 1987
  5. Skala, V.: A new approach to line and line segment clipping in homogeneous coordinates, The Visual Computer, ISSN 0178-2789, Vol.21, No.11, pp.905-914, Springer Verlag, 2005