Renderings Algoritme

Tags:    abstrakt algortime rendering

Hey Allesammen!

Jeg er i gang med et projekt og er nu nået til et punkt hvor rendering er begyndt at spille en rolle. Projektet er skrevet i JavaScript, men det burde ikke have nogen videre relevans.

Jeg sidder og overvejer den "bedste" renderings strategi. Jeg har et "træ-object" som indeholder alle renderings-objekter hierarkisk, problemet ligger i hvordan jeg skal placere objekterne i forhold til hinanden. Selve placeringen er faktisk måske ikke det vigtigste, men nærmere den "mest rigtige" måde at bygge renderings funktionen op.

Lige nu har jeg et renderings/kontekst object, der indeholder funktionalitet til at kunne tegne på renderingsfladen. Dette objekt starter det øverste elements renderingsfunktion, som herefter rekursivt kalder sine nodes, som kalder sine nodes osv.

Problemet i denne tilgang ligger i at en node skal kende sin præcise position og herefter tegne sig selv på fladen, og jeg finder det "forkert" at en node skal kende sin præcise position, og mere logisk at den bare tegner sig selv i relative koordinater som parent så kan oversætte til absolutte værdier.

Jeg ville rigtig gerne have en sådan løsning, men kan umiddelbart ikke finde ud af hvordan det i så fald skulle opbygges. Håber derfor I kunne hjælpe mig!

Alle foreslag, også alternative er yderst velkomne, da jeg har meget begrænset erfaring med "rendering/tegning" af hierarkier.

PS: Jeg undskylder på forhånd hvis ovenstående tekst, er blevet indviklet eller kludret, men problemet krøller min formulering.



6 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 8 karma
Sorter efter stemmer Sorter efter dato
Jeg synes du bør kalde dem rekursivt som node.render(). F.eks. har du et hus-node. Under den der er der en dør-node, et vindue-node osv.. På den måde sikrer du at huset bliver tegnet helt før noget andet tegnes og undergår dermed at forskellige del af nodes laver rod med hinanden. Hus-noden har ansvaret for at have sin børn i den rigtige rækkefølge. F.eks. tegnes mur-noden før døren og vinduet. Døren kan sørge for at dens baggrund tegnes før håndtaget osv..

At have det i renderen er for meget den skal holde styr på. Hver gang du laver en ny slags node skal du sørge for renderen har den indsat i den rigtige rækkefølge. At renderen skal vide alt dette lægger for meget ansvar på en klasse. Den skal bare have at vide hvilke top-nodes f.eks. hus, have, flagstand, den skal tegne.

På denne måde kan du også tegne en dør-node uden en bestemt hus-node hvis du skulle få brug for det eller bruge den samme dør-node til forskellige huse.



Indlæg senest redigeret d. 31.08.2011 00:08 af Bruger #14645
Rækkefølgen er jo i princippet ligegyldig hvis alle nodes selv ved hvor de står i XY og Z.

Jeg ville nok lave en generel rendering(positionering mm) til et central objekt. Hver node skal i princippet kun vide hvordan den node ser ud. Data mæssigt er det noget helt andet. Men udseende mæssigt er enhver node i princippet nok ligeglad med hvad der er af childs og hvordan de ser ud.

F.eks hvis du flytter på en node med musen, og dette skaber et eventkald, så giver det minder mening at eventkaldet sker på childs og ancestors til den node du har flyttet. Da vil hver child og ancestor igen skulle lave et eventkald for at opdatere deres info, og skaber det så et nyt eventkald til den første node du flyttede?
Jeg synes det giver mere mening at lade et centralt objekt stå for at positionere noderne.

Giver det mening?! :)



Opbygning nu:
Fold kodeboks ind/udKode 


Umiddelbart ønsket opbygning:
Fold kodeboks ind/udKode 


(Undskyld hvis det er uklart ;) )



Tror desværre ikke at man kan oprette sine egne koordinatsystemer i JavaScript, hvertfald ikke i browseren, selvom det kunne være meget brugbart. Du kan overføre dog de nødvendige informationerne med ned gennem hierakiet. Pseudo-javascript:
Fold kodeboks ind/udJScript kode 





Umiddelbart hvis det er et rigtigt træ bliver du vel nød til først at udregne bredden af børnene for at placere forældren i midten.

Uden jeg lige har testet det burde du kunne placere en node ligeså snart du udregner dens placering.

Placeringen er afhængig af børnenes bredde og tidligere placeret familie grene.



Ja, jeg har derefter udstyret et hvert objekt der gerne vil renderes med en "getBoundingBox", funktion. Problemet ligger ikke rigtigt i hvordan jeg placerer dem, det er som du siger "bare" at udregne dens placering, men nærmere "hvordan" de skal tegnes. Altså i hvilken rækkefølge osv.
Skal de hver have en render() funktion, eller skal jeg have én stor render funktion i mit render objekt? Skal "node.render()", også tegne nodens children, osv?

Det jeg søger er en tilgang til rendering, en måde at bygge hele det visuelle op på.



t