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
|