Rotation α um Achse[sub]durch Ursprung[/sub] n=(n[sub]1[/sub],n[sub]2[/sub],n[sub]3[/sub]), |n|=1[br][br][math]Rn(a, n1, n2, n3) \, := \, \left(\begin{array}{rrrr}n1^{2} \; \left(1 - \operatorname{cos} \left( a \right) \right) + \operatorname{cos} \left( a \right)&n1 \; n2 \; \left(1 - \operatorname{cos} \left( a \right) \right) - n3 \; \operatorname{sin} \left( a \right)&n1 \; n3 \; \left(1 - \operatorname{cos} \left( a \right) \right) + n2 \; \operatorname{sin} \left( a \right)&0\\n2 \; n1 \; \left(1 - \operatorname{cos} \left( a \right) \right) + n3 \; \operatorname{sin} \left( a \right)&n2^{2} \; \left(1 - \operatorname{cos} \left( a \right) \right) + \operatorname{cos} \left( a \right)&n2 \; n3 \; \left(1 - \operatorname{cos} \left( a \right) \right) - n1 \; \operatorname{sin} \left( a \right)&0\\n3 \; n1 \; \left(1 - \operatorname{cos} \left( a \right) \right) - n2 \; \operatorname{sin} \left( a \right)&n3 \; n2 \; \left(1 - \operatorname{cos} \left( a \right) \right) + n1 \; \operatorname{sin} \left( a \right)&n3^{2} \; \left(1 - \operatorname{cos} \left( a \right) \right) + \operatorname{cos} \left( a \right)&0\\0&0&0&1\\\end{array}\right) [/math][br][br]Translation[br][br][math]Tn(t1, t2, t3) \, := \, \left(\begin{array}{rrrr}1&0&0&t1\\0&1&0&t2\\0&0&1&t3\\0&0&0&1\\\end{array}\right)[/math][br][br]Rotation über die Kanten (rotation about edges) [br][br] [math]Tn\left(t_1, t_2, t_3 \right) \; Rn\left(t_0, n_1, n_2, n_3 \right) \; Tn\left(-t_1, -t_2, -t_3 \right)[/math] = Ro(-t[sub]0[/sub],n1,n2,n3,t1,t2,t3)[br][br]Ro beschreibt eine 3D Rotation um eine beliebige Achse [br][list][*]Kantengerade in Ursprung verschieben - Rotation - zurück verschieben. [/*][*]translate edge line to origin - rotate - translate back [/*][*]combine all moves in matrix Ro[br][/*][/list][br]VerticesO[sub]H[/sub], VerticesU[sub]H[/sub] - Eckpunkte Oben, Unten homogene Koordinaten[br]VerticesO, VerticesU - Eckpunkte Oben, Unten kartesische Koordinaten[br]VecG - Richtungs-Vektoren der Kantengeraden, [br]TransO - Translationsvektoren Kantengeraden (zum/vom Ursprung) [br]ROT - Rotationsmatrizen[sub](Homogene Koordinaten)[/sub] über alle Kanten (CAS)[br][i][size=85]ROT:=Sequence(Ro(-t_0 , x(VecG(j)),y(VecG(j)),z(VecG(j)),TransO(j,1), TransO(j,2), TransO(j,3)),j,1,n); [br]writeElement4Indexing, Search & Replace in Ro(t,n1,n2,n3,t1,t2,t3)[/size][/i] [br]RotVerticesO[sub]H[/sub], RotVerticesU[sub]H[/sub] - Eckpunkte(i) Oben, Unten rotieren über ROTM(1..i) homogene Koordinaten [br]RotVerticesO, RotVerticesU - Eckpunkte nach Rotation t[sub]0[/sub] Oben, Unten kartesische Koordinaten[br][list][*]die Kante(i) rotiert entsprechend dem Matrixprodukt ROTM(1....i) [/*][*]über alle Kanten von 1...i[br][math]\left\{\left(\prod_{i=1}^{j+1}ROT(i) \right) Vertices_H(mod(j,n)+1) \right\}_{j=1...n}[/math][/*][*]App instabil zum Zeitpunkt der Veröffentlichung: [br]Listen brechen zusammen und verschwinden (list bug - report, but no responce)[br][/*][/list][br]Je nach Polygon n-Eck müssen die Flächen über unterschiedlich viele Kanten (n) rotieren, die für jede Kante einfach zu einem Matrixprodukt zusammengefasst werden. Ein entsprechendes Rotate()-Kommando müsste n-mal geschachtelt werden Rotate(Rotate(Rotate(...[sub]n-mal[/sub]...)))) was bestenfalls gescriptet werden könnte.