|
> > > CSG Operationen mit Polygonalen K"opern sind ziemlich schwer. > [...] > > Mathematica unterst"utzt keine K"orper oder die Darstellung von > > K"orpern. Es gibt als auch keine M"oglichkeit, > > die Entscheidung ein Punkt, eine Linie oder ein > > Polygon sind innerhalb eines K"orpers zu treffen. > > OpenGL kennt soweit ich weiss auch keine Koerper, in jedem > Fall muss man noch einiges an Arbeit investieren. Nein. Aber nicht-konvexe Polygone. Das Open Geometie B"uchlein kommt mit einer CD, da sind dann die Quelltexte drauf. Der C-Quelltext mit der CSG ist im "ubrigen der l"angste und komplizierteste. Die meisten besseren 3D CAD Programme beherschen solche Operationen. OpenGL 1.2 unterst"utzt Volumentexturen, und das kommt meinem Verst"andnis von K"orpern ziemlich nahe. > > > Da Mathematica nur Konvexe Polygone Darstellen kann bekommt man > > Genauer gesagt: Mathematica stellt nicht-konvexe Polygone, > die in drei Dimensionen eingebettet sind, sehr eigenwillig > dar. (Tom Wickham-Jones gibt in seinem Mathematica Graphics > Buch eine Erklaerung, warum das so gemacht wird.) Nicht eigenwillig - falsch ! > > > zus"atzlichen > > "Arger, denn die Schnittk"oper bestehen nicht nur aus konvexen > > Polygonen. > > Nun ja, so pauschal kann man das wohl nicht sagen, weil jedes > nicht-konvexe Polygon in konvexe Polygone zerlegt werden kann. Ja sicher, das ist aber keine gute Idee. Also bei einem K"orper der aus Polygonen besteht, zeigen alle Normalen der Polygone nach aussen. Beim "imKoerper"-Test muss man testen ob ein Punkt, oder einige Punkte eine Polygons auf der selben Seite der Polygone liegen, die den K"orper bilden. Also f"ur einen K"orper mit M Verticies der gegen einen aus N Polygonen getestet werden soll N * M Vergleiche. Wenn man zu fr"uh damit beginnt die Polygone in Dreiecke zu splitten wird N sehr schnell sehr gross.. > > letztere kann es mit einfachen Mitteln aber in Mathematica nicht geben. > > Ich denke, die Mittel um eine InBodyQ-Funktion fuer > Polyeder zu schreiben sind in jedem Fall die der > Computational Geometry, nur dass eine Implementation > in Mathematica halt langsamer ist als in Compilersprachen. Ich habe ja nicht gesagt es geht nicht. Im Notfall geht es mit einer Turing Maschine :-) > > Die PolygonIntersections-Option > > k"ummert sich auch nur um die Sichtbarkeit, die nichts mit > > der "Innen/Aussen" Entscheidung zu tun hat. > > Nur um die Sichtbarkeit kuemmert sich die RenderAll-Option. > PolygonIntersections kuemmert sich vor allem um sich > schneidende Polygone. (Und Schnitte von Polygonen haben, > glaube ich, schon etwas mit der Innen/Aussen-Entscheidung > zu tun, aber wahrscheinlich hab ich dich jetzt wieder > missverstanden. Naja, ist ja auch schon bald Mitternacht. :) Nein die RenderAll Option schaltet vom Painter zu einem Scanline Algorithmus um, wenn es gilt die Polygone zu zeichnen. Das "Splitten" der Polygone diehnt dazu, sie in eine eindeutige Reihenfolge zu bringen. Nur Polygone die sich nicht durchdringen k"onnen so sortiert werden, das der Painter-Algorithmus die verdeckten Kanten beseitigt, wenn man die Polygone von hinten nach vorn Zeichnet. Das unangenehme beim Painter-Algorithmus ist, dass alle Polygone gezeichnet werden, auch solche die sp"ater verdeckt sind. Das dauert doppelt so lang und macht sch"one grosse PostScript Dateien. Beim Scanline Algoritmus wird von vorn nach hinten (und unten nach oben) gezeichnet und eine Horizontlinie mit berechnet. Liegt ein Polygon unter der Horizontlinie wird es nich gezeichnet da es verdeckt ist. Splitten muss man die Polygone in jedem Fall. PolygonIntersections bestimmt ob man die geteilten Polygone auch im Graphics3D Objekt zur"uck bekommt. Das Teilen der Polygone dient also nur dem Sichtbarkeitstest bz.w. der Sortierung. Ok eine einfaches Beispiel nimm mal die Differenz eines W"urfels Cuboid[{-1,-1,-1},{1,1,1}] und eines Zylinders in der z-Achse, z in [-1,1] Radius 1/2. Das ergibt eigentlich einen durchbohrten W"urfel. Da sich die Fl"achen nicht schneiden b.z.w zusammen fallen passiert beim Sichtbarkeitstest garnichts, aus Ober- und Unterfl"ache des W"urfels wird auch kein Kreis ausgestanzt. Kurz man sieht keine Bohrung sondern nur die Fl"achen des umschliessenden Wurfels. Eine Variante des "inZylinder" Tests klappt auch nicht, da die Eckpunkte der W"urfelf"achen ohnehin ausserhalb des Zylinders liegen. Auch den Durchschnitt (nur der Zylinder) kannst Du mit Deinem Test nicht bilden. Sehen kann man immer nur die Vereinigung der K"orper. Das Problem besteht einfach darin, dass f"ur die Sichtbarkeit immer nur einzelne Polygone miteinader verglichen werden und nicht alle Polygone die zu einem K"orper geh"oren. Es sei noch angemerkt, das Mathematica sehr sehr schlampig mit der Orientierung von Fl"achen umgeht. Da die normale FaceFrom[] nicht zwischen Vorder- und Hinterseite eine Polygons unterscheidet sind z. B. im Polyhedra Paket einige der Polyeder mit Polygonen versehen die falsch orientiert sind (Octahedron[], 6. Polygon). Die Sphere[] aus Graphics`Shapes ist ebenfalls falsch orientiert und eigenlich keine Kugel sondern ein kugelf"ormiges Loch in der Unendlichkeit (das Begrenzungspolygon der Unendlichkeit wird selten gezeichnet). Der Zylinder ist kein Zylinder sondern ein Rohr daf"ur sind aber die W"ande richtig orientiert. Noch schlimmer ist es bei ContourPlot3D[] da werden die Polygone zuf"allig orientiert und nicht entsprechend des Gradienten der skalaren Funktion (es wird auch kein Gradient berechnet). Man bekommt also Fl"achen in denen je nach Lust und Laune mal ein Paar Polygone nach Innen zeigen. Kurz und schlecht: Mathematica's Graphik verwendet keine K"orper und kein Innen und Aussen. Will man damit anfangen muss man erstmal die Fehler in den Standard Paketen beseitigen. Dann kann man daran gehen Polyeder zu definieren die eben *keine* Liste von Polygonen sind sondern das Volumen, welches innerhalb der Oberfl"achenpolygone liegt und die m"oglichst geschlossen sein sollte... Das wir von den K"orper nur ihre Aussenfl"ache sehen liegt daran, dass wir keinen R"ontgeblick haben dennoch ist ein K"oper etwas anderes als ein Haufen Fl"achen. Gruss Jens |