Je kunt niet zomaar uitgaan van de volgorde van de boom. Zoals je zelf al zegt gaat het bij die vierkanten goed zolang je EF als root neemt, maar als je EH als root neemt dan krijg je een heel ander resultaat. Bovendien werkt het al helemaal niet zo als de 2 polygonen elkaar snijden.
Overigens zijn de lijnen EF en EH zoals ie in je boom staat overbodig: er zijn namelijk al respectievelijk een AB en een BC, dus nog een keer de ruimte verdelen over die lijnen is nogal nutteloos. De rechterchild van EH moet dan ook gewoon een solid leaf zijn, en EF kan er ook uit.
Je moet het anders aanpakken: jij denkt nog steeds in lijnstukken. Maar dat zijn het niet, het zijn oneindige lijnen. De root van de boom, AB, loopt dan ook tot in het oneindige door, en zo moet je het ook behandelen. Deze oneindige lijn wordt uiteindelijk gevormd tot een of meerdere lijnstukken, en dat hangt dus volledig af van de kinderen van de node.
Even voor de goede orde, je boom zou er zo uit moeten zien:
code:
1
2
3
4
5
6
7
8
9
10
11
| AB
/ \
BC e
/ \
CD \
/ \ \
DA e FG
/ \ / \
s e GH e
/ \
s e |
Zoals ik al zei, je moet alle lijnstukken vinden die solid space van empty space onderscheiden. De makkelijkste manier om deze te vinden is denk ik door langs alle stukjes solid space te gaan. Alle lijnen die dit stukje solid space omsluiten zijn alle parents van de leaf. Dus DA, CD, BC en AB. Als je deze lijnen met elkaar snijdt, dan krijg je weer vierkant ABCD. Ga nu voor elk van de lijnen AB, BC, CD en DA zoeken of er een stukje solid space is dat deze lijn ook als afbakening heeft, maar aan de andere kant ligt. Voor AB, CD en DA vindt je niets, en dit zijn dan automatisch ook lijnstukken die in de uiteindelijke polygoon terecht komen. Aan de andere kant van BC vindt je echter een stukje dat de oorspronkelijke vierkant EFGH was. Nu moet je gaan kijken welk deel van BC ze overlappen. Aangezien E=B en H=C overlappen ze elkaar volledig, en komt lijnstuk BC dus ook niet in de uteindelijke polygoon voor. Maar stel nou dat je EFGH iets naar beneden had verplaatst, dan was er op het stuk BE geen overlapping geweest, en dan zou dat wel een lijnstuk in het resultaat worden.
Doe dit voor elke lijn van elk stukje solid space, tot je ze allemaal gehad hebt. En vervolgens heb je een lijst van lijnstukken, die je dan alleen nog maar aan elkaar hoeft te plakken.
hobbit_be: nu ik er zo over praat is het idd misschien toch meer werk dan gewoon op zoek gaan naar snijpunten zoals je voorstelde. De boom opbouwen is zo gedaan natuurlijk, maar ik had er even niet bij stil gestaan dat de rest, dus wat ik hier net heb uitgelegd, ook nog wat rekenwerk vergt. Maar goed, het is iig een methode die werkt