Frage

In meinem Programm habe ich einige Würfel (einfach, xyz Lage, xyz Größe). Ich möchte bo der Lage sein, einen dieser Würfel zu nehmen und ‚subtrahieren‘ ein weiterer Würfel von ihm.

Also meine Frage, was ist eine gute generische Datenstruktur des resultierende 3D-Objekt zu repräsentieren, und welche Art von Algorithmus verwendet, um ein 3D-Volumen von einem anderen zu subtrahieren?

War es hilfreich?

Lösung

Dies ist eine ziemlich allgemeine Frage und hängt davon ab, was Sie über die solide wissen wollen und wie schnell wollen Sie es wissen. Unter der Annahme, dass Sie nur die Mitgliedschaft Tests wollen, könnte dies Arbeit (psuedocode):

class Solid {
    Solid solids = [] // each Solid has a list of solids that  
                      // have been subtracted from it.                      

    abstract method containedInSelf(point) {
        // this will obviously vary from one type of solid to another
    } 

    method contains(point) {
        if !containedInSelf(point) return False;
        else {
            for solid in solids {  // loop over all contained solids
                if solid.contains(point) return False; 
                // point is contained in a solid that has been subtracted from it
            }
            // Now we know that point is contained but not contained in anything
            // that's been subtracted
            return True;
        }
    }

    method subtract(solid) {
        solids.append(solid)
    } 

}
Dies hat den Vorteil von Verbund Subtraktionen möglich ist. Zum Beispiel können Sie festen A aus dem Vollen B und dann festen B aus dem Vollen C subtrahieren und es wird erwartet funktionieren. Zum Beispiel mit drei Kugeln im Ursprung und radius(A) < radius(B) < radius(C) zentrierten, Sie erhalten Punkte, die in A enthalten sind oder in C enthalten, aber nicht B.

Sie können auch zum Beispiel subtrahieren einen zwei Dodekaeder aus einer Kugel und dann das zu einem Würfel subtrahieren. Welches ist natürlich das gleiche wie die Kugel aus einem Würfel Subtrahieren und Addieren von zwei Dodekaedern zurück in.

Andere Tipps

I bezweifeln es eine Standardmethode ist zum Darstellen geometrischer Objekte auf dieser Ebene.

Ich erinnere mich, dass Povray , ein Open-Source-Raytracer, die für die Darstellung von 3D-Szenen eine schöne textuelle Sprache hat, und welche beinhaltet einen vollständigen Satz von geometrischen Operationen (Vereinigung, Schnitt, etc.) „ Constructive Solid Geometry "; es ist recht flexibel, aber ich bezweifle es ist, was für Ihre suchen. Beachten Sie außerdem, dass ein Raytracer hat einige weitere Konzepte zu behandeln, abgesehen von der reinen Geometrie. Texturen, Licht, etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top