grafik - IfI: Startseite eine 2D−Grafik erzeugen, mit grünen Flächen sowie kurz−gestrichelten...

Preview:

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 = GitterPunkte@8-.3, -.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, 7D8Polygon@88-0.3, -0.3<, 8-0.3, -0.2<, 8-0.2, -0.2<, 8-0.2, -0.3<<D,�33�, Polygon@880.1, 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 = GitterComplex@8-.3, -.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 = Torus@.4, 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, Opacity@.7D, 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@8PointSize@.3D, 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@8GrayLevel@.5D, 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", GrayLevel@0.1D<;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@8Polygon@.5 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@Torus@.3, 10D, 3DShort@t = Torus@.3, 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�,

Polygon@880.666359, -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@GraphicsComplex@88-0.9999997857142857, -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@8Thickness@0.0001D, 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@88Hue@.8D, AbsoluteThickness@2D, curve<,8FaceForm@Hue@0.3DD, ebene@P0, 80, .5, 0<, h0D<,8FaceForm@Hue@.5DD, 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<,8AbsoluteThickness@1.4D, 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

Recommended