はじめに
球面上を、形を変えずに移動する図形を表現したかったのですが、 結局うまくできませんでした。
文字数超過で、つぶやきProcessing できず。
— Koji Saito (@KojiSaito) June 10, 2020
回転する正多面体の習作として、つぶプロで、変形せずに球面上を移動する三角形を作りたかったんだけど、上手くできずに失敗。なかなかムツカシイですね。#dailycodingchallenge #generativeart #プログラミング学習 pic.twitter.com/v6RSIPxkcM
やっぱりクォータニオンを使って、マジメにやらないとダメなのかな、 と感じてます。
ソースコード
以下、ソースコードです。
def setup():
size(500,500)
stroke(-1)
def draw():
clear()
randomSeed(0)
for i in [0]*200:D()
def D():
f=frameCount*.03
s=200
t=random(4)+f
p=random(3)+f*.2
d=random(.3)
e=random(.3)
P=lambda a,b:[s*sin(t+a*d)*cos(p+b*e)+250,s*sin(t+a*d)*sin(p+b*e)+250]
x0,y0=P(0,0)
x1,y1=P(1,0)
x2,y2=P(0,1)
line(x0,y0,x1,y1)
line(x1,y1,x2,y2)
line(x2,y2,x0,y0)
球面座標 (x,y,z) の計算は、角度パラメータ θ と φ および半径 r を用いて、
$$ \left\{ \begin{array}{l} x=r \sin \theta \cos \phi \newline y=r \sin \theta \sin \phi \newline z=r \cos \theta \end{array} \right. $$
と表されます (詳しくは Wikipedia のページ 球面座標系 をみて下さい)。
ちなみに、この方法だと、 θの量により三角形の面積が一定とならない(立体角が変化する)ため 三角形が変化してしまいます。
クォータニオンを使って、 まじめに slerp (球面線形補間 spherical linear interporation)した方が 良いのかもしれません。