kurse:povray23:basicmoves

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
kurse:povray23:basicmoves [2023/07/03 09:58]
Ivo Blöchliger [Rotation]
kurse:povray23:basicmoves [2023/08/14 10:15] (current)
Ivo Blöchliger [Mehr als zwei Bewegungen]
Line 61: Line 61:
 ==== Vertikaler Fall ==== ==== Vertikaler Fall ====
 {{kurse:povray23:quadratic.gif}} {{kurse:povray23:quadratic.gif}}
 +
 +<WRAP info>
 +Wir betrachten einen Wurf (oder Fall) der zur Zeit 0 am Boden nach oben startet und zur Zeit 1 wieder am Boden ankommt. Dabei soll die Höhe $h$ erreicht werden.
 +
 +Gesucht ist damit eine quadratische Funktion mit
 +  * Nullstellen 0 und 1
 +  * Scheitelpunkt $(0.5, h)$. (Der Scheitelpunkt liegt genau zwischen den Nullstellen).
 +
 +Folgende Funktionen haben die Nullstellen 0 und 1: $f(x) = a \cdot x\cdot(1-x)$, mit $a \in \mathbb{R}^\star$.
 +
 +Wir möchten dass $f(0.5)=h$, was uns eine Gleichung für $a$ liefert: $a\cdot 0.25 = h$, also $a=4h$.
 +
 +Die gesuchte $z$-Koordinate ist also:
 +$$
 +z(t) = 4h\cdot t \cdot (1-t)
 +$$
 +</WRAP>
 +<WRAP todo>
 +Überprüfen Sie durch Einsetzen, dass zu den Zeitpunkten $t \in \{0,0.5,1\}$ die gewünschten Höhen erreicht werden.
 +
 +Skizzieren Sie den Funktionsgraphen für $h=1$.
 +</WRAP>
  
 <code povray> <code povray>
Line 79: Line 101:
  
 ==== Wurfparabel ==== ==== Wurfparabel ====
-Lineare Bewegung in $x/y$-Richtung, Quadratische Bewegung in $z$-Richtung: 
- 
 {{kurse:povray23:wurfparabel.gif}} {{kurse:povray23:wurfparabel.gif}}
 +
 +<WRAP info>
 +Eine lineare Bewegung in $x/y$-Richtung und eine quadratische in $z$-Richtung werden kombiniert (siehe oben für die Details zu den einzelnen Bewegungen):
 +$$
 +
 +$$
 +</WRAP>
  
 <code povray> <code povray>
Line 105: Line 132:
 {{kurse:povray23:schwingung-linear.gif}} {{kurse:povray23:schwingung-linear.gif}}
  
 +<WRAP info>
 +Schwingungen können durch eine Sinus-Funktion beschrieben werden, die gestreckt und verschoben wird. Folgende Parameter bestimmen eine Schwingung:
 +  * Amplitude $a$ (die Hälfte der Differenz des kleinsten und grössten Werts)
 +  * Periode $p$ (Dauer einer Schwingung)
 +  * Phase $\phi$ (Winkel zur Zeit Null)
 +  * Mittelwert $m$ (Durchschnitt des kleinsten und grössten Werts)
 +Der Funktionsterm lautet (Winkelangaben in Radianten!)
 +$$
 +f(t) = a \cdot \sin\left(\phi + t\cdot 2\pi \cdot p\right) + m
 +$$
 +</WRAP>
 +
 +<WRAP todo>
 +Bestimmen Sie obige Parameter für eine Schwingung, die in einer Zeiteinheit eine Schwingung zwischen den Werten 0 und 1 ausführt. Für die Phase kann $\phi=0$ gewählt werden.
 +</WRAP>
 <code povray> <code povray>
 #declare start = <-2,-3,1.5>; #declare start = <-2,-3,1.5>;
Line 126: Line 168:
 </code> </code>
  
-==== Drehpendel ====+==== Pendelbewegung ====
 {{kurse:povray23:schwingung-rotation.gif}} {{kurse:povray23:schwingung-rotation.gif}}
  
Line 149: Line 191:
  
 ===== Kombination von Bewegungen ===== ===== Kombination von Bewegungen =====
-Idee: Wir teilen das Zeitintervall in Unterintervalle auf und berechnen einen neue Zeit von 0-1 in diesem Intervall:+Idee: Wir teilen das Zeitintervall in Unterintervalle auf und berechnen jeweils eine neue Zeit von 0-1 in diesem Unterintervall:
  
 {{kurse:povray23:stueckweise.gif}} {{kurse:povray23:stueckweise.gif}}
Line 171: Line 213:
  #declare myclock = (clock-0.5)*2; // Wieder Werte von 0 bis 1  #declare myclock = (clock-0.5)*2; // Wieder Werte von 0 bis 1
  translate (4*myclock-2)*y    // Linear in y-Richtung  translate (4*myclock-2)*y    // Linear in y-Richtung
- translate 4*3*(1-myclock)*myclock*z   // Quadratisch in z-Richtung (bis auf Höhe 2)+ translate 4*3*(1-myclock)*myclock*z   // Quadratisch in z-Richtung (bis auf Höhe 3)
  #end  #end
 } }
 +</code>
  
 +==== Mehr als zwei Bewegungen ====
 +POV-Ray hat kein ''else if'', dafür ein praktische ''switch'', ''range'' statements.
 +
 +Mit dem ''switch'' statement wird ein Wert untersucht. Mit ''range(a,b)'' wird überprüft, ob der Wert im (leider beidseitg geschlossenen) Intervall $[a,b]$ liegt. 
 +
 +<code povray>
 +torus {1, 0.3
 + pigment {checker color rgb x, color rgb z}
 + finish { phong 0.7 reflection 0.1 }
 + rotate 90*x
 + translate x-y
 +
 + #switch (clock)
 + #range (0, 0.2499)
 + #declare myclock = 4*clock;
 + rotate -180*x*myclock
 + #break  // Ende von diesem range-block (sonst wird der nächste automatisch auch ausgeführt)
 + #range (0.25, 0.4999)
 + #declare myclock = 4*(clock-0.25);
 + rotate -180*x
 + rotate -180*y*myclock
 + #break
 + #range (0.5, 0.7499)
 + #declare myclock = 4*(clock-0.5);
 + rotate -180*x
 + rotate -180*y
 + rotate 180*x*myclock
 + #break
 + #range (0.75, 1)
 + #declare myclock = 4*(clock-0.75);
 + rotate -180*x
 + rotate -180*y
 + rotate 180*x
 + rotate 180*y*myclock
 + #break
 + #end  // ende vom switch
 + translate 0.3*z // Damit der Torus nicht im Boden liegt
 +}
 +</code>
 +
 +{{kurse:povray23:vierstuecke.gif}}
 +
 +<WRAP todo>
 +Anstatt ''myclock'' für jeden Fall neu zu berechnen, könnte hier auch ''myclock'' **vor** dem ''switch'' wie folgt definiert werden
 +<code povray>
 +#declare myclock = 4*clock - floor(4*clock)   // floor rundet auf die nächste Ganzzahl ab
 +</code>
 +oder etwas eleganter
 +<code povray>
 +#declare myclock = mod(4*clock, 1)   // Rest der Ganzzahldivision von 4*clock geteilt durch 1
 +</code>
 +Die vier Definitionen in den ''#range'' Abschnitten können so gelöscht werden.
 +
 +Die Animation kann noch ansprechender gemacht werden, wenn die Drehung nicht gleichmässig ist, sondern am Anfang und Ende schneller und dazwischen langsamer (als ob der Torus fallen würde).
 +Das kann entweder physikalisch korrekt gerechnet werden (was nicht ganz ohne ist) oder angenähert werden.
 +
 +Gehen Sie dazu wie folgt vor:
 +  * Skizzieren Sie auf Papier die Funktion $f(t) = t$, was dem linearen Drehwinkel entspricht.
 +  * Skizzieren Sie ins gleiche Koordinatensystem die gewünschte Funktion $g(t)$, die am Anfang bei $g(t)=0$ steiler ansteigt, bei $t=0.5$ ebenfalls den Wert 0.5 liefert (aber weniger steil ist) und bei $g(1)=1$ ebenfalls steiler ist.
 +  * Skizzieren Sie die Differenz $d(t) = g(t)-f(t)$ und bestimmen Sie eine Funktion, die in etwa die Form von $d(t)$ hat.
 +  * Unsere gesuchte Funktion ist also $g(t) = f(t)+d(t) = t+d(t)$.
 +  * Fügen Sie dann in POV-Ray eine Zeile nach der Definition der Variablen ''myclock'' ein:
 +<code povray>
 +#declare myclock = myclock + //hier Ihre Funktion d einfügen
 +</code>
 +  * Jetzt sollte die Bewegung natürlicher wirken.
 +</WRAP>
 +
 +Mit «natürlicherer» Bewegung (aber immer noch physikalisch inkorrekt):
 +
 +{{kurse:povray23:vierstuecke-better.gif}}
 +
 +=== Noch eleganterer Code für diesen Fall ===
 +Betrachten wir die Funktion für den Drehwinkel der z.B. zweiten Drehung, kann die Funktion wie folgt beschrieben werden:
 +
 +$$
 +f(t) = \left\{\begin{array}{ll}
 +   0^\circ & \text{wenn }t<0.25 \\
 +   180^\circ & \text{wenn }t>0.5 \\
 +   180^\circ \cdot (t-0.25)*4 & \text{sonst}
 +   \end{array} \right.
 +$$
 +
 +POV-Ray bietet eine Funktion ''clip(v,min,max)'', die ''v'' liefert, wenn ''v'' zwischen den Werten ''min'' und ''max''. Wenn ''v'' kleiner als ''min'' ist, liefert die Funktion den Wert ''min'', wenn ''v'' grösser als ''max'' ist, liefert die Funktion den Wert ''max''.
 +Damit kann obiger Code gänzlich ohne ''if'' geschrieben werden:
 +
 +<code povray>
 +// Einfachere Formeln, wenn clock gleich schon mit 4 multipliziert wird
 +#declare myclock=4*clock;
 +//
 +// ... 
 +// 
  
 +    rotate clip(myclock,   0, 1)*-180*x   // Erste Rotation (Startet sofort, stoppt nach myclock=1)
 +    rotate clip(myclock-1, 0, 1)*-180*y   // Zweite Rotation (Startet erst bei myclock=1, stoppt nach myclock=2)
 +    rotate clip(myclock-2, 0, 1)*180*x    // Dritte Rotation
 +    rotate clip(myclock-3, 0, 1)*180*y    // Vierte Rotation
 +    
 </code> </code>
 +    
  • kurse/povray23/basicmoves.1688371109.txt.gz
  • Last modified: 2023/07/03 09:58
  • by Ivo Blöchliger