Algorytm Sutherlanda-Hodgmana

Z testwiki
Przejdź do nawigacji Przejdź do wyszukiwania

Algorytm Sutherlanda-Hodgmana – analityczny algorytm obcinania, który znajduje część wspólną dwóch wielokątów, przy czym wielokąt obcinający musi być wypukły (wielokąt obcinany może być wypukły lub niewypukły); wielokąty są dane jako ciągi wierzchołków.

Chociaż algorytm najczęściej znajduje zastosowanie właśnie dla przypadków dwuwymiarowych, to łatwo uogólnić go na większą liczbę wymiarów i np. w przestrzeni trójwymiarowej można znaleźć część wspólną dowolnego obiektu z wielościanem. Tutaj zostanie opisany algorytm dla dwóch wymiarów.

Opis metody

Algorytm jest iteracyjny i wykorzystuje strategię dziel i zwyciężaj, tzn. dzieli problem na wiele elementarnych, łatwych do rozwiązania podproblemów. Wykorzystuje fakt, iż wielokąt wypukły można przedstawić jako część wspólną półpłaszczyzn wyznaczanych przez boki tego wielokąta. Znalezienie części wspólnej wielokąta i półpłaszczyzny jest bardzo proste.

W jednym kroku algorytmu znajdowana jest część wspólna wielokąta oraz półpłaszczyzny, a otrzymany w ten sposób wielokąt jest przetwarzany w kroku kolejnym:

  1. W = obcinany wielokąt
  2. Wo = wypukły wielokąt obcinający
  3. dla wszystkich krawędzi Wo wykonuj:
    • L: = wyznacz prostą, na której leży krawędź
    • W: = wyznacz część wspólną wielokąta W i półpłaszczyzny zdefiniowanej przez prostą L
Przykład obcinania litery W (W jak Wikipedia) przez pięciokąt

Po przejrzeniu wszystkich wierzchołków otrzymuje się ciąg wierzchołków wielokąta będącego częścią wspólną W i półpłaszczyzny. Niestety może zdarzyć się tak, że wielokąt zostanie rozdzielony na dwa lub więcej wielokątów i wówczas pojawiają się dodatkowe krawędzie leżące na prostej L. Można je jednak wyeliminować po zakończeniu całego algorytmu.

Pewnym problemem jest określenie po której stronie prostej L znajduje się wnętrze wielokąta obcinającego Wo. Rozwiązanie jest następujące: należy przeglądać wierzchołki Wo kolejno, tzn. (v0,v1),(v1,v2),,(vi,vj),,(vn,v0) i na ich postawie wyznaczać równanie prostej, np. w postaci parametrycznej: vi+t(vjvi). Wówczas jeśli wierzchołki są podawane w kierunku przeciwnym do ruchu wskazówek zegara, to wektory normalne wszystkich prostych wskazują wnętrze wielokąta.

Część wspólna wielokąta i półpłaszczyzny

Najważniejszym elementem algorytmu jest wyznaczanie części wspólnej wielokąta W i półpłaszczyzny. Polega on na przeglądaniu kolejnych wierzchołków (v0,v1),(v1,v2),,(vi,vj),(vn,v0), lecz w jednej iteracji analizowana jest tylko jedna krawędź. Jeśli pierwszy wierzchołek vi zostanie oznaczony przez S, a drugi vj przez N, to:

  1. Jeśli obydwa wierzchołki leżą wewnątrz Wo, wówczas zapamiętywany jest tylko wierzchołek N.
  2. Jeśli obydwa wierzchołki leżą na zewnątrz, wówczas żaden wierzchołek nie jest zapamiętywany.
  3. W przeciwnym razie krawędź W przecina prostą L i należy obliczyć punkt przecięcia (ozn. P) odcinka SN z prostą:
    • jeśli S leży wewnątrz, a N na zewnątrz, to zapamiętywany jest tylko punkt przecięcia P;
    • Jeśli jest odwrotnie (N leży wewnątrz, a S na zewnątrz), to zapamiętywane są dwa punkty: P i N (w tej kolejności).

Zobacz też

Bibliografia