Triangle-Data Structure in C#

  • Hi, also ich habe einmal eine Frage an euch Profi-Progger :).

    Ich schreibe gerade ein Programm, welches es erlauben soll die Geometrie von Objekten zu verändern.
    Soweit so gut, allerdings ist es eher stressig immer zu überprüfen, welche Vertices alle zu verschieben sind, wenn man eine Seite eines Quaders selektiert hat, denn ich habe zur Zeit sowas wie "einzelne" Faces. D.H. meine Eckpunkte sind alle öfter als einmal vorhanden.

    Was ich eigentlich gerne hätte (C++ Pointer, wo seid ihr nur, wenn man euch braucht) wäre, einen Vertex nur einmal zu speichern, den aber "mehreren Faces" zuordnen (also nur Pointer/Referenzen zu speichern).

    So schauts jetzt aus:
    Mein Quader-Constructor ruft jetzt eine Methode auf, die die 6 Faces generiert -> eine Vertex-List (fürs rendern) ist dann als Property implementiert und geht einfach beide Triangles aller Quads durch und speichert die Vertices in eine Liste.
    Ich hab jetzt zwar mal eine Idee, aber leider keine Ahnung, ob das auch funktioniert:
    Wäre es jetzt möglich einfach nur 8 Vertices zu generieren die ich dann per "ref" an die Quad-Konstruktoren übergebe?
    Also so, dass dann Quads, die sich einen Vertex teilen (z.B. Vorne, Links und Unten) mit immer dem gleichen Vertex arbeiten (weil ref??)?

    Folge wären dann, dass ich "nur" diesen Vertex verschiebe und daher automatisch alle Triangles richtig upgedatet werden, ohne Löcher entstehen zu lassen...

    Seht euch die Attatchments an, um euch einen Einblick zu verschaffen was ich meine, falls die Beschreibung wirr war :D.

    Ich könnte es natürlich auch einfach probieren, das so einzubauen, aber ich frag mal lieber euch, bevor ich da jetzt alles über den Haufen schmeiße :)

    Lg und thx schonmal!
    Spite

  • Ich bin mir jetzt nicht ganz sicher, ob ich dich richtig verstanden habe, weil ich mit Computergraphik nicht so viel am Hut habe, aaaaber: Im wesentlichen verwendest du bei allen C#-Objekten automatisch Pointer. Wenn ich dich richtig verstanden habe, ist dein Problem nur, dass deine Dreiecke ihre Eck-Koordinaten in unabhängigen Variablen speichern. Dann sollte die Lösung für dein Problem einfach nur eine Klasse Vertex sein, und ein Triangle besitzt halt drei Vertex-Eigenschaften. Wenn du denen dann das selbe Objekt zuweist, greifst du immer auf dasselbe Objekt zu, und voila.

  • Danke vielmals für deine schnelle Antwort - ich hab sowas auch gerade gelesen in einem C# PDF :) Objekte werden immer auf dem Heap gespeichert....
    Sollte mir doooooch mal ein C# Buch kaufen^^

    Also ich werde das einmal versuchen :)

    D.H. ich stelle jetzt um von 6 Faces (mit Vertices Property) auf 8 Vertices mit Faces Property...hm einmal schaun......

    Vertex, Edge, Triangle und Quad hab ich so aufgebaut:

    Vertex (Position, Normale, TexCoord)
    Edge (2 Vertices)
    Triangle (3 Vertices)
    Quad (4 Vertices, 2 Triangles als Property)
    kann man das e so verwenden hoffe ich :)

    Oder wäre es auch möglich sowas zu machen:
    Vertex (Position, Normale(n), TexCoord(s), Edges, Triangles)..... usw.... (also eine Art "Nachbarschaftsinformation")?? Das wäre natürlich extrem hilfreich :) (aber kompliziert?)

    Danke nochmal!
    Spite

  • Du brauchst nicht zwingend die Darstellung von Faces/Properties - also wer jetzt was speichert - ändern, du musst dir nur überlegen, wo du die Information brauchst. Du kannst sie auch doppelt ablegen (wie z.b. für die Nachbarschaftsinformation), dann solltest du dir aber ein System einfallen lassen, wie du das konsistent hältst. Wenn du also dem Vertex jeweils Listen von allen Objekten gibst, die von ihm abhängen, dann solltest du entsprechende Methoden bereitstellen, um diese Objekte zu registrieren und abzufragen, und auf der anderen Seite bei den Edges, Triangles, etc... beim Zuweisen der Vertices eben das Objekt beim Vertex registrieren.

  • Tja, und da wirds eher wieder kompliziert denk ich - wenn jeder Vertex alle Edges und Triangles speichert, jede Edge, 2 Vertices und auch angrenzende Triangles und die Triangles dann eben umgekehrt... werde mir mal das überlegen, wie ich das am Besten angehe :)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!