Stránky: 1
Zdravim,
v diplomovom projekte potrebujem porovnat obsah dvoch ploch (vacsinou 4-uholnikov). Ide o percentualne vyjadrenie spolocnej plochy vzhladom k jednej z ploch.
Plochy su zakreslene na zaklade ich suradnic, to je vsetko, co o nich viem.
Pre lepsiu ilustraciu prikladam obrazok z Labview, kde tento problem musim implementovat.
Potreboval by som pomoct, bud to pri matematickom rieseni problemu, alebo aspon pri algoritmickom. :) Kazda rada a pomoc vitana. :)
Offline
↑ groover:
Nejlépe je využít vektorového součinu:
Čtyřúhelník vždy rozdělit na dva trojúhelníky, ze dvou stran každého trojúhelníka "vyrobit" dva vektory a spočítat jejich vektorový součin, resp. jeho velikost. Obsah čtyřúhelníka dostaneme, když tyto dvě velikosti pro každý trojúhelník sečteme a vydělíme dvěma.
Offline
Ja teda predpokladam, ze pocitanie obsahu nie je nejaky problem, da sa aj napisat jednoduchy vzorec pre n-uholnik zadany vrcholmi, ale predpokladam, ze ten asi poznas. Problem bude zrejme v tom ako hladat ten prienik, co je vo vseobecnosti pomerne algoritmicky narocna uloha. Tu som nasiel diskusiu okolo toho.
http://stackoverflow.com/questions/2272 … tersection
Je tam aj odkaz na kniznice v Delphi, C++ and C# v ktorej by to uz malo byt predprogramovane uplne vseobecne.
Offline
Nech
su vrcholy n-uholnika znacene proti smeru hodinovych ruciciek, pricom
- ten posledny vrchol je len kvoli jednoduchosti zapisu vzorca. Nech
je lubovolny bod. Potom![kopírovat do textarea $S=\frac{1}{2}\sum_{k=1}^n\left[(x_k-x_0)(y_{k+1}-y_0)-(x_{k+1}-x_0)(y_k-y_0)\right]$](/mathtex/48/4839d757241dfa1b5cd77db7f1caf5b0.gif)
Ak by si ho znacil v smere hodinovych ruciciek, tak dostanes minus obsah.
Ak by mal samoprieseky, tak casi obehnute v smere HR prispievaju zapornym obsahom a casti obehnute proti smeru HR prispievaju kladnym obsahom.
si zvol tak aby sa ti to co najlahsie pocitalo, napr.:
alebo pri
ti vypadne prvy a posledny clen tej sumy, lebo budu nulove.
V skutocnosti je to len aplikacia toho co spominal ↑ martisek: - napisana tak aby sa to lahko programovalo.
Offline
↑ groover:
Pokud jde o ten průnik, je přece daleko jednodušší spočítat součet obsahů těch čtyřúhelníků (jakoby se nepřekrývaly) a od toho odečíst obsah toho překrývajícího se osmiúhelníka.
Offline
Ano, ale ja potrebujem percentualne vyjadrit velkost spolocnej plochy vzhladom k jednemu z tych stvoruholnikov. Tak ci onak, stejne potrebujem obsah toho spolocneho stvoruholniku, takze potrebujem stejne poznat body, kde sa pretinaju jednotlive strany. Alebo sa mylim?
Offline
↑ martisek:
Nevidim dovod preco by malo byt zjednotenie jednoduchsie ako prienik. Ak su zadane dve stvorice bodov tak aky bude algoritmus na ich zjednotenie. Dokonca to ani nemusi byt n-uholnik. Moze sa jednat napriklad o 12-uholnik, ktory ma vyrezany stvoruholnik zvnutra, napr.:

prienik su dva stvoruholniky.
Offline
↑ Brano:
No jo, ale oba jsou nekonvexní, groover je má konvexní. Takže by bylo by třeba upřesnit, zda se má počítat i s nekonvexními...
Offline
Konvexnost je skor argument pre pocitanie prieniku, lebo prienik konvexnych polygonov je konvexny polygon, zatial co zjednotenie konvexnych stvoruholnikov moze byt napr. nekonvexny 16-uholnik. Ale to je v podstate dost jedno. Nejaky vseobecny algoritmus aj na jedno aj na druhe bude podla mna rovnako zlozity, sam som si ho nepozeral, ale nevidim dovod preco by malo byt zjednotenie nejak jednoduchsie.
Ak by sa to robilo napr. cez nerovnice, tak konvexny n-uholnik je prienik rieseni n linearnych nerovnic. Teda prienik dvoch n-uholnikov je riesenie 2n linearnych nerovnic a treba najst ktore z nich su nadbytocne. Zatial co zjednotenie by bolo dost komplikovane a v pripade nekonvexneho zjednotenia nam takyto pristup vobec nepomoze.
Offline
Ak si spravne pamatam definiciu konvexnosti, tak konvexne teleso je take, kde usecka spajajuce lubovolne dva body leziace vo vnutri telesa lezi cela v tomto telese, je to tak? Ak ano, tak telesa budu len konvexne. :) program zatial pocita len so 4-uholnikmi, ale mozu sa tam vynimocne objavit aj nepravidelne 6-uholniky. Predpokladajme ale zatial riesenie len so 4-uholnikmi. :)
Offline
↑ groover:
vskutocnosti sa moc nezjednodusil - to som hovoril od zaciatku
pocitanie obsahov je trivialne
vyjadrenie prieniku je tazke
zatial odporucam skusit si pozriet tu diskusiu na ktoru som dal link. Ja este mozem porozmyslat ako by sa to robilo cez tie nerovnosti ako som pisal, ale kedze netusim ake moznosti ma labview tak tazko povedat.
skus este opisat ako ma vyzerat vsup a ako vystup. predpoklodam, ze program by mal fugovat bez dodatocneho vstupu pouzivatela ako napriklad, ze by klikal na prieniky, alebo nieco podobne...
da sa tam pocitat v cykloch, ako v C++ alebo Basic?
Offline

↑ Brano:
Podľa mňa, keď tam má len konvexné útvary, tak skutočne mu stačí nájsť len body, v ktorých sa hrany útvarov pretínajú. A to by nemalo byť ťažké, proste porovnať každú hranu jedného útvaru s každou hranou druhého útvaru, či obsahuje spoločný bod. No a potom vyšetriť len prípad, keď je jeden útvar vložený do druhého. Ako som tak zbežne sa díval na ten odkaz, tak tam je to preto komplikované, lebo sa nejedná o konvexné útvary.
Offline
↑ JohnPeca18:
jedna vec je najst tie prieniky ako hovoris to si viem predstavit...
dva n-uholniky teda vysetrit
prienikov priamok ci sa nachadzaju na useckach (stranach)
... toto budu urcite vrcholy
potom aj niektore povodne vrcholy mozu byt vrcholmi prieniku ... na to staci overit ktore vrcholy n-uholnika A
sa nachadzaju v B a naopak
ale to co mi naozaj vrta hlavou je to, ze len samotne vrcholy asi nestacia este ich treba usporiadat, aby sme vedeli ktore su susedne (na pouzitie vzorca co som pisal)
ak ma aj toto Labview podchytene, t.j. ze staci zadat sadu vrcholov a vypocita obsah konvexneho n-uholnika bez ohladu na to v akom poradi sa zadaju, tak toto co navrhujes by mohla byt najschodnejsia cesta
↑ groover:
skus pozriet, ci je tam nejaka funkcia co by sa zaoberala konvexnym obalom (angl. convex hull)
Offline
Tak, pekne po poporade. :
1. Vstup a vystup: Na vstupe si vyparsrujem z XML urcitu mnozinu bodov. tie body nie su nahovdne, a kazda stvorica bodov je nejak oznacena a tvori vzdy konvexne teleso. :) A k tejto skupine bodov budem potom hladat inu skupinu bodov, ktora sa plochou zhoduje na vopred stanoveny pocet %. Vystupom bude oznacenie definovaj stvorice bodov, ktora sa plochou zhoduje so zadanou stvoricou na zadany pocet %.
2. Mam moznost overit, ci sa nejaky konkretny bod nachadza mimo, na hrane, alebo vo vnutri definovaneho telesa. funkcia Convex hull tam je. :)
Najskor by som riesil otazku hladania bodov, az potom ich usporiadavanie. :)
Offline
Ved tam mas predprogramovane skoro vsetko :-)
mas tam aj taku funkciu ktora by nasla prienik dvoch useciek? Pretoze to je uz posledna vec ktoru potrebujes
... v skutocnosti nieco take je pravdepodobne sucast zistovania, ci je bod vo vnutri definovaneho polygonu, takze si myslim, ze by to tam malo byt.
Offline

↑ groover:
No a keby si tam nahodou funkciu na hľadanie prienikov dvoch úsečiek nemal tak sa to dá spočítať:
Prvá usečka nech je
, druhá
.
Potom musí platiť

Keď si to rozpíšeš na jednotlivé súradnice, tak vznikne sústava 2 rovníc o dvoch neznámych.
Tu vyriešiš a overíš, či x,y splňujú podmienku.
Konkrétny bod potom dostaneš dosadením za x alebo y do ľavej alebo pravej strany rovnosti.
Ešte ma napadlo, čo keď 2 útvary majú spoločnú hranu, alebo aspoň čiastočne sa na nejakom úseku
hrany zhodujú. Tam treba vziať do úvahy hraničné body prieniku 2 úsečiek. To tiež pôjde určit z tej
rovnice, len bude treba zistiť hraničné hodnoty prieniku riešení sústavy a podmienky na x,y.
Inak poradie vrcholov, asi najjednoduchsie je urobiť na ne convex hull, no keby bola núdza
tak by sa dalo podľa mňa zistit aj z toho v akom poradí ich budeme nachádzať, to by bolo ale potřeba si rozmyslet ale to by taky šlo.
Offline
JohnPeca18 napsal(a):
↑ groover:
Ešte ma napadlo, čo keď 2 útvary majú spoločnú hranu, alebo aspoň čiastočne sa na nejakom úseku
hrany zhodujú. Tam treba vziať do úvahy hraničné body prieniku 2 úsečiek. To tiež pôjde určit z tej
rovnice, len bude treba zistiť hraničné hodnoty prieniku riešení sústavy a podmienky na x,y.
to by mala zachytit ta funkcia co overuje, ci je bod vnutri/na hrane utvaru
v podstate nas zaujimaju len prieniky takych hran co su roznobezne.
Offline
Brano napsal(a):
Ved tam mas predprogramovane skoro vsetko :-)
mas tam aj taku funkciu ktora by nasla prienik dvoch useciek?
No, moznosti su sice siroke, ale akonahle tam nieco nie je, tak si to clovek musi doprogramovat, a to nie je celkom prdel niekedy. :)
Keby tam ta funkcia bola, tak by to bolo super, ale nie je, bohuzial...
Dakujem za rady, idem sa na to hned pozriet. :)
Offline
Stránky: 1