球面上を移動する三角形の習作(2020.06.10)

はじめに

 球面上を、形を変えずに移動する図形を表現したかったのですが、 結局うまくできませんでした。

 やっぱりクォータニオンを使って、マジメにやらないとダメなのかな、 と感じてます。

ソースコード

 以下、ソースコードです。

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)した方が 良いのかもしれません。