4)曲線間の曲面

 直交座標を球面座標に変換します。
//****************************************************************
   入力 Pv:曲線上の動点の直交座標 <x座標,y座標,z座標>
   出力 Sv;曲線上の動点の球面座標 <動径,水平角,垂直角>
//****************************************************************
#macro Spherical_cnv_y(Pv)
 #local RR=vlength(Pv); #local Rh=vlength(< Pv.x, 0, Pv.z >);
 #if(Pv.x=0 & Pv.z=0) #local HH=0; #else #local HH=atan2(Pv.z,Pv.x); #end
 #if(Rh=0 & Pv.y=0) #local VV=0; #else #local VV=atan2(Pv.y,Rh); #end
 < RR, HH, VV >
#end
//****************************************************************
 刻み幅の位置に配置する曲線上の動点を直交座標として求めます。
//****************************************************************
   入力
    Sv0:中心曲線に直交するようにするための球面座標
    Pv0:中心曲線の刻み幅の位置における動点の直交座標
    Pv :中間の曲線の比例位置における直交座標
   出力
    Vp :中間の曲線上における動点の直交座標 Pv0+Pv
//****************************************************************
#macro Point_cnv(Sv0,Pv0,Pv)
 #local Pv=vrotate(Pv,<0,degrees(Sv0.y),0>);
 #local Pv=vrotate(vrotate(Pv,<0,0,degrees(Sv0.z)>),<0,-degrees(Sv0.y),0>);
 Pv0+Pv
#end
//****************************************************************
 曲線間を三角形の面で接続して曲面を造ります。
//****************************************************************
   入力
    V1:媒介変数u <始点,終点,刻み幅>
    V2:媒介変数v <始点,終点,刻み幅>
    Fn:中心曲線の式の登録番号(Fn+1:開始曲線 Fn+2:終了曲線)
//****************************************************************
#macro Scan_surfacef3(V1,V2,Fn)
 #local Section_sf=Fn+1; #local Section_ef=Fn+2;
 #local P1=Line_function(V2.x, Fn);
 #local P2=Line_function(V2.x+V2.z,Fn);
 #local Pv=Spherical_cnv_y(P2-P1); #local S1=;
 #local Tp=V2.x; #while( Tp < V2.y )
  #local P3=Line_function(Tp+2*V2.z,Fn);
  #local Pv=Spherical_cnv_y(P3-P2); #local S2=< Pv.x, Pv.y, Pv.z-pi/2 >;
  #local Sp=V1.x; #while(Sp,<0,3,2>} }
  #local Sp=Sp+V1.z; #end
 #local Tp=Tp+V2.z; #local P1=P2; #local P2=P3; #local S1=S2; #end
#end
//****************************************************************