Upload
vuonghanh
View
215
Download
0
Embed Size (px)
Citation preview
Grafiken
à Einfache Grafiken aus Primitiven erstellen
� Ein Gitter
ClearAll@"Global‘*"DGitterPunkte@P0_, dx_, dy_, nx_Integer, ny_IntegerD :=Table@P0 + 8i*dx, j*dy<, 8i, 0, nx<, 8j, 0, ny<Dg = [email protected], -.3<, .1, .1, 5, 7D;g �� Chop �� MatrixFormi
k
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
K -0.3-0.3
O K -0.3-0.2
O K -0.3-0.1
O K -0.30
O K -0.30.1
O K -0.30.2
O K -0.30.3
O K -0.30.4
O
K -0.2-0.3
O K -0.2-0.2
O K -0.2-0.1
O K -0.20
O K -0.20.1
O K -0.20.2
O K -0.20.3
O K -0.20.4
O
K -0.1-0.3
O K -0.1-0.2
O K -0.1-0.1
O K -0.10
O K -0.10.1
O K -0.10.2
O K -0.10.3
O K -0.10.4
O
K 0-0.3
O K 0-0.2
O K 0-0.1
O K 00O K 0
0.1O K 0
0.2O K 0
0.3O K 0
0.4O
K 0.1-0.3
O K 0.1-0.2
O K 0.1-0.1
O K 0.10
O K 0.10.1
O K 0.10.2
O K 0.10.3
O K 0.10.4
O
K 0.2-0.3
O K 0.2-0.2
O K 0.2-0.1
O K 0.20
O K 0.20.1
O K 0.20.2
O K 0.20.3
O K 0.20.4
O
y
{
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Polygon −Primitiv kann auch mit Liste von Punktlisten als Argument verwendet werden und ist in Mathematica−Code meist in dieser Form anzutreffen. Ist ein Design−Problem.. Besser wäre der Name PolygonList gewesen.
Wir verwenden deshalb nur einfache Polygone.
Gitter@g_D := Module@8d = Dimensions@gD<,Join �� Table@Polygon@8gPi, jT, gPi, j + 1T, gPi + 1, j + 1T, gPi + 1, jT<D,8i, dP1T - 1<, 8j, dP2T - 1<DD
Short@Hg1 = Gitter@gDL, [email protected], -0.3<, 8-0.3, -0.2<, 8-0.2, -0.2<, 8-0.2, -0.3<<D,�33�, [email protected], 0.3<, 80.1, 0.4<, 80.2, 0.4<, 80.2, 0.3<<D<
Daraus eine 2D−Grafik erzeugen, mit grünen Flächen sowie kurz−gestrichelten schwarzen Kanten, gesteuert durch geeignete Grafikprimitive.
grafik.nb 1
Graphics@8FaceForm@LightBlueD, EdgeForm@8Dotted, Black<D, g1<, Axes ® TrueD
-0.3 -0.2 -0.1 0.1 0.2
-0.3
-0.2
-0.1
0.1
0.2
0.3
0.4
Dasselbe als GraphicsComplex −Objekt:
GitterComplex@P0_, dx_, dy_, nx_Integer, ny_IntegerD :=GraphicsComplex@Join �� Table@P0 + 8i*dx, j*dy<, 8i, 0, nx<, 8j, 0, ny<D �� Chop,Join �� Table@Polygon@8Hny + 1L i + j + 1, Hny + 1L i + j + 2,
Hny + 1L Hi + 1L + j + 2, Hny + 1L Hi + 1L + j + 1<D, 8i, 0, nx - 1<, 8j, 0, ny - 1<DD
grafik.nb 2
gc = [email protected], -.3<, .1, .1, 5, 7D;Graphics@8FaceForm@LightBlueD, EdgeForm@BlackD, gc<D
� GitterPlot und ParametricPlot3D
g ist das Gitter der Parameterwerte, f: R2® R3 die darzustellende parametrisierte Fläche. GitterPlot erzeugt wieder ein komplexes Grafikprimitiv vom Typ
Polygon .
Zu beachten ist, dass in unserer Anwendung f einstellig ist und als Argument einen Punkt P Î R2übergeben bekommt.
GitterPlot@f_, g_D := Module@8d = Dimensions@gD<,Join �� Table@Polygon@f �� 8gPi, jT, gPi, j + 1T, gPi + 1, j + 1T, gPi + 1, jT<D,8i, dP1T - 1<, 8j, dP2T - 1<D D
grafik.nb 3
Anwendung : Die Tangentialfläche an die getwistete Kubik It , t2, t3M.
Clear@fDf@8t_, u_<D := 9t + u, t2 + 2 t u, t3 + 3 t2 u=g2 = GitterPlot@f, gD;
Daraus wird mit entsprechenden Direktiven ein Graphics3D −Objekt erzeugt. Hier eins, das in einem dunklen Raum in der Telekomfarbe glüht.
Graphics3D@8Glow@MagentaD, g2<,Lighting -> 8Black<, Boxed -> False, ViewPoint ® 82, 0, 3<D
grafik.nb 4
Und hier dasselbe Bild mit ParametricPlot3D .
ParametricPlot3DA9t + u, t2 + 2 t u, t3 + 3 t2 u=, 8t, -.3, .2<, 8u, -.3, .4<, PlotPoints -> 3,
Mesh -> All, Boxed ® False, Axes -> False, ViewPoint ® 82, 0, 3<, PlotRange ® AllE
grafik.nb 5
In einer Realisierung als GraphicsComplex −Objekt müssen nur die Punkte transformiert werden. Sie brauchen weiter die Funktion GitterComplex aus dem letzten Abschnitt.
GitterComplexPlot@f_, P0_, dx_, dy_, nx_Integer, ny_IntegerD :=With@8gc = GitterComplex@P0, dx, dy, nx, nyD<, GraphicsComplex@f �� gcP1T, gcP2TDD
g3 = GitterComplexPlot@f, 8-.3, -.3<, .1, .1, 5, 7D;Graphics3D@8Glow@YellowD, g3<,Lighting -> 8Black<, Boxed -> False, ViewPoint ® 82, 0, 3<D
grafik.nb 6
grafik.nb 7
� Ein Torus
Ein Torus als GitterPlot.
Clear@tf, s, dDtf@8u_, t_<D := Module@8r = 8Cos@tD, Sin@tD, 0<, b = 80, 0, 1<<,r + s r*Sin@uD + s b*Cos@uDD
d = 20; s = .3;g4 = GitterPlot@tf, GitterPunkte@80, 0<, 2 Pi�d, 2 Pi�d, d, dDD;Graphics3D@g4, Boxed ® False, AspectRatio ® 1D
Und als GraphicsComplex .
grafik.nb 8
torusFunction@8t_, u_<, s_, d_D := Module@8r = 8Cos@tD, Sin@tD, 0<, b = 80, 0, 1<<,r + s r*Sin@uD + s b*Cos@uD �� ND
Torus@s_, d_D :=GitterComplexPlot@torusFunction@ð, s, dD &, 80, 0<, 2 Pi�d, 2 Pi�d, d, dDg5 = [email protected], 5D;Graphics3D@g5, Boxed ® False, AspectRatio ® 1D
à Die Farbsysteme von Mathematica
� Die verschiedenen Farbsysteme
Die Farbsysteme RGB und CMYK entsprechen einander nicht genau. −− Nun doch.
grafik.nb 9
ArrayPlot@88Cyan, CMYKColor@1, 0, 0, 0D<,8Magenta, CMYKColor@0, 1, 0, 0D<, 8Yellow, CMYKColor@0, 0, 1, 0D<<, Mesh ® TrueD
Der Zusammenhang zwischen Hue und RGB:
ArrayPlot@8Table@Hue@iD, 8i, 0, 1, .1<D, Table@Blend@8Red, Yellow, Green, Cyan, Blue, Magenta, Red<, iD, 8i, 0, 1, .1<D<, Mesh ® TrueD
grafik.nb 10
Hue mit dem Sättigungsparameter
ArrayPlot@8Table@Hue@1, iD, 8i, 0, 1, .1<D,Table@Blend@8Red, White<, 1 - iD, 8i, 0, 1, .1<D<D
Hue mit dem Helligkeitsparameter.
ArrayPlot@8Table@Hue@1, 1, iD, 8i, 0, 1, .1<D,Table@Blend@8Red, Black<, 1 - iD, 8i, 0, 1, .1<D<D
Mathematica stellt eine große Menge von Farbpaletten aus den verschiedensten Anwendungsgebieten bereit. Diese können aus der mitgelieferten ColorData −Sammlung über ein Schlüsselwort als ColorDataFunction −Objekt extrahiert werden. Eine solche ColorDataFunction ist eine Funktion aus einem meist als reelles Intervall gegebenen Argumentbereich in ein Farbspektrum spezieller, genauestens ausgewählter ("carefully chosen") RGB−Werte.
c = ColorData@"Rainbow"DArrayPlot@8Table@c@iD, 8i, 0, 1, .01<D<, AspectRatio -> .1D
ColorDataFunctionB80, 1<, F
ColorData@D8Gradients, Indexed, Named, Physical<
ColorData@"Physical"D8BlackBodySpectrum, HypsometricTints, VisibleSpectrum<
ColorData@"VisibleSpectrum"D
ColorDataFunctionB8380, 750<, F
�
grafik.nb 11
Überdeckungen und Transparenz in 2D−Grafiken
Zweidimensionale Flächen überdecken sich, was passiert? Hier ein Beispiel mit teilweiser Durchsichtigkeit.
r1 = Rectangle@8-2, -1<, 82, 1<D;r2 = Rectangle@8-1, -2<, 81, 2<D;g = Graphics@8Green, r1, [email protected], Yellow, r2<D
ColorOutput funktioniert nicht und ist als obsolet markiert, aber der Ersatz ColorFunction ist noch nicht einsatzbereit.Der Punkt muss grau sein und nicht grün (und ist es auch in Version 5.1).
grafik.nb 12
g = Graphics@[email protected], Green, Point@80, 0<D<D
grafik.nb 13
Show@g, ColorOutput ® GrayLevelD
grafik.nb 14
� Farbgebung und Rastergrafiken
gOut = Plot@Sin@xD, 8x, 0, 10<D
2 4 6 8 10
-1.0
-0.5
0.5
1.0
Export@"test.gif", gOutD;gIn = Import@"test.gif"D
ByteCount �� 8gOut, gIn<810032, 321584<
gIn �� HeadGraphics
grafik.nb 15
List �� Head �� gIn
8Raster, Rule, Rule, Rule<
gInPðT & �� 82, 3, 4<8ImageSize ® 8360, 217<, PlotRange ® 880, 360<, 80, 217<<, Background ® None<
Show@gIn, Axes -> TrueD
0 50 100 150 200 250 300 3500
50
100
150
200
r = gInP1T;List �� Head �� r
8List, List, Rule, Rule<
rP1T �� Dimensions8217, 360<
rP2T880, 0<, 8360, 217<<
c = rP4, 2T;c �� ShortRGBColor �� 880., 0., 0., 1.<,�254�, 80., 0., 0., 1.<<Pð1T &
rP1TPRange@5, 9D, Range@7, 12DT �� MatrixFormi
k
jjjjjjjjjjjjjjjjj
251 251 251 251 251 251251 221 48 1 49 221251 251 251 1 251 251251 251 251 1 251 251251 251 251 1 251 251
y
{
zzzzzzzzzzzzzzzzz
grafik.nb 16
r1 = rP1TPRange@5, 25D, Range@1, 55DT;Graphics@Raster@r1�300DD
Graphics@Raster@rP1T, ColorFunction -> HGrayLevel@ð�256D &LDD
gIn = Import@"ExampleData�rose.gif"D
grafik.nb 17
r = gInP1T;Graphics@Raster@rP1T, ColorFunction -> HGrayLevel@ð�256D &LD, Axes -> TrueD
50 100 150 200
50
100
150
à Das Beleuchtungsmodell
� Visualisierung der Standardbeleuchtung
Standard−Lichtquellen auf einer stark spiegelnden Kugel: Ambientes Licht und drei (die Dokumentation behauptet vier) Lichtquellen in den Farben Rot, Grün, Blau, die mit der Kamera starr verbunden sind.
grafik.nb 18
g = Graphics3D@[email protected], Specularity@1, 300D, Sphere@D<D
AbsoluteOptions@g, viewOptions = 8ViewPoint, ViewCenter, ViewVertical<D8ViewPoint ® 81.3, -2.4, 2.<, ViewCenter ® 80.5, 0.5, 0.5<, ViewVertical ® 80., 0., 1.<<
ImageScaled ist angeblich relativ zum ImageSize . Im 2D−Fall ist plausibel, was darunter zu verstehen ist, nicht aber im 3D−Fall.
grafik.nb 19
v = 881, 0<, 80, 1<<;Graphics@Line@ImageScaled �� 8ð, 80.1, 0.1<<D & �� v, Axes -> TrueD
-1.0 -0.5 0.5 1.0
-1.0
-0.5
0.5
1.0
Obwohl ImageScaled ... und sie bewegt sich doch.
grafik.nb 20
v = 881, 0, 0<, 80, 1, 0<, 80, 0, 1<<;Graphics3D@Line@ImageScaled �� 8ð, 80, 0, 0<<D & �� v, Boxed -> FalseD
Früher gab es drei Lichtquellen. Ist auch jetzt noch so im Gegensatz zur Beschreibung im Hilfesystem. Allein ambientes Licht scheint noch eine weitere Portion dabei zu sein. Der eps−Export funktioniert hier nicht richtig − die Spielegeffekte werden falsch dargestellt.
v = 881, 0, 1<, 81, 1, 1<, 80, 1, 1<<;c = 8Red, Green, Blue<;l0 = 8"Ambient", [email protected]<;l = Table@8"Directional", cPiT, ImageScaled �� 8vPiT, 8.5, .5, .5<<<, 8i, 1, 3<D;u = GraphicsGrid@88g, Show@g, Lighting ® lD, Show@g, Lighting ® "Neutral"D<<D
grafik.nb 21
Leider funktioniert der eps−Export dieser Grafik nicht. Deshalb der Umweg über eine jpg−Grafik mit leidlicher Auflösung. Bei größeren Auflösungen hat auch der jpg−Export so seine Probleme.
Export@"test.jpg", u, ImageSize -> 30 860, 25<D
� Probleme mit der Beleuchtung (1)
Obwohl ImageScaled bewegen sich die Lichtreflexe mit der Grafik und sind außerdem an der falschen Stelle.
l = Table@8"Point", cPiT, ImageScaled@vPiTD<, 8i, 1, 3<D;Show@g, Lighting ® l, Axes -> TrueD
-1.0
-0.5
0.0
0.5
1.0
-1.0
-0.5
0.0
0.5
1.0
-1.0
-0.5
0.0
0.5
1.0
Hier werden absolute Koordinaten für die Lichtquellenpunkte verwendet und es sieht gut aus.
grafik.nb 22
l = Table@8"Point", cPiT, vPiT<, 8i, 1, 3<D;Show@g, Lighting ® l, Axes -> TrueD
-1.0
-0.5
0.0
0.5
1.0
-1.0
-0.5
0.0
0.5
1.0
-1.0
-0.5
0.0
0.5
1.0
Mit Spot−Licht ist es nicht viel anders.
grafik.nb 23
l = Table@8"Spot", cPiT, ImageScaled �� 8vPiT, 8.5, .5, .5<<, 50 °<, 8i, 1, 3<D;Show@g, Lighting ® l, Axes -> TrueD
-1.0
-0.5
0.0
0.5
1.0
-1.0
-0.5
0.0
0.5
1.0
-1.0
-0.5
0.0
0.5
1.0
grafik.nb 24
l = Table@8"Spot", cPiT, 8vPiT, 8.5, .5, .5<<, 50 °<, 8i, 1, 3<D;Show@g, Lighting ® l, Axes -> TrueD
-1.0
-0.5
0.0
0.5
1.0
-1.0
-0.5
0.0
0.5
1.0
-1.0
-0.5
0.0
0.5
1.0
� Probleme mit der Beleuchtung (2)
Kurz − mit der Beleuchtung scheint noch vieles im Argen zu liegen. Hier ein kleines Testbeispiel, an welchem die Beleuchtungverhältnisse überschaubar sind: zwei übereinander liegende Quadrate und eine einzige Lichtquelle. Wengistens den Schatten sollte man ja dann sehen.
grafik.nb 25
v = 880, 0, 0<, 80, 1, 0<, 81, 1, 0<, 81, 0, 0<<;g = Graphics3D@[email protected] RotateRight �� vD, Polygon@vD, Scale@Polygon@vD, .3, 8.5, .5, .3<D<D
p1 = 8"Point", White, 81, 1, 1<<;p2 = 8"Point", White, Scaled@81, 1, 1<D<;p3 = 8"Point", White, ImageScaled@81, 1, 1<D<;d1 = 8"Directional", White, 881, 1, 1<, 80, 0, 0<<<;d2 = 8"Directional", White, Scaled �� 881, 1, 1<, 80, 0, 0<<<;d3 = 8"Directional", White, ImageScaled �� 881, 1, 1<, 80, 0, 0<<<;s1 = 8"Spot", White, 881, 1, 1<, 80, 0, 0<<, 40 °<;s2 = 8"Spot", White, Scaled �� 881, 1, 1<, 80, 0, 0<<, 40 °<;s3 = 8"Spot", White, ImageScaled �� 881, 1, 1<, 80, 0, 0<<, 40 °<;Show@g, Lighting -> 8p1<D
And this are the reults with the version of April 20:p1 − no shadow, location plausible, moving with the picturep2 − no shadow, location plausible, moving with the picturep3 − no shadow, location wrong, moving with the pictured1 − no shadow, location plausible, moving with the pictured2 − no shadow, location plausible, moving with the pictured3 − no shadow, location wrong, moving with the pictures1 − small shadow, location plausible, moving with the pictures2 − no shadow, location not plausible, moving with the pictures3 − no shadow, location wrong, moving with the picture
grafik.nb 26
à CutOut (Durchsichtige 3D−Objekte)
� Eine erste Lösung
Wir beginnen mit Grafikobjekten, die aus einfachen Primitiven zusammengesetzt sind. Als Startpunkt verwenden wir unseren weiter oben definierten Torus.
GitterComplex@P0_, dx_, dy_, nx_Integer, ny_IntegerD :=GraphicsComplex@Join �� Table@P0 + 8i*dx, j*dy<, 8i, 0, nx<, 8j, 0, ny<D �� Chop,Polygon@Join �� Table@8Hny + 1L i + j + 1, Hny + 1L i + j + 2,
Hny + 1L Hi + 1L + j + 2, Hny + 1L Hi + 1L + j + 1<, 8i, 0, nx - 1<, 8j, 0, ny - 1<DDDGitterComplexPlot@f_, P0_, dx_, dy_, nx_Integer, ny_IntegerD :=With@8gc = GitterComplex@P0, dx, dy, nx, nyD<, GraphicsComplex@f �� gcP1T, gcP2TDD
torusFunction@8t_, u_<, s_, d_D := Module@8r = 8Cos@tD, Sin@tD, 0<, b = 80, 0, 1<<,r + s r*Sin@uD + s b*Cos@uD �� ND
Torus@s_, d_D := GitterComplexPlot@torusFunction@ð, s, dD &, 80, 0<, 2 Pi�d, 2 Pi�d, d, dD
Ein solches GraphicsComplex −Objekt kann mit Normal in eine Liste einfacher Grafikprimitive transformiert werden. Dabei werden alls Abkürzungen aufgelöst, auch die, dass ein Polygon −Objekt mit einer Liste von Listen von Punkten als Liste von Polygon −Objekten interpretiert wird.
Short@[email protected], 10D, 3DShort@t = [email protected], 10D �� Normal, 7DGraphicsComplex@881., 0., 0.3<, 81.17634, 0., 0.242705<,�117�,80.823664, 0., 0.242705<, 81., 0., 0.3<<, Polygon@881, 2, 13, 12<,�99�<DD
88Polygon@881., 0., 0.3<, 81.17634, 0., 0.242705<,80.951675, 0.691433, 0.242705<, 80.809017, 0.587785, 0.3<<D,�98�,
[email protected], -0.484138, 0.242705<, 80.809017, -0.587785, 0.3<,81., 0., 0.3<, 80.823664, 0., 0.242705<<D<<
grafik.nb 27
torus = Graphics3D@t, Boxed ® FalseD
Ein so normalisierter Torus besteht aus Polygonen mit vier Eckpunkten, woraus das folgende Kommando Polygone mit drei Eckpunkten macht. Damit wird der Torus "durchsichtig".
Clear@p1, p2, p3, p4D;torushohl = torus �.Polygon@8p1_, p2_, p3_, p4_<D ® Polygon@8p1, p2, p3<D
grafik.nb 28
� CutOut − Löcher in Polygone schneiden
Reguläres Polygon über Punkte in der Gaußschen Zahlenebene als Grafikprimitiv konstruieren.
regularPolygon@n_IntegerD �; n > 0 := Polygon@8Re@ðD, Im@ðD, 0< & ��Table@H-1L^H2 i�nL, 8i, n<D �� ND;
regularPolygon@6D;p = Graphics3D@%, Boxed ® False, ViewPoint -> 80, 0, 1<D
cutout@p_List, Α_D :=Module@8l, q<,q = Map@HH1 - ΑL Mean@pD + Α ðL &, pD;l = Thread@8p, RotateLeft@pD, RotateLeft@qD, q<D;Polygon �� lD
grafik.nb 29
torus �. Polygon@x_D ® cutout@x, .66D
CutOut@g_Graphics3D, Α_?H0 < ð < 1 &LD := g �. Polygon@x_D ® cutout@x, ΑDliste = 881, 2, 3<, 84, 5, 6<, 83, 2, 1<<;cutout@liste, 0.5D8Polygon@881, 2, 3<, 84, 5, 6<, 83.33333, 4., 4.66667<, 81.83333, 2.5, 3.16667<<D,Polygon@884, 5, 6<, 83, 2, 1<, 82.83333, 2.5, 2.16667<, 83.33333, 4., 4.66667<<D,Polygon@883, 2, 1<, 81, 2, 3<, 81.83333, 2.5, 3.16667<, 82.83333, 2.5, 2.16667<<D<
grafik.nb 30
q = CutOut@p, 0.5D
Das ist eine sehr simple Version zum Entfernen der Bildkanten, die nur mit einfachen Graphics3D −Objekten funktioniert. Hierzu wird in die Liste a der Grafikprimitive, aus denen das Graphics3D −Objekt aufgebaut ist, an erster Stelle die Grafikdirektive EdgeForm[] eingefügt. Diese bewirkt, dass alle folgenden Grafikprimitive ohne Kanten dargestellt werden.
NoEdges@g_Graphics3DD := g �. Graphics3D@8a__<, b___D -> Graphics3D@8EdgeForm@D, a<, bDtorushohl �� NoEdges
grafik.nb 31
CutOut@torus, .66D
CutOut@torus, .66D �� NoEdges
� CutOut für komplexe Graphics3D−Objekte
In der neuen Grafik von Mathematica haben die Gitterlinien eines 3D−Objekts nichts mehr mit dessen innerer Struktur zu tun, sondern sind erst in einem zweiten Arbeitsschritt als eindimensionale Linienzüge aufgebracht. Demzufolge muss mehr Aufwand getrieben werden, um auch komplexe Grafikobjekte zu "durchlöchern".
grafik.nb 32
Plot3DBSinB3 "##################x2 + y2 F, 8x, -1, 2<, 8y, -1, 2<F
-1
0
1
2-1
0
1
2
-1.0
-0.5
0.0
0.5
1.0
Als erstes entfernen wir alle Linien, denn sie stören nur.
grafik.nb 33
p =
Plot3DBSinB3 "##################x2 + y2 F, 8x, -1, 2<, 8y, -1, 2<, Mesh ® None, Boxed ® False, Axes ® FalseF
Short@p �� InputForm, 5DGraphics3D@[email protected], -0.9999997857142857,-0.8916818429467935<, 8-0.7857141020408163, -0.9999997857142857,-0.6238468378008891<, 8-0.5714284183673468, <<2>><, 8<<3>><, <<1284>>, 8<<3>><,8-0.6249998392857141, 1.8392855229591842, -0.4398768503698975<<, <<2>>D, 8<<5>><D
p ist ein Graphics3D −Objekt. Da CutOut neue Stützpunkte generiert, muss diese kompakte Darstellung durch das Kommando Normal erst aufgelöst werden. Die Grafik wird natürlich genauso dargestellt wie die vorherige in ihrer kompakten Darstellung.
grafik.nb 34
q = p �� Normal
Depth �� 8p, q<811, 12<
ByteCount �� 8p, q<893480, 920944<
Außerdem können Polygon −Objekte nun eine Liste von Optionen haben, was wir beim Anschreiben von cutout und CutOut berücksichtigen müssen. Die modifizierten Versionen haben folgendes Aussehen:
cutout@p_List, Α_, opts___?OptionQD :=Module@8l, q<,q = Map@HH1 - ΑL Mean@pD + Α ðL &, pD;l = Thread@8p, RotateLeft@pD, RotateLeft@qD, q<D;Polygon �� lD
CutOut@g_Graphics3D, Α_?H0 < ð < 1 &LD :=Normal@gD �. Polygon@x_, opts___?OptionQD ® cutout@x, Α, optsD
Nun funktioniert CutOut auch für Plot3D −Ausgaben.
grafik.nb 35
CutOut@q, 0.7D;Show@%, Lighting -> 8Blue<D
Den Polygon −Objekten ist die Grafikdirektive EdgeForm[] vorangestellt, welche das Zeichnen der Kanten der Polygone vermeidet. Dies kann mit dem folgenden Kommando verändert werden. Auf Grund der adaptiven Größe der Triangulierung ist das Bild aber nicht so eindrucksvoll wie bei einer Triangulierung mit konstanter Netzgröße.
grafik.nb 36
CutOut@q, 0.4D �. EdgeForm@D ® EdgeForm@[email protected], Black<D;Show@%, Lighting -> 8Yellow<D
à TubePlot3D − Röhrenkurven programmieren
Einige allgemein nützliche Funktionen.
ClearAll@"Global‘*"DTPlen@x_D :=
"######################################################xP1T2 + xP2T2 + xP3T2 ;
TPnorm@x_D := ������������������������x
TPlen@xD �� Together;
� Erste Lösung: Die "mathematische", d.h. analytische über das begleitende Dreibein und ParametricPlot
Clear@TPDreibeinD;TPDreibein@f_?VectorQ, t_SymbolD :=Module@8h, n, b, u<,h = D@f, tD �� TPnorm; H* Haupttangentenvektor *Lu = D@f, t, tD;n = If@u === 80, 0, 0<,If@hP1T === 0, 80, hP3T, -hP2T<, 8hP2T, -hP1T, 0<D, Hu - Hh . uL hLD;
n = n �� TPnorm; H* Normalenvektor *Lb = h�n �� Together; H* Binormalenvektor *L8h, n, b<D
Message gibt Zwischenergebnisse aus. Das ist zum Debuggen der Funktion ebenso sinnvoll wie zur Demonstration, dass die analytische Lösung hier ungeeignet ist. Solche Zwischenausgaben können wie Systeminformationen mit Off abgeschaltet werden.
grafik.nb 37
Clear@TubePlot3DD;TP::msg1 = "f ist ‘1‘";TP::msg2 = "Begleitendes Dreibein ist ‘1‘";TubePlot3D@f_?VectorQ, r_: 0.1, 8t_Symbol, start_, end_<, opts___?OptionQD :=Module@8h, n, b, u<,Message@TP::msg1, fD;8h, n, b< = TPDreibein@f, tD;Message@TP::msg2, 8h, n, b<D;ParametricPlot3D@Evaluate@f + HSin@uD n + Cos@uD bL rD,8t, start, end<, 8u, 0, 2 Π<,opts, Boxed ® False, Axes ® FalseD
D
Einige Beispiele. Der Aufruf mit u statt t klappt auch, dank der lokal deklarierten Variablen in der Funktionsdefinition von TubePlot3D .
TubePlot3D@8u, 0, 0<, 8u, 0, 1<, Boxed -> TrueDTP::msg1 : f ist 8u, 0, 0<TP::msg2 : Begleitendes Dreibein ist 881, 0, 0<, 80, -1, 0<, 80, 0, -1<<
grafik.nb 38
TubePlot3D@8u, 0, 0<, 8u, 0, 1<, Mesh ® NoneDTP::msg1 : f ist 8u, 0, 0<TP::msg2 : Begleitendes Dreibein ist 881, 0, 0<, 80, -1, 0<, 80, 0, -1<<
Off@TP::msg1D; Off@TP::msg2D;TubePlot3D@8t, 0, 0<, 0.5 + 0.3 Cos@tD, 8t, 0, 4 Π<D
grafik.nb 39
TubePlot3D@8Sin@tD, Cos@tD, 0<, 0.5, 8t, 0, 2 Π<, PlotPoints ® 2D
TubePlot3D@8Sin@tD, Cos@tD, 0<, 0.5, 8t, 0, 2 Π<, PlotPoints ® 50D
An Wendepunkten der Mittenkurve treten Probleme auf, weil dann in den Koordinatenberechnungen des Dreibeins Ausdrücke der Form ����0
0 entstehen.
Deshalb eine Lücke in der Grafik. Mit Mesh ® All oder Mesh ® None ist alles okay, weil dazu kein extra Netz auf die Figur aufgebracht wird.
grafik.nb 40
TubePlot3D@8t, Sin@tD, 0<, 0.5, 8t, 0, 2 Π<, Mesh ® AllD
Und hier etwas Code zum Studium des Verhaltens an der Unregelmäßigkeitsstelle.
grafik.nb 41
u = .05;TubePlot3D@8t, Sin@tD, 0<, .3, 8t, Π - u, Π + u<, Mesh ® AllD
� Zweite Lösung: Die "numerische", welche die Fläche unmittelbar aus Grafikprimitiven erzeugt
TPproject@n_?VectorQ, h_?VectorQD := TPnorm@n - Hh.nL�Hh.hL hD;
Und hier die Definition von TubePlot3D :
grafik.nb 42
Clear@TubePlot3DD;TubePlot3D@func_?VectorQ, radiusfunc_: 0.1,
8var_Symbol, start_, end_<, opts___?OptionQD :=
ModuleB8f, r, pList, hvList, nvList, bvList, rList, pts, u, delta, plotpts, nt, nr<,plotpts = PlotPoints �. 8opts< �. PlotPoints ® 815, 15<;
Switch@plotpts,_List, 8nt, nr< = plotptsP81, 2<T,_, nt = nr = plotptsD;
delta = NB ������������������������������end - start
ntF;
f@t_D := Hfunc �. var ® tL;r@t_D := Hradiusfunc �. var ® tL;pList = Table@f@iD, 8i, start, end, delta<D;hvList = TableBTPnormBfBi + ���������������
delta
100F - fBi - ���������������
delta
100FF,
8i, start, end, delta<F;rList = Table@r@iD, 8i, start, end, delta<D;H* Normalen- und Binormalenvektoren *Lu = 81., 1., 1.<;nvList = Map@Set@u, TPproject@u, ðDD &, hvListD;bvList = MapThread@TPnorm@Cross@ð1, ð2DD &, 8hvList, nvList<D;pts = MapThreadB
TableBð1 + ð2 HSin@uD ð3 + Cos@uD ð4L, :u, 0., 2 Π, ��������2 Π
nr>F &,
8pList, rList, nvList, bvList<F;Graphics3D@Prepend@Table@
With@8v = Join �� ptsP8i, i + 1<, 8j, j + 1<T<,8Polygon@vP81, 2, 3<TD, Polygon@vP82, 3, 4<TD<D,8i, nt<, 8j, nr<D, EdgeForm@DD,DeleteCases@8opts<, PlotPoints ® _D, Boxed ® FalseDF;
H* Ende der Definition von TubePlot3D *L
grafik.nb 43
� TubePlot3D anwenden
Clear@uDp1 = TubePlot3D@8u, 0, 0<, 8u, 0, 1<D
Durch das Einfügen von EdgeForm[] in die obige Definition werden die Polygone ohne Rand gezeichnet. Mit folgenden Kommandos kann der Rand nachträglich sichtbar gemacht oder auch wieder versteckt werden.
ShowEdges@g_Graphics3DD := g �. EdgeForm@D -> EdgeForm@Thickness@TinyDDNoEdges@g_Graphics3DD := g �. EdgeForm@_D -> EdgeForm@Dp1 �� ShowEdges
grafik.nb 44
p2 = TubePlot3D@8t, Sin@tD, 0<, 0.5, 8t, 0, 2 Π<D �� ShowEdges
p3 = TubePlot3D@8t, 0, 0<, 0.5 + 0.3 Cos@tD, 8t, 0, 4 Π<D �� ShowEdges
grafik.nb 45
p4 = TubePlot3D@8Sin@tD, Cos@tD, 0<, 0.5, 8t, 0, 2 Π<, PlotPoints ® 840, 6<D �� ShowEdges
p5 = TubePlot3D@8Sin@tD, Cos@tD, 0<, 0.5, 8t, 0, 2 Π<, PlotPoints ® 86, 40<D �� ShowEdges
grafik.nb 46
p6 =TubePlot3D@8Sin@tD, Cos@tD, t�10<, 0.5, 8t, 0, 3 Π<, PlotPoints ® 850, 12<D �� ShowEdges
GraphicsGrid@8NoEdges �� 8p1, p2, p3<, NoEdges �� 8p4, p5, p6<<D
grafik.nb 47
TubePlot3DB:ikjj3 + ���t
2
y{zz Sin@tD, -
ikjj3 + ���
t
2
y{zz Cos@tD, 0>, ������������
1 + t
10, 8t, 0, 4 Π<, PlotPoints ® 830, 12<F
� Titelbild
Auch das Titelbild des Buches wurde mit TubePlot3D erstellt. Hier zunächst die Einzelteile, aus denen der Knoten zusammengesetzt wurde. In der Designphase arbeiten wir mit geringer Auflösung. Wenn alles zu unserer Zufriedenheit ausgefallen ist, werden alle Rechnungen noch einmal mit hoher Auflösung ausgeführt und das endgültige Bild erzeugt. Dazu speichern wir die Auflösung in einer Variablen res , deren Wert über die Option PlotPoints die Auflösung steuert.
f1 = :ikjj1 + ����
t
Π
y{zz Sin@tD, ik
jj1 + ����t
Π
y{zz Cos@tD, 0>;
f2 = :.8 +ikjj1 + ����
t
Π
y{zz Sin@tD, 0, ik
jj1 + ����t
Π
y{zz Cos@tD>;
f3 = :0, 1 +ikjj1 + ����
t
Π
y{zz Sin@tD, 1 +
ikjj1 + ����
t
Π
y{zz Cos@tD>;
res = 820, 15<;p1 = TubePlot3D@f1, .3, 8t, -0.5 Π, 5.2 Π<, PlotPoints ® resD;p2 = TubePlot3D@f2, .3, 8t, -.2 Π, 5.3 Π<, PlotPoints ® resD;p3 = TubePlot3D@f3, .3, 8t, Π �2, 5.7 Π<, PlotPoints ® resD;
Der Knoten ohne Farben. Die Färbung kommt ausschließlich durch die Standardlichtquellen zustande.
grafik.nb 48
Show@8p1, p2, p3<, ViewAngle -> 30 °, Boxed -> True, Axes -> TrueD
-5
0
5
-5
0
5
-5
0
5
Der Knoten mit Eigenfarben.
p1a = p1 �. EdgeForm@D ® Directive@EdgeForm@D, RedD;p2a = p2 �. EdgeForm@D ® Directive@EdgeForm@D, YellowD;p3a = p3 �. EdgeForm@D ® Directive@EdgeForm@D, GreenD;
grafik.nb 49
Show@8p1a, p2a, p3a<, Lighting -> "Neutral", ViewAngle -> 30 °, Boxed -> True, Axes -> TrueD
-5
0
5
-5
0
5
-5
0
5
Mit der aktuellen Version von Mathematica lässt sich das Titelbild des Buches leider nciht erzeugen, weil Schattenwurf generell nicht berücksichtigt wird. Nicht einmal, wenn drei Seitenwände explizit eingezogen werden.
u = 7 881, 1, 1<, 81, 1, -1<, 81, -1, -1<, 81, -1, 1<, 81, 1, 1<<;box = 8Polygon@-uD, Polygon@-RotateLeft �� uD, Polygon@RotateRight �� uD<;gbox = Graphics3D@boxD;sbox = Graphics3D@8Specularity@1D, box<D;
grafik.nb 50
g1 = Show@8gbox, p1a, p2a, p3a<, Lighting -> "Neutral", Boxed -> FalseD
Das mit dem Spotlicht funktioniert bestens, wenn man einmal davon absieht, dass der runde Lichtkegel geradlinig begrenzte Hell−Dunkel−Bereiche auf den Seitenwänden erzeugt.
grafik.nb 51
l = 88"Spot", White, 812 81, -1, 1<, 80, 0, 0<<, 20 °<<;g2 = Show@8gbox, p1a, p2a, p3a<, Lighting -> l, Boxed -> FalseD
Auch bei einer punktförmigen Lichtquelle sieht das Bild nicht anders aus. Die diffusen Schatten auf den Seitenwänden stammen nicht von unserem Knoten, sondern sind Reflexe der Lichtquelle selbst, wie ein Bild ohne den Knoten zeigt.
grafik.nb 52
l = 88"Point", White, 10 81, -1, 1<<<;g3 = Show@8gbox, p1a, p2a, p3a<, Lighting -> l, Boxed -> FalseD
grafik.nb 53
g4 = Show@8gbox<, Lighting -> l, Boxed -> FalseD
GraphicsGrid@88g1, g2<, 8g3, g4<<D
Das beste, was man derzeit erreichen kann, ist also das folgende Bild.
res = 8150, 25<;p1 = TubePlot3D@f1, .3, 8t, -0.5 Π, 5.2 Π<, PlotPoints ® resD;p2 = TubePlot3D@f2, .3, 8t, -.2 Π, 5.3 Π<, PlotPoints ® resD;p3 = TubePlot3D@f3, .3, 8t, Π �2, 5.7 Π<, PlotPoints ® resD;p1a = p1 �. EdgeForm@D ® Directive@EdgeForm@D, RedD;p2a = p2 �. EdgeForm@D ® Directive@EdgeForm@D, YellowD;p3a = p3 �. EdgeForm@D ® Directive@EdgeForm@D, GreenD;l = 88"Point", White, 10 81, -1, 1<<<;p = Show@8p1a, p2a, p3a<, Lighting -> l, ViewAngle -> 20 °Dp = Show@8p1a, p2a, p3a<, Lighting -> "Neutral", ViewAngle -> 20 °Dp �� ByteCount7076544
grafik.nb 54
Export in eine gif−Datei mit (standardmäßig) 360x360 Pixeln.
Export@"cover.gif", pDExport@"cover.eps", pD
Und das war das alte Kommando; eine gif−Datei mit 3000x3000 Pixeln
Export@"cover1.gif", p, ImageSize ® 83000, 3000<D;
� TubePlot3D und CutOut
ShowEdges@g_Graphics3DD := g �. EdgeForm@D -> EdgeForm@Thickness@TinyDDNoEdges@g_Graphics3DD := g �. EdgeForm@_D -> EdgeForm@D
p = TubePlot3DB: ����������t3�2
5, -3 Cos@tD, 3 Sin@tD>,
���t
8, 8t, 0.1, 8 Π<, PlotPoints ® 840, 5<F �� ShowEdges
p = TubePlot3DB: ����������t1.5
5, -3 Cos@tD, 3 Sin@tD>, ���
t
8, 8t, 0.1, 8 Π<, PlotPoints ® 880, 20<F;
grafik.nb 55
l = 88Red, ImageScaled@81, 0, 1<D<, 8Yellow, ImageScaled@81, 1, 1<D<<;q = Show@p, Lighting ® lD
Das folgende Kommando braucht die Definition von CutOut für komplexe Grafikobjekte aus dem Abschnitt "CutOut" dieses Notebooks.
cutout@p_List, Α_, opts___?OptionQD :=Module@8l, q<,q = Map@HH1 - ΑL Mean@pD + Α ðL &, pD;l = Thread@8p, RotateLeft@pD, RotateLeft@qD, q<D;Polygon �� lD
CutOut@g_Graphics3D, Α_?H0 < ð < 1 &LD :=Normal@gD �. Polygon@x_, opts___?OptionQD ® cutout@x, Α, optsD
grafik.nb 56
CutOut@q, 0.66D
à Weitere Illustrationen
ClearAll@"Global‘*"DTPlen@x_D :=
"######################################################xP1T2 + xP2T2 + xP3T2 ;
TPnorm@x_D := ������������������������x
TPlen@xD �� Together;TPproject@n_?VectorQ, h_?VectorQD := TPnorm@n - Hh.nL�Hh.hL hD;
� Einige Funktionen
Ebene durch P mit Normalenvektor h. Q dient der Ausrichtung des Bildes.
ebene@P_, Q_, h_D := Module@8n, b<,n = Q - P;n = n - Hh.nL�Hh.hL h;b = h�n;Polygon@P + ð & �� 8n, b, -n, -b<DDnormale@h_D :=
-If@hP2T === 0., 8hP3T, 0, -hP1T<, 80, hP3T, -hP2T<D �� TPnorm
Pfeil von P0 nach P1. a1 bestimmt die Länge, a2 die Dicke der Pfeilspitze.
grafik.nb 57
pfeil@P0_, P1_, a1_, a2_D := Module@8v, n, b, Q, u<,v = P1 - P0;Q = a1 P0 + H1 - a1L P1;n = normale@vD; b = v�n �� TPnorm;b = Table@Q + a2 HSin@uD n + Cos@uD bL, 8u, 0, 2 Π, Π �12<D;Append@Polygon �� Append@Append@ð, P1D & �� Thread@8b, RotateLeft@bD<D, bD, Line@8P0, P1<DDD
� Und nun die Bilder
mk@t_D := 8t, 0, Sin@tD<; H* Mittenkurve *Lcurve = Line@Table@mk@tD, 8t, 0.6, 4.2, .1<DD;t0 = 1.; t1 = 3.;P0 = mk@t0D; h0 = mk’@t0D �� TPnorm; n0 = normale@h0D; b0 = h0�n0;P1 = mk@t1D; h1 = mk’@t1D �� TPnorm; n1 = TPproject@n0, h1D;Graphics3D@[email protected], AbsoluteThickness@2D, curve<,8FaceForm@[email protected], ebene@P0, 80, .5, 0<, h0D<,8FaceForm@[email protected], ebene@P1, 82., .3, 2<, h1D<,8AbsoluteThickness@1D, pfeil@P0, P0 + h0, .3, .05D<,8AbsoluteThickness@1D, pfeil@P0, P0 + n0, .3, .05D<,8AbsoluteThickness@1D, pfeil@P1, P1 + h1, .3, .05D<,[email protected], pfeil@P1, P1 + n1, .3, .05D<,Text@"P0", P0 + 8-.5, .1, .1<D,Text@"P1", P1 + 80, .2, .1<D,Text@"n0", P0 + 8.3, -1.3, .3<D,Text@"h0", P0 + 8.7, .3, .3<D,Text@"n1", P1 + 8-.2, -1.2, .3<D,Text@"h1", P1 + 81.1, -1., 1.4<D<, Boxed ® False, ViewPoint -> 8-1., 4., -6.<,TextStyle ® 8FontSize ® 18<, Lighting ® 8RGBColor@0, 1, 1D<D
P0
P1
n0
h0
n1
h1
grafik.nb 58
P0 = 80, 0, 0<; h = -80, 0, 1.<; n = 83., 1., 7.< �� TPnorm;p = n - Hh.nL�Hh.hL h; p0 = p �� TPnorm;g = Graphics3D@8RGBColor@0., 0., 0.D,8FaceForm@OrangeD, ebene@P0, 81, 1, 1<, hD<,8AbsoluteThickness@1D, pfeil@P0, P0 + h, .2, .03D<,8AbsoluteThickness@1D, pfeil@P0, P0 + n, .2, .03D<,8AbsoluteThickness@1D, pfeil@P0, P0 + p, .3, .03D<,8AbsoluteThickness@1D, pfeil@P0, P0 + p0, .2, .03D<,8AbsoluteDashing@85, 5<D, AbsoluteThickness@1D, Line@8n, p<D<,Text@"h", h + 8-.1, .1, .1<D,Text@"n", n + 8-.1, .1, 0<D,Text@"p", p - 80, .1, .1<D,Text@"p0", p0 - 8.1, .1, .1<D<, Boxed -> False, ViewPoint -> 81., -12., 6.<, Lighting ® 8White<D
h
n
pp0
grafik.nb 59