Diskuze: Konvexné štvoruholníky
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Taky by mě zajímalo optimální řešení.
V rychlosti mě napadlo: pokud těch bodů bude N a budou vrcholy konvexního polygonu, pak jejich počet bude N nad 4 (každé 4 body z N tvoří konvexní polygon - čtyřúhelník), což je zároveň maximální možný počet čtyřúhelníků, které ty body mohou tvořit. Třeba to pomůže.
Mimochodem pokud budeš počítat každý čtyřúhelník zvlášť, pak nejoptimálnější metoda bude muset projít v nejhorším případě ~N4/24 čtyřúhelníků
Jozefe, do jaké míry chápeš to své řešení, které jsi někde zřejmě
někde vyčetl?
Ptám se, protože typicky je pak velice těžké optimalizovat algoritmus,
když nerozumíš tomu, o co se snaží, zatímco ty potřebuješ spočítat
něco jiného.
Nevím, jestli má smysl to vysvětlovat, ale postup pro detekci konvexity,
který používáš, má lineární složitost vzhledem k počtu vrcholů, což
je výhodný pro mnohoúhelníky.
Alternativní detekce konvexity může místo vrcholů využívat
úhlopříčky, jenže takový algoritmus má kvadratickou složitost, což se
vyplatí pouze pro čtyřúheník. Et voilá!
Pro konvexní čtyřúhelník musí platit, že se úsečky dané
úhlopříčkami protínají.
Pokud máš vrcholy zadané souřadnicemi, stačí sestavit parametrické
rovnice vektorů a najít jediné řešení, pro které musí být oba parametry
v rozmezí (0, 1) exkluzivně.
To je jen trocha lineární algebry.
Algoritmus:
1/ vezmeš dvojici vrcholů, která určí vektorově zadanou úhlopříčku
2/ vezmeš druhou dvojici vrcholů, která určí vektorově zadanou druhou
úhlopříčku
3/ otestuješ průnik parametrických rovnic, pokud jsou oba parametry z (0, 1),
máš konvexní čtyřúhelník
Budeš mít sice opět 4 vnořené for-cykly, ale stačí ti projet i=[0,
n-3], j=[i+1, n-2], k=[j+1, n-1], l=[k+1, n].
Díky tomu každé 4 body zkontroluješ pouze a právě jednou a odpadne ti
řada kontrol včetně toho nešťastného třídění vrcholů.
Ještě malá poznámka k implementaci.
Pokud budeš procházet cykly tak, jak jsem je popsal, potřebuješ
vyzkoušet ruzné kombinace úhlopříček ve čtyřúhelníku.
Naštěstí jsou takové kombinace jenom 3.
Navíc systém rovnic pro průnik vektorů musí vyjít v rozmezí (0, 1), což
znamená, že ani není potřeba počítat výsledek.
Stačí, aby absolutní hodnota vedlejších determinantů byla menší než
absolutní hodnota hlavního determinantu (a také musí mít stejné
znaménko).
Upravený algoritmus:
1/ pro indexy: i=[0, n-3], j=[i+1, n-2], k=[j+1, n-1], l=[k+1, n]
2/ vezmi 4 vrcholy a sestav z nich 3 dvojice úhlopříček
3/ pro každou dvojici vytvoř parametrizované vektory
4/ spočítej hlavní a vedlejší determinanty Dh, Dv
5/ pokud 0 < Dv/Dh < 1 máš konvexní čtyřúhelník
Vďaka, práve niečo takéto som potreboval. Popis spôsobu akým sa to dá
riešiť, kedže môj je zjavne príliš pomalý.
K tvojej otázke:
Jozefe, do jaké míry chápeš to své řešení, které jsi někde zřejmě někde vyčetl?
Toto riešenie som si celé vymyslel aj napísal sám, takže mu celkom
rozumiem.Bolo to jediné čo ma napadlo na kontrolu konvexnosti, že sú body od
strany 4-uholníka vždy na rovnakej strane- buď naľavo, alebo napravo.Pomocou
analytickej geometrie nie je problém zistiť, v akej pozícii sa vzhľadom na
priamku nachádzajú. Ale jediný spôsob, ktorý som vymyslel, ako
skontrolovať všetky možné kombinácie, ktoré vytvárajú 4-uholník, boli v
sebe vnorené 4 cykly.
Triedenie vrcholov som použil preto, aby bolo ľahšie skontrolovať, či už
daný 4-uholník nemám zapísaný, kedže v takom prípade by boli všetky
rovnaké vrcholy na rovnakých pozíciách.
Zobrazeno 6 zpráv z 6.