Konkáv testek offszetelésére ismer valaki publikus algoritmust?
Kicsit hosszú, de jól leírja az algoritmust: [link]
Nem igazán értem mit értesz az alatt hogy hogyan kezelnénk le az eltűnő síkidomokat. Mit akarsz rajtuk lekezelni?
Köszi a linket! Elolvasom.
Hát konvex testeknél előfordulhat, hogy egy felületi régiónak nem lesz offset-elt megfelelője, vagy szétesik több kisebb régióra, vagy az eredmény régió teljesen másképp néz ki. Csak arra voltam kíváncsi, hogy milyen módszerek vannak arra, hogy ez egzakt módon legyen lekezelve.
A mostani elképzelésem szerint solid bool műveletekkel akarom kivitelezni a dolgot, csak elég bonyolult az algoritmus és az érdekelt hogy vannak-e egyszerűbb megoldások.
A numerikus pontatlanságok lekezelése okozza a legtöbb problémát (ugye a véges számábrázolás miatt), mert ha pl. síklapokkal határolt felületű "gömböt" offset-elek, akkor a kis szöget bezáró felületi elemekből generált testek összemetsződéseinél elő tudnak állni problémás helyzetek.
Már az sokat segítene, ha lenne valami 128 bites double osztály, amihez vannak rendes szögfüggvények. C++-ban csinálom amúgy.
Ha jól értem az a problémád hogy több csúcspont is kerülhet ugyan azon helyre offsetelés után, de a double és a float pontatlansága miatt nem ugyan azok lesznek az koordinátáik.
De nem is kell. Nem ismerem az hogy te hogyan adod meg a modelljeid szerkezetét, de azt tudom hogy szokás:
1. Megadod a ponthalmazt,
2. Megadod a háromszögeket a ponthalmaz pontjai alapján.
2 tömböd van minden modellhez. Ez a bemenet, ez lesz a kimenet. Vedd észre hogy halmazokról beszélünk, egy és ugyan azon elemből nincs kettő a halmazban. Az offsetelés után (ha kicsinyítésről van szó) a halmaz mérete csökkenni fog, hiszen pont ez a lényege: azzal hogy a felbontást csökkentjük, megnöveljük a kiszámítás sebességét.
Ez azt jelenti hogy törölni kell pontokat és törölni kell háromszögeket. Pontokat úgy törölsz hogy miután az offseteléssel ráilleszted a rácsra a pontot, ellenőrzöd hogy ott van e már pont: ne felejtsd el, lebegőpontos számot nem == operátorral tesztelsz hanem definiálsz egy epszilon küszöbindexet (és a teljesítmény érdekében nem minden ponttal tesztelsz hanem csak a szomszédos pontokkal ha lehet). Amikor törölsz egy csúcspontot, a csúcspontot használó háromszögeknél átírod a csúcspont hivatkozását az újra, és teszteled hogy a háromszög másik két csúcsa közül az egyik nem véletlenül ugyan az a csúcs. Ha igen, törlöd a háromszöget, hiszen ha 2 csúcsa megegyezik, akkor az már csak egy egyenes.
Így csökkented a pontok és háromszögek halmazát, és közben számolod ki az új pontokat. Csak azt a lépést hagytad ki hogy nem törölted a feleslegessé vált pontokat, háromszögeket, pedig pont ez lenne a lényege.
Ez így van. És? Nem értem a problémád, de szerintem te sem.
A fentebb leírt algoritmus minden síkidomra ráillik, a probléma ugyan az és ugyan úgy kell orvosolni.. Felesleges pontokat törölni, eltűnő háromszögeket törölni. Mert minden sokszögből háromszög lesz egyszer ha elkezded törölgetni a csúcsait. A tárolást meg te oldod meg. Szerintem gondold végig még egyszer.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!