Zum Inhalt springen

Datei:Hyperboloid ruled surface animation v2.gif

Aus MOOCsWiki Staging
Originaldatei (370 × 470 Pixel, Dateigröße: 9,87 MB, MIME-Typ: image/gif, Endlosschleife, 181 Bilder, 16 s)
Hinweis: Aufgrund technischer Beschränkungen werden Vorschaubilder hochauflösender GIF-Dateien wie dieser nicht animiert.

Diese Datei stammt aus Wikimedia Commons und kann von anderen Projekten verwendet werden. Die Beschreibung von deren Dateibeschreibungsseite wird unten angezeigt.

Beschreibung

 Dieses Diagramm wurde mit Mathematica erstellt.
Beschreibung
English: An illustration of the the generation of a hyperboloid of revolution as the surface of revolution of a slanted line, also featuring all possible angles at which the line can be slanted to create a unique hyperboloid (thus including its two degenerate forms - a cone and an open cylinder).

This is the second version - the code has been cleaned up slightly and is now parallelized, and the bottom grid markings in the circle now spin as the slant changes as inspired by File:Cylinder - hyperboloid - cone.gif.

This may not necessarily be superior to the first version - the motion of the circle grid markings might distract from the change in the line's slant.
Datum
Quelle Eigenes Werk
Urheber Lemondoge
Andere Versionen
Quelltext
InfoField

Mathematica code

(* config *)
frames = 60;  (*frame count for first generation loop *)
offset = -Pi + 0.8; (* ensure favorable "alignment" *)
(* From the Mathematica stack exchange: 
https://mathematica.stackexchange.com/a/10958/89865; 
function by user Sjoerd C. de Vries; CC BY-SA 4.0 *)
splineCircle[m_List, r_, angles_List : {0, 2 \[Pi]}] := 
 Module[{seg, \[Phi], start, end, pts, w, k}, {start, end} = 
    Mod[angles // N, 2 \[Pi]];
   If[end <= start, end += 2 \[Pi]];
   seg = Quotient[end - start // N, \[Pi]/2];
   \[Phi] = Mod[end - start // N, \[Pi]/2];
   If[seg == 4, seg = 3; \[Phi] = \[Pi]/2];
   pts = 
    r RotationMatrix[start] . # & /@ 
     Join[Take[{{1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 
         0}, {-1, -1}, {0, -1}}, 2 seg + 1], 
      RotationMatrix[seg \[Pi]/2] . # & /@ {{1, 
         Tan[\[Phi]/2]}, {Cos[\[Phi]], Sin[\[Phi]]}}];
   If[Length[m] == 2, pts = m + # & /@ pts, 
    pts = m + # & /@ 
      Transpose[
       Append[Transpose[pts], ConstantArray[0, Length[pts]]]]];
   w = Join[
     Take[{1, 1/Sqrt[2], 1, 1/Sqrt[2], 1, 1/Sqrt[2], 1}, 
      2 seg + 1], {Cos[\[Phi]/2], 1}];
   k = Join[{0, 0, 0}, Riffle[#, #] &@Range[seg + 1], {seg + 1}];
   BSplineCurve[pts, SplineDegree -> 2, SplineKnots -> k, 
    SplineWeights -> w]] /; Length[m] == 2 || Length[m] == 3

k[a_, b_, t_] := a + (b - a)*t^3
f[u_, v_, 
  skew_ : 2 Pi/3] := {Cos[u + offset], Sin[u + offset], 
    1} (v) + {Cos[u + skew + offset], 
    Sin[u + skew + offset], -1} (1 - v)

borderWidth = -BorderDimensions[
     ParametricPlot3D[f[u, v, 2 Pi/3], {u, 0, 2 Pi}, {v, 0, 1}, 
      PlotRange -> {{-1, 1}, {-1, 1}, {-1, 1}}, Axes -> False, 
      Boxed -> False, ViewPoint -> {1.3, -3, 2}]] + 2;
(*generate table*)
hyperbList = 
  ParallelTable[
   ImagePad[Module[{p = 3 (j/frames)^2 - 2 (j/frames)^3},
     Show[
      ParametricPlot3D[f[u, v], {u, 0, p*2 Pi}, {v, 0, 1}, 
       ColorFunction -> 
        Function[{x, y, z, u}, 
         RGBColor[k[0.880722, 0, u*p], 0.611041, k[0.142051, 1, u*p], 
          1 - (u*p)^3]], Boxed -> False, Axes -> False, 
       ViewPoint -> {1.3, -3, 2}, 
       PlotRange -> {{-1, 1}, {-1, 1}, {-1, 1}}, 
       PlotPoints -> Ceiling[125 j/frames + 2],
       MeshFunctions -> {#5 &}],
      Graphics3D[{
        (* custom-bake the v mesh, and add other thingamabobbers *)
        GrayLevel[0.2],
        Table[
         Line[{f[2 Pi/16*i, 0], f[2 Pi/16*i, 1]}], {i, 1, 
          Floor[p*16]}],
        
        Thick, Blue,
        splineCircle[{0, 0 , 1}, 1],
        splineCircle[{0, 0, -1}, 1],
        
        Black,
        Line[{f[0, 0], f[0, 1]}],
        Line[{f[p*2 Pi, 0], f[p * 2 Pi, 1]}],
        PointSize[0.03],
        Point[{f[0, 0], f[0, 1]}],
        Point[{f[p*2 Pi, 0], f[p * 2 Pi, 1]}],
        
        GrayLevel[0.2],
        Line[{f[p*2 Pi, 1], {0, 0, 
           1}, {Cos[p*2 Pi + offset + 2 Pi/3], 
           Sin[p*2 Pi + offset + 2 Pi/3], 1}, f[p*2 Pi, 0]}],
        splineCircle[{0, 0, 1}, 
         1/4, {p*2 Pi + offset, p*2 Pi + offset + 2 Pi/3}],
        Line[{{0, 1, -1}, {0, -1, -1}}],
        Line[{{1, 0, -1}, {-1, 0, -1}}],
        Line[{{0, 0, 1}, {0, 0, -1}}]
        }]
      ]
     ], borderWidth], {j, 1, frames}];
(* add frame of u = 0 manually *)
PrependTo[hyperbList, ImagePad[Graphics3D[
    {Thick, Blue,
     splineCircle[{0, 0 , 1}, 1],
     splineCircle[{0, 0, -1}, 1],
     
     Black,
     Line[{f[0, 0], f[0, 1]}],
     PointSize[0.03],
     Point[{f[0, 0], f[0, 1]}],
     GrayLevel[0.2],
     
     Line[{f[0, 1], {0, 0, 1}, {Cos[offset + 2 Pi/3], 
        Sin[offset + 2 Pi/3], 1}, f[0, 0]}],
     splineCircle[{0, 0, 1}, 1/4, {offset, offset + 2 Pi/3}],
     Line[{{0, 1, -1}, {0, -1, -1}}],
     Line[{{1, 0, -1}, {-1, 0, -1}}],
     Line[{{0, 0, 1}, {0, 0, -1}}]
     },
    Boxed -> False, Axes -> False, 
    PlotRange -> {{-1, 1}, {-1, 1}, {-1, 1}}, 
    ViewPoint -> {1.3, -3, 2}],
   borderWidth]];
(* Show transition into cone *)
frames2 = 60;
AppendTo[hyperbList, 
  Splice @ParallelTable[
    ImagePad[Module[{p = 3 (j/frames2)^2 - 2 (j/frames2)^3},
      Show[
       ParametricPlot3D[
        f[u, v, (2 + p) Pi/3], {u, 0, 2 Pi}, {v, 0, 1}, 
        ColorFunction -> 
         Function[{x, y, z, u}, 
          RGBColor[k[0.880722, 0, u], 0.611041, k[0.142051, 1, u], 
           1 - (u)^3]], Boxed -> False, Axes -> False, 
        ViewPoint -> {1.3, -3, 2}, 
        PlotRange -> {{-1, 1}, {-1, 1}, {-1, 1}},
        PlotPoints -> 127,
        MeshFunctions -> {#5 &}],
       Graphics3D[{
         (* custom-bake the v mesh, and add other thingamabobbers *)
         GrayLevel[0.2],
         
         Table[Line[{f[2 Pi/16*i, 0, (2 + p) Pi/3], 
            f[2 Pi/16*i, 1, (2 + p) Pi/3]}], {i, 1, 16}],
         
         Thick, Blue,
         splineCircle[{0, 0 , 1}, 1],
         splineCircle[{0, 0, -1}, 1],
         
         Line[{f[2 Pi, 1, (2 + p) Pi/3], {0, 0, 
            1}, {Cos[offset + (2 + p) Pi/3], 
            Sin[offset + (2 + p) Pi/3], 1}, f[2 Pi, 0, (2 + p) Pi/3]}],
         
         splineCircle[{0, 0, 1}, 
          1/4, {2 Pi + offset, 2 Pi + offset + (2 + p) Pi/3}],
         
         Black,
         Line[{f[0, 0, (2 + p) Pi/3], f[0, 1, (2 + p) Pi/3]}],
         Line[{f[2 Pi, 0, (2 + p) Pi/3], f[2 Pi, 1, (2 + p) Pi/3]}],
         PointSize[0.03],
         Point[{f[0, 0, (2 + p) Pi/3], f[0, 1, (2 + p) Pi/3]}],
         Point[{f[2 Pi, 0, (2 + p) Pi/3], f[2 Pi, 1, (2 + p) Pi/3]}],
         
         GrayLevel[0.2],
         
         Line[{{Cos[p (Pi/3)], 
            Sin[p (Pi/3)], -1}, {-Cos[p (Pi/3)], -Sin[p (Pi/3)], -1}}],
         
         Line[{{Cos[p (Pi/3) + Pi/2], 
            Sin[p (Pi/3) + Pi/2], -1}, {-Cos[p (Pi/3) + Pi/2], -Sin[
              p (Pi/3) + Pi/2], -1}}],
         Line[{{0, 0, 1}, {0, 0, -1}}]
         }]
       ]
      ], borderWidth], {j, 1, frames2}]];
(* Show transition to cylinder *)
frames3 = 60;
AppendTo[hyperbList, 
  Splice @ParallelTable[
    ImagePad[Module[{p = 3 (j/frames3)^2 - 2 (j/frames3)^3},
      Show[
       ParametricPlot3D[
        f[u, v, (3 - 3 p) Pi/3], {u, 0, 2 Pi}, {v, 0, 1}, 
        ColorFunction -> 
         Function[{x, y, z, u}, 
          RGBColor[k[0.880722, 0, u], 0.611041, k[0.142051, 1, u], 
           1 - (u)^3]], Boxed -> False, Axes -> False, 
        ViewPoint -> {1.3, -3, 2}, 
        PlotRange -> {{-1, 1}, {-1, 1}, {-1, 1}},
        PlotPoints -> 127,
        MeshFunctions -> {#5 &}],
       Graphics3D[{
         (* custom-bake the v mesh, and add other thingamabobbers *)
         GrayLevel[0.2],
         
         Table[Line[{f[2 Pi/16*i, 0, (3 - 3 p) Pi/3], 
            f[2 Pi/16*i, 1, (3 - 3 p) Pi/3]}], {i, 1, 16}],
         
         Thick, Blue,
         splineCircle[{0, 0 , 1}, 1],
         splineCircle[{0, 0, -1}, 1],
         
         Line[{f[2 Pi, 1, (3 - 3 p) Pi/3], {0, 0, 
            1}, {Cos[offset + (3 - 3 p) Pi/3], 
            Sin[offset + (3 - 3 p) Pi/3], 1}, 
           f[2 Pi, 0, (3 - 3 p) Pi/3]}],
         
         splineCircle[{0, 0, 1}, 
          1/4, {offset, offset + (3 - 3 p) Pi/3}],
         
         Black,
         Line[{f[0, 0, (3 - 3 p) Pi/3], f[0, 1, (3 - 3 p) Pi/3]}],
         
         Line[{f[2 Pi, 0, (3 - 3 p) Pi/3], 
           f[2 Pi, 1, (3 - 3 p) Pi/3]}],
         PointSize[0.03],
         Point[{f[0, 0, (3 - 3 p) Pi/3], f[0, 1, (3 - 3 p) Pi/3]}],
         
         Point[{f[2 Pi, 0, (3 - 3 p) Pi/3], 
           f[2 Pi, 1, (3 - 3 p) Pi/3]}],
         
         GrayLevel[0.2],
         
         Line[{{Cos[(1 - 3 p) (Pi/3)], 
            Sin[(1 - 3 p) (Pi/
                3)], -1}, {-Cos[(1 - 3 p) (Pi/3)], -Sin[(1 - 3 p) (Pi/
                 3)], -1}}],
         
         Line[{{Cos[(1 - 3 p) (Pi/3) + Pi/2], 
            Sin[(1 - 3 p) (Pi/3) + 
              Pi/2], -1}, {-Cos[(1 - 3 p) (Pi/3) + 
               Pi/2], -Sin[(1 - 3 p) (Pi/3) + Pi/2], -1}}],
         Line[{{0, 0, 1}, {0, 0, -1}}]
         }]
       ]
      ], borderWidth], {j, 1, frames3}]];
Export["hyperboloidAnim2.gif", hyperbList, 
 "DisplayDurations" -> {1, Splice@ConstantArray[1/15, frames - 1], 1, 
   Splice@ConstantArray[1/15, frames2 - 1], 1, 
   Splice@ConstantArray[1/15, frames3 - 1], 1}]

Lizenz

Ich, der Urheber dieses Werkes, veröffentliche es unter der folgenden Lizenz:
Creative Commons CC-Zero Diese Datei wird unter der Creative-Commons-Lizenz CC0 1.0 Verzicht auf das Copyright zur Verfügung gestellt.
Die Person, die das Werk mit diesem Dokument verbunden hat, übergibt dieses weltweit der Gemeinfreiheit, indem sie alle Urheberrechte und damit verbundenen weiteren Rechte – im Rahmen der jeweils geltenden gesetzlichen Bestimmungen – aufgibt. Das Werk kann – selbst für kommerzielle Zwecke – kopiert, modifiziert und weiterverteilt werden, ohne hierfür um Erlaubnis bitten zu müssen.

Kurzbeschreibungen

Ergänze eine einzeilige Erklärung, was diese Datei darstellt.
An illustration of the the generation of a hyperboloid of revolution as the surface of revolution of a slanted line, also featuring all possible angles at which the line can be slanted to create a unique hyperboloid

In dieser Datei abgebildete Objekte

Motiv

image/gif

10.346.266 Byte

470 Pixel

370 Pixel

0c87c5311063ce30804d019527e3957c349c0282

Dateiversionen

Klicke auf einen Zeitpunkt, um diese Version zu laden.

Version vomVorschaubildMaßeBenutzerKommentar
aktuell01:30, 17. Mai 2024Kein Vorschaubild vorhanden370 × 470 (9,87 MB)wikimediacommons>LemondogeUploaded own work with UploadWizard

Die folgende Seite verwendet diese Datei: