球面三角形
Twitter界隈で流行っていたので挑戦。
課題
単位球面(中心O)の表面上に、異なる3点A,B,Cをとる。
球面三角形ABCを、Surfaceコマンドで描画したい。
方針
まずは、球面三角形の辺ABを、パラメータt(0〜1)を使って表現することから。
Surfaceコマンドの癖に配慮して、AngleやRotateといったコマンド使用は避け、組み込み関数で代用していく。
同様に、辺BCを、パラメータu(0〜1)を使って表現。
組み合わせる。
あとは、Surfaceの構文の1つである
Surface( <式>, <式>, <式>, <媒介変数1>, <開始値>, <終了値>, <媒介変数2>, <開始値>, <終了値> )
を使って終了。
上記方針で作成した場合、球面三角形ABCの、GeoGebraでの定義式はこうなる。
Surface(x((A*cos(t*acosd(A (B*cos(u*acosd(B C))+sin(u*acosd(B C))*(B ⊗ C ⊗ B) / abs(B ⊗ C ⊗ B))))+sin(t*acosd(A (B*cos(u*acosd(B C))+sin(u*acosd(B C))*(B ⊗ C ⊗ B) / abs(B ⊗ C ⊗ B))))*(A ⊗ (B*cos(u*acosd(B C))+sin(u*acosd(B C))*(B ⊗ C ⊗ B) / abs(B ⊗ C ⊗ B)) ⊗ A) / abs(A ⊗ (B*cos(u*acosd(B C))+sin(u*acosd(B C))*(B ⊗ C ⊗ B) / abs(B ⊗ C ⊗ B)) ⊗ A))),y((A*cos(t*acosd(A (B*cos(u*acosd(B C))+sin(u*acosd(B C))*(B ⊗ C ⊗ B) / abs(B ⊗ C ⊗ B))))+sin(t*acosd(A (B*cos(u*acosd(B C))+sin(u*acosd(B C))*(B ⊗ C ⊗ B) / abs(B ⊗ C ⊗ B))))*(A ⊗ (B*cos(u*acosd(B C))+sin(u*acosd(B C))*(B ⊗ C ⊗ B) / abs(B ⊗ C ⊗ B)) ⊗ A) / abs(A ⊗ (B*cos(u*acosd(B C))+sin(u*acosd(B C))*(B ⊗ C ⊗ B) / abs(B ⊗ C ⊗ B)) ⊗ A))),z((A*cos(t*acosd(A (B*cos(u*acosd(B C))+sin(u*acosd(B C))*(B ⊗ C ⊗ B) / abs(B ⊗ C ⊗ B))))+sin(t*acosd(A (B*cos(u*acosd(B C))+sin(u*acosd(B C))*(B ⊗ C ⊗ B) / abs(B ⊗ C ⊗ B))))*(A ⊗ (B*cos(u*acosd(B C))+sin(u*acosd(B C))*(B ⊗ C ⊗ B) / abs(B ⊗ C ⊗ B)) ⊗ A) / abs(A ⊗ (B*cos(u*acosd(B C))+sin(u*acosd(B C))*(B ⊗ C ⊗ B) / abs(B ⊗ C ⊗ B)) ⊗ A))),t,0,1,u,0,1)
……もうちょいシンプルにできないものだろうか??
なお、Surfaceを使わない方が、よほど簡単。
Sequence(CircularArc((0, 0), Point(CircularArc((0, 0), A, B), t), Point(CircularArc((0, 0), A, C), t)), t, 0, 1, 0.01)