2011-09-10 11 views
7

Mam wielokąt wypukły ABCDE ... (może mieć dowolną liczbę punktów). Muszę posortować wszystkie jego wierzchołki, aby żadna z krawędzi nie przecinała się.
przykład:sortowania punktów wielokąta za

A _____ B 
    \ /
    \/
    X 
/\ 
    /___\ 
C  D 

To wielokąt w celu ABCD ma przecinające się krawędzie. jednak w zamówieniu ABDC:

A _____ B 
    | | 
    | | 
    | | 
    | | 
    |___| 
C  D 

Żadna z krawędzi nie przecina się, więc oczekiwane jest ABDC.

Jak mogę to zrobić?

+0

Patrz także: http://stackoverflow.com/q/828905/310574 – Gabe

Odpowiedz

8

Zakładając, że punkty są na wypukłej swojego wielokąta, można użyć następujących:

  1. Odbiór dwóch skrajnych punktów z min i wartości max X (nazwijmy je X min i X max) i narysuj linię między nimi. W przypadku, gdy trzeba kilku punktów o tej samej wartości X w ekstremalnych odebrać X min minimalnej wartości X i Y max o maksymalnej wartości y.
  2. podziału listę punktów na dwa podstrumienie, gdzie liście wszystkich punktów poniżej linii łączącej X min i X max są w jednej liście i wszystkich osób powyżej tej linii są w innym. Obejmują X min z pierwszej listy i X max na sekundę.
  3. Sortuj pierwsza lista w kolejności rosnącej wartości X. Jeśli masz wiele punktów o tej samej wartości X, posortuj je w rosnącej wartości Y. To powinno się zdarzyć tylko w przypadku punktów o tym samym składniku X, co X maks., ponieważ wielokąt jest wypukły.
  4. Sortuj drugą listę w porządku malejącym według wartości X. Ponownie, posortuj malejącą wartość Y w przypadku wielu punktów o tej samej wartości X (co powinno się zdarzyć tylko dla punktów z komponentem X X min.
  5. Dołącz dwie listy razem (nie ma znaczenia, która jest pierwsza .)
+1

FYI:!. nie ma absolutnie żadnej potrzeby, aby korzystać z funkcji trygonometrycznych odwrotne do promieniowego sortowania punktów można po prostu rodzaj na podstawie rzeczywistej wartości (y - y0)/(x-x0) To jest jądro obrazu graham –

+0

@Foo Bah: Dzięki za punkt, który nie był jasny z twojej odpowiedzi. BTW, czy zgodziłeś się na odpowiedź? Jeśli tak, dlaczego dokonałeś edycji? – andand

+0

Edytowałem to, ponieważ chciałem cofnąć moje zeznania, a potem zapomniałem to zrobić. Usunąłem to teraz. –

8

wybrać dwa punkty na wieloboku. środkowy punkt linii będzie zawarty w tym wielokącie. Niech to będzie M.

Następnie posortuj punkty na podstawie kąta bazującego na M (wzdłuż osi X), przełamując degenerację w oparciu o odległość od M. Iteracja w tej kolejności zapewnia, że ​​żadne dwie krawędzie nie będą się przecinały.

+0

genialny pomysł – mr5

Powiązane problemy