2025年1月20日(月) 04:21 JST

2013年度第4回GDL講習会

  • 2013年5月20日(月) 16:56 JST
  • 投稿者:
    ゲストユーザ

第4回「SPHERE」「COIL」

第4回GDL講習会では、配列を用いて3次元曲面を作成する方法を学びました。この範囲は過去の記事と重複するので、 こちら(2010年度のGDL講習会ページ)をご覧ください。

今回の課題は、配列を使って、媒介変数で表現された球とコイルの作成でした。

球の媒介変数は

x = COS( θ ) * COS( φ )
y = COS( θ ) * SIN( φ )
z = SIN( θ )
{0 <=θ<= 2π}
{0 <=φ<= π}
となります。



この式では変数Θとφでの範囲が弧度法で示されているので範囲を角度に変換してFORループを回します。

DIM x[][],y[][],z[][]
 
deg=180  !! π (180度)
 FOR i = 1 TO 2*deg+1  !!Θの範囲をFORループで回す。
  FOR j = 1 TO deg+1  !!φの範囲をFORループで回す。
   x[i][j]=cos(i)*cos(j)
   y[i][j]=cos(i)*sin(j)
   z[i][j]=sin(i)
  NEXT j
 NEXT i
 
FOR i = 1 TO 2*deg
  FOR j = 1 TO deg
   LIN_ x[i][j],y[i][j],z[i][j],    !! xy平面と平行な座標をつなぐ。
   x[i][j+1],y[i][j+1],z[i][j+1]
   LIN_ x[i][j],y[i][j],z[i][j],  !!z軸方向に座標つなぐ。
   x[i+1][j],y[i+1][j],z[i+1][j]
  NEXT j
 NEXT i

同じ要領でコイルも作ります。

コイルの媒介変数は
x = ( R + r * COS(φ)) * COS(θ)
y = ( R + r * COS(φ)) * SIN(θ)
z = r * SIN(φ) + dz
{ 0 <= φ <= 2π }
{ 0 <= θ <= 4π }(下のコードの場合)
ただしdzは、コイルの回転に伴うZ方向への増分
となっています。
 この式で注意しなければいけないのはz座標を決めている式です。FORループで回すためにΘとφを角度に直していましたがそれでは0.5*φのところで座標が違うところに指定されてしまいます。なので式の中で角度を弧度法に直す式を組み込みましょう。

DIM x[][],y[][],z[][]
 deg=180 !! π(180度)
 FOR i = 1 to 2*deg+1 !!Θの範囲をFORループで回す。
  FOR j = 1 to 4*deg+1  !!φの範囲をFORループで回す。
   x[i][j]=(5+cos(i))*cos(j)
   y[i][j]=(5+cos(i))*sin(j) 
   z[i][j]=sin(i)+0.5*PI*j/deg
  next j
 next i
 
!! コイルの円を描く
 FOR i = 1 to 2*deg
  FOR j = 1 to 4*deg
   LIN_ x[i][j],y[i][j],z[i][j],
   x[i+1][j],y[i+1][j],z[i+1][j]
  NEXT j
 NEXT i
 !! 上で描いた円と円をつなぐ線を描く
 FOR i = 1 to 2*deg
  FOR j = 1 to 4*deg-1
   LIN_ x[i][j],y[i][j],z[i][j],
   x[i][j+1],y[i][j+1],z[i][j+1]
  NEXT j
 NEXT i

以上のスクリプトでもコイルは書けますが、FORループが360*720回も回ってしまい処理に時間がかかってしまうのでモデルが変わらない程度に処理の回数を減らしてあげましょう。今回は180度を12度ずつ15個に分けます。

DIM x[][],y[][],z[][]
 deg=12
 div=15
 for i = 1 to 2*deg+1
  for j = 1 to 4*deg+1
  x[i][j]=(5+cos(i*div))*cos(j*div)
  y[i][j]=(5+cos(i*div))*sin(j*div) 
 z[i][j]=sin(i*div)+0.15*j
  next j
 next i
 
FOR i = 1 to 2*deg
  FOR j = 1 to 4*deg
   LIN_ x[i][j],y[i][j],z[i][j],
   x[i+1][j],y[i+1][j],z[i+1][j]
  NEXT j
 NEXT i
 
FOR i = 1 to 2*deg
  FOR j = 1 to 4*deg-1
   LIN_ x[i][j],y[i][j],z[i][j],
   x[i][j+1],y[i][j+1],z[i][j+1]
 
 NEXT j
NEXT i 
ちなみにこのコイルはGDL教科書P42のTUBEコマンドを用いても描くことができます。興味のある方はやってみましょう。

以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。