Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Jens

Treue Seele

  • »Jens« ist der Autor dieses Themas

Beiträge: 117

Wohnort: Dresden

  • Private Nachricht senden

1

14.08.2003, 14:54

Frage zu SplitNode (Verständnisproblem)

Hi Leute,
irgendwie kann ich nicht mehr klar denken :-)
Obwohl die SplitNode-Funktion zu funktionieren scheint, leuchtet mir nicht mehr ein, warum die Dreiecke des Endknotens nicht gelöscht werden, obwohl es eine Anweisung zum Löschen der eigenen Dreiecks-Liste gibt.

Die Begriffe wurden leicht umbenannt, haben aber die selbe Wirkung.

Quellcode

1
2
3
4
5
6
7
8
9
    // Temporäre Liste wieder freigeben
    SAFE_DELETE_ARRAY(pdwTemp)
    // Diesen Unterknoten rekursiv unterteilen, wenn es sich von der Anzahl der
    // Dreiecke her lohnt.
    if (dwCounter >= 32)
        m_pChilds[i]->SplitNode(pTriangles, iMaxDepth - 1);
}
// Eigene Dreiecksliste löschen
SAFE_DELETE_ARRAY(m_pdwTriangles)


Wenn m_pChilds->SplitNode ausgeführt wird und m_pChils[i] ist ein Endknoten (mit weniger als 32 Dreiecken), kommt doch auch auf diesen Knoten die Anweisung SAFE_DELETE_ARRAY(m_pdwTriangles) zu. Also müßten doch auch die Dreiecke des Endknotens gelöscht werden. Das wäre sicherlich nicht so schön. Aber irgendwie scheint ja die TriBase Funktion SplitNode trotzdem zu funzen.
Ich weiß nicht wieso(?)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

14.08.2003, 15:05

Re: Frage zu SplitNode (Verständnisproblem)

Zitat von »"Jens"«

Wenn m_pChilds->SplitNode ausgeführt wird und m_pChils[i] ist ein Endknoten (mit weniger als 32 Dreiecken), kommt doch auch auf diesen Knoten die Anweisung SAFE_DELETE_ARRAY(m_pdwTriangles) zu. Also müßten doch auch die Dreiecke des Endknotens gelöscht werden. Das wäre sicherlich nicht so schön. Aber irgendwie scheint ja die TriBase Funktion SplitNode trotzdem zu funzen.
Ich weiß nicht wieso(?)

Nein, schau Dir mal die Abbruchbedingung an. Die ist ganz am Anfang der Methode, bevor irgendwas gelöscht wird:

Quellcode

1
2
// Wenn die Tiefe null erreicht hat, wird abgebrochen.
if(iMaxDepth <= 0) return TB_OK;


Du kannst Dir da praktisch noch eine zweite Bedingung vorstellen (ich habe es jetzt auch so umgeändert, damit es klarer ersichtlich ist):

Quellcode

1
2
// Ab 32 Dreiecken abwärts wird ebenfalls nicht mehr weiter unterteilt.
if(pNode->dwNumTriangles <= 32) return TB_OK;

Jens

Treue Seele

  • »Jens« ist der Autor dieses Themas

Beiträge: 117

Wohnort: Dresden

  • Private Nachricht senden

3

14.08.2003, 15:24

okidoki

hhah, OK, stimmt.
Was ist eigentlich, wenn die Tiefe noch nicht auf 0 steht und trotzdem weniger als 32 Dreiecke im aktuellen Endknoten gespeichert wurden?
Werden dann.... mm.

Aber mit der anderen Bedingung, das ist ne gute Idee.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

14.08.2003, 15:44

Re: okidoki

Zitat von »"Jens"«

Was ist eigentlich, wenn die Tiefe noch nicht auf 0 steht und trotzdem weniger als 32 Dreiecke im aktuellen Endknoten gespeichert wurden?

Dann wird auch abgebrochen.

Jens

Treue Seele

  • »Jens« ist der Autor dieses Themas

Beiträge: 117

Wohnort: Dresden

  • Private Nachricht senden

5

14.08.2003, 15:57

geklärt

OK, ich habs jetzt wieder gefangen.
Natürlich, die Childs erhalten ja die Dreiecksliste und die aktuelle (Parent-)Liste wird ja erst mal nur gelöscht.
Wenn m_pChilds->SplitNode(pTriangles, iMaxDepth - 1); aufgerufen wird, werden ja die Dreiecke auf jeden Fall auf die wiederum untergeordneten Childs verteilt. Und diese Childs führen dann irgendwann mal kein Splitnode mehr aus.
Also die doppelte Abfrage nach _MAX_TRIANGLES_PER_NODE_ ist dann eigentlich doch sinnlos, nich.

Werbeanzeige