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

1

08.12.2013, 17:34

Dual Contouring - Mathematik...

Hi,
ich möchte nun, nach meiner Marching Cubes Implementierung, den Dual Contouring Algorithmus umsetzen. Das Prinzip (hier nachgelesen ) habe ich nun soweit verstanden, denke ich, aber nun kommt der Hacken: die mathematischen Kenntnisse die ich dafür brauche besitze ich noch nicht, da ich noch in der 11-ten bin.
Hier ist eine quadratische Fehler Funktion von dieser Seite.
Diese Funktion verstehe ich glaube ich. Ich summiere alle Ergebnisse von ((d-p_i)*N_i), wobei i von 1 bis n geht und p_i das i-te Folgenglied von (der Folge oder Array) p ist, und N_i das selbe, nur für N. Die Summe wird dann quadriert. Hab ich das so richtig verstanden?
Jetzt muss ich diese Funktion nach d auflösen, hab aber keine Ahnung wie das gehen soll. Auf der Seite steht, dass man es mit einer QR-Zerlegung lösen kann, was wohl so aussieht. Damit kann ich aber nichts anfangen. Das rechts vom Gleichheitszeichen ist wohl auch eine Summe, aber was rechts neben dem d steht verstehe ich nicht.

Kann mir bitte jemand helfen und das erklären, damit ich den Algorithmus umsetzen kann? Ist das überhaupt richtig was ich da geschrieben habe?

MfG
MazzMan.
Hi

2

08.12.2013, 19:33

Das ganze ist relativ kompliziert, und der Artikel ziemlich knapp gehalten, aber ich kann mal grob skizzieren, was da passiert:

Die Formel hast du im Grunde richtig gelesen, zumindest was die mathematische Notation angeht. Allerdings geht es nicht um Zahlen, sondern um Vektoren, du bildest also jeweils das Skalarprodukt (was dir den Winkel liefert). Die Intuition ist: "Finde einen Punkt p, so dass die Verbindungslinien möglichst senkrecht auf den Normalen stehen." Weil gerade dann der Übergang besonders weich ist.

Zur Lösung des Problems: Zunächst musst du wissen, was ein lineares Gleichungssystem ist. Dann solltest du verstanden haben, wie man es in der Matrizen schreibweise schreibt. Das müsste eigentlich in der Schule auch irgendwann kommen.

In diesem Fall ist das Gelichungssystem überbestimmt, du hast also mehr Gleichungen als Variablen, was bedeutet, dass es eigentlich gar nicht lösbar ist. Stattdessen suchst du aber nun die Lösung, die "am kleinsten" ist, die, wenn du sie einsetzt, also den kleinsten Gesamtfehler ergibt.
Folgendes hilft vielleicht: https://de.wikipedia.org/wiki/Kleinste-Q…ierungsproblems
Im Grunde ist der ganze Artikel nicht schlecht, ohne Vorwissen wirst du aber nur das wenigste davon verstehen. Wichtig ist die direkt verlinkte Formel: Indem du beide Seiten mit der transponierten Matrix multiplizierst, bekommst du ein neues Gleichungssystem, das nicht mehr überbestimmt ist und sich eindeutig lösen lässt (jedenfalls, wenn du Glück hast). Die Lösung ist dann auch direkt die gesuchte, die im ursprünglichen Gleichungssystem den kleinsten Fehler liefert.

Leider steht aber im Artikel, dass es oft nicht eindeutig lösbar ist und man sich für diesen Fall dann nochmal extra Gedanken machen muss. Oh und nicht zu vergessen: Das Skizze im Artikel zeigt den zweidimensionalen Fall, du musst das ganze natürlich für 3 Dimensionen implementieren.

Auf jeden Fall wirst du eine Bibliothek brauchen, die mit Matrizen umgehen kann. Und zwar vermutlich mit Matrizen beliebiger Größe, eine Standardgrafikbilbiothek die nur 4x4 Matrizen kann wird also vermutlich nicht reichen.

Insgesamt dürfte das eine ziemliche Herausforderung werden. Die Formel die du da siehst ist eigentlich nur ein Teilaspekt des ganzen, um tatsächlich an die Punkte zu kommen, muss man viel mehr rechnen. Diese Art von überbestimmten Gleichungssystemen zu lösen ist zwar etwas, das man durchaus öfters mal tut, wozu es dementsprechend auch viele Ressourcen und Bibliotheken gibt. Aber ohne die Hintergründe komplett verstanden zu haben, dürfte es extrem schwer sein das zu implementieren und anschließend zu debuggen.
Lieber dumm fragen, als dumm bleiben!

3

08.12.2013, 21:10

Danke für diese hilfreiche Antwort :)
Wofür stehen die Matrizen und sind diese 3-Dimensional? Oh man... Wie soll ich das nur schaffen? :S Ich lese schon den ganzen Tag irgendwelche Papiere und Artikel, mein Kopf platzt bald.
Hi

4

08.12.2013, 22:01

Das hier:

§\begin{align} 12\cdot x_{0}+3\cdot x_{1} & =1\\ 5\cdot x_{0}+4\cdot x_{1} & =2\\ 5\cdot x_{0}+6\cdot x_{1} & =3 \end{align}§

kann man auch als Matrix schreiben:

§\begin{pmatrix}12 & 3\\ 5 & 4\\ 5 & 6 \end{pmatrix}\cdot\begin{pmatrix}x_{0}\\ x_{1} \end{pmatrix}=\begin{pmatrix}1\\ 2\\ 3 \end{pmatrix} §

Du hast also für jede Bedingung eine Gleichung und aus denen setzt du deine Matrix zusammen. Wie groß die Matrix am Ende ist, hängt halt davon ab, wie viele Punkte du hast (sagen wir einfach mal §n§) und wie viele Bedingungen du an diese hast (sagen wir §m§). Dann hättest du eine §m \times n§ Matrix.
Ich sehe bei dem Text gerade noch nicht, wie genau man die Punkte verbinden würe - vor allen Dingen in 3D. Da müsste man sich näher mit beschäftigen. Leicht wird es nicht.
Lieber dumm fragen, als dumm bleiben!

5

09.12.2013, 19:56

Danke Jonathan, für deine Hilfe. Das ganze ist noch viel zu Kompliziert für mich. Mein Vater (Physik-Ingenieur) möchte mir dabei nicht helfen und meint ich soll erstmal Vektorrechnung und Matrizenrechnung lernen, sonst werde ich nicht in der Lage sein den Algorithmus umzusetzen. Dann muss ich wohl noch ein paar Jahre warten, bis ich all diese Themen in der Uni richtig lerne. Nochmals danke, Jonathan, für deine Hilfe :)
Hi

Werbeanzeige