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 10:58]
Ivo Blöchliger [Mehr als zwei Bewegungen]
kurse:povray23:basicmoves [2023/08/14 10:15] (current)
Ivo Blöchliger [Mehr als zwei Bewegungen]
Line 168: Line 168:
 </code> </code>
  
-==== Drehpendel ====+==== Pendelbewegung ====
 {{kurse:povray23:schwingung-rotation.gif}} {{kurse:povray23:schwingung-rotation.gif}}
  
Line 191: 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 213: 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
 } }
Line 219: Line 219:
  
 ==== Mehr als zwei Bewegungen ==== ==== Mehr als zwei Bewegungen ====
-POV-Ray hat kein ''else if'', dafür ein praktische ''switch'', ''range'' statements:+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> <code povray>
Line 229: Line 231:
  
  #switch (clock)  #switch (clock)
- #range (0, 0.25)+ #range (0, 0.2499)
  #declare myclock = 4*clock;  #declare myclock = 4*clock;
  rotate -180*x*myclock  rotate -180*x*myclock
  #break  // Ende von diesem range-block (sonst wird der nächste automatisch auch ausgeführt)  #break  // Ende von diesem range-block (sonst wird der nächste automatisch auch ausgeführt)
- #range (0.25, 0.5)+ #range (0.25, 0.4999)
  #declare myclock = 4*(clock-0.25);  #declare myclock = 4*(clock-0.25);
  rotate -180*x  rotate -180*x
  rotate -180*y*myclock  rotate -180*y*myclock
  #break  #break
- #range (0.5, 0.75)+ #range (0.5, 0.7499)
  #declare myclock = 4*(clock-0.5);  #declare myclock = 4*(clock-0.5);
  rotate -180*x  rotate -180*x
Line 259: Line 261:
  
 <WRAP todo> <WRAP todo>
-Anstatt ''myclock'' für jeden Fall neu zu berechnen, könnte hier auch ''myclock'' **vor** dem ''switch'' wie folgt definiert werden:+Anstatt ''myclock'' für jeden Fall neu zu berechnen, könnte hier auch ''myclock'' **vor** dem ''switch'' wie folgt definiert werden
 <code povray> <code povray>
 #declare myclock = 4*clock - floor(4*clock)   // floor rundet auf die nächste Ganzzahl ab #declare myclock = 4*clock - floor(4*clock)   // floor rundet auf die nächste Ganzzahl ab
Line 267: Line 269:
 #declare myclock = mod(4*clock, 1)   // Rest der Ganzzahldivision von 4*clock geteilt durch 1 #declare myclock = mod(4*clock, 1)   // Rest der Ganzzahldivision von 4*clock geteilt durch 1
 </code> </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). 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).
Line 272: Line 275:
  
 Gehen Sie dazu wie folgt vor: Gehen Sie dazu wie folgt vor:
-  * Zeichnen Sie die Funktion $f(t) = t$, was dem linearen Drehwinkel entspricht. +  * Skizzieren Sie auf Papier die Funktion $f(t) = t$, was dem linearen Drehwinkel entspricht. 
-  * Skizzieren Sie 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 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.   * 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)$.   * Unsere gesuchte Funktion ist also $g(t) = f(t)+d(t) = t+d(t)$.
Line 283: Line 286:
 </WRAP> </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>
 +    
  • kurse/povray23/basicmoves.1688374720.txt.gz
  • Last modified: 2023/07/03 10:58
  • by Ivo Blöchliger