|
Hallo DMUGs, irgendwie vergesse ich heute immer, eine Kopie an dmug zu schicken, deshalb bekommt Jens das hier jetzt doppelt, genauso wie Ina meine erste Antwort. Sorry. :) Jens-Peer Kuska wrote: > > Hallo Martin, Hi Jens! > 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. > 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.) > 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. Alles was man braucht ist also eine Mathematica-Funktion, die alle nicht-konvexen Polygone in konvexe Polygone zerlegt. (In Tom Wickham-Jones Buch ist so eine Triangulierungs-Routine vorgestellt, die allerdings ein paar Nachteile hat. Und natuerlich ist soetwas relativ langsam.) > > Selbst wenn man das in Mathematica implementiert wird man nicht viel > Freude > daran haben, weil die zahlreichen Tests auf Schnitte (Raytracer > verwenden > BSP- oder OctTrees um die Suche zu Optimieren) in Mathematica zu lange > dauern und man sehr schnell eine Unzahl von Polygonen bekommt. Stimmt. > Deine inTubeQ[] Funktion versucht die "InK"orperQ[]" Funktion > nachzubauen, Genau! :) > 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. Aber fuer einfache Koerper, wie Wuerfel, Tori, Zylinder, Kegel, etc. kann man solche Funktionen vergleichsweise leicht in Mathematica schreiben. (Natuerlich sind diese Funktionen dann nur Annaeherungen an die Funktionen fuer die eigentlich Funktionen fuer Polyeder.) > Schon bei dem Versuch den so erhaltenen K"orper mit einem weiteren > Zylinder > zu schneiden klappt das ganze nicht mehr. Ich bin mir nicht sicher, was du meinst. Jedenfalls sehe ich kein Problem den Koerper mit einem weiteren Zylinder zu schneiden (aber wahrscheinlich reden wir ueber andere Sachen): wuerfel = Show[Graphics3D[Cuboid[{0.001, 0.001, 0.001}, {4.999, 4.999, 4.999}]]]; rinne = ParametricPlot3D[{Cos[t](2.5 + 0.9 Cos[u]), Sin[t](2.5 + 0.9 Cos[u]), 0.9 Sin[u] + 5}, {t, 0, Pi/2}, {u, -Pi, 0}, PlotPoints -> 15]; zylinder = ParametricPlot3D[{2.5 + Cos[t], 2.5 + Sin[t], z}, {t, 0, 2 Pi}, {z, 0, 5}]; gra1 = Show[Graphics3D[{rinne[[1]], wuerfel[[1]], zylinder[[1]]}, PolygonIntersections -> False]]; Show[gra1]; center[pointList_] := Plus @@ pointList/Length[pointList]; distance[p1_, p2_] := Sqrt[(p1 - p2).(p1 - p2)]; normalized[p1_] := p1/Sqrt[p1.p1]; inTubeQ[{x_, y_, z_}] := If[distance[{x, y, z}, 2.5 normalized[{x, y, 0}] + {0, 0, 5}] < 0.89, True, False]; inCylinderQ[{x_, y_, z_}] := If[distance[{x, y, 0}, {2.5, 2.5, 0}] < 0.95, True, False]; gra2 = DeleteCases[ gra1, (Polygon | Line)[ points_, ___] /; (inTubeQ[center[points]] || inCylinderQ[center[points]]), Infinity]; Show[gra2, Boxed -> False]; > 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. :) > > Gruss > Jens > Gruesse und gleich guten Morgen Martin Kraus |