- 陰関数曲線
陰関数曲線を扱う関数について。
現在のCCTLにはこの機能は無い。そもそもそれほど必要性が無い事と代用関数でカバー可能だからである。
曲線 f(x,y) = 0 を算出するには次のようにして可能になる。(が少々小細工が必要である。)
※この小細工に関して若干の解説を、ということで。
(1)曲面S(u,v) を定義する。これは
S(u,v) = { u, v, f(u,v)} というパラメトリック曲面として定義する。
(2)Z=0平面を定義する。例えば
Plane = ( [-X,-Y,0], [2X,0,0], [0,2Y,0])
(3)切断線を求める。
cross(S,Plane)
こうして求めた切断線が曲線 f(x,y) = 0 になる。
しかし、(1)〜(3)の手順で原理的には計算可能だがユーザー定義曲面S(u,v)の評価は専用のインタプリタ
が行うためかなり遅い。実際に、
Susr=({"u_=domain(-10,10,u)","v_=domain(-10,10,v)","u_^3+v_^3-3*4*u_*v_"});
Plane=([-10,-10,0],[20,0,0],[0,20,0]);
cross(Susr, Plane);
end;
とすると戻ってこない。(Pen4でも13分たっても終わらないので強制終了!!)
crossはかなり細かいステップで解の探索を行うためである。
ステップは内部的に算出しているため細かさによってはそれだけの回数のインタプリタが走ることになる。
そこで、
Susr=({"u_=domain(-10,10,u)","v_=domain(-10,10,v)","u_^3+v_^3-3*4*u_*v_"});
Plane=([-10,-10,0],[20,0,0],[0,20,0]);
exampram(0.1,
0.1);
cross(Susr, Plane);
end;
とするとほぼ瞬時に解が算出される。しかし、特異点近傍では解の挙動がかなりおかしい。
そこで、追跡ピッチを詳細にして、
Susr=({"u_=domain(-10,10,u)","v_=domain(-10,10,v)","u_^3+v_^3-3*4*u_*v_"});
Plane=([-10,-10,0],[20,0,0],[0,20,0]);
pitch(0.01);
exampram(0.1, 0.1);
cross(Susr, Plane);
end;
とすると正確な f(x,y) = 0が求められる。
追跡ピッチを詳細した分遅くなるがPen4で1分である。
このようにかなり調整の必要がある。
Susr=({"u_=domain(-10,10,u)","v_=domain(-10,10,v)","u_^3+v_^3-3*4*u_*v_"});
Plane=([-10,-10,0],[20,0,0],[0,20,0]);
pitch(0.025);
exampram(0.1, 0.1);
cross(Susr, Plane);
end;
では数秒程度でほぼ正確なf(x,y) = 0が求められる。
#x^5-x*y^2+y^5
Susr=({"x_=domain(-1,1,u)","y_=domain(-1,1,v)","x_^5-x_*y_^2+y_^5"});
Plane=([-1,-1,0],[2,0,0],[0,2,0]);
pitch(0.02);
exampram(0.05, 0.15);
cross(Susr, Plane);
end;
このケースでは(0,0)近傍で法線ベクトルが切断平面の法線と同一方向に近くなるため積分が発散してしまいます。
このような場合、同一方向をより正確に判断するようにして、
Susr=({"x_=domain(-1,1,u)","y_=domain(-1,1,v)","x_^5-x_*y_^2+y_^5"});
Plane=([-1,-1,0],[2,0,0],[0,2,0]);
pitch(0.02);
limit_ang_set(1.0e-15);
exampram(0.05, 0.15);
cross(Susr, Plane);
end;
とすると正確な曲線を生成します。(緑の線は閉ループを構成した事を表します)
こうして作った陰関数曲線に沿ってパイプ面を張ってデフォルメしてみた。
|