CADとコンピュータグラフィックス

1.CADとは

CAD(Computer Aided Design):コンピュータによる設計支援

関連する技術
 CAM(Computer Aided Manufacturing)
   コンピュータによる製造支援技術.
 CAE(Computer Aided Engineering)
   製品開発時に行う数値解析,シミュレーション技術を指す.

                                 *広義のCADシステムはCAEも含む.

2.2次元CADと3次元CAD

1)2次元CAD

2)3次元CAD

3.CADの基本的な仕組み

 ここでは2次元CADを例として,そのシステム構造についてVBによるプログラミングを通して学ぶ.
 CADに求められる基本機能は,以下の通りである.

1)描画機能の実現

 CAD上で描かれる描画スケールは,基本的には現実のスケールが与えられる.
 (ドローソフトウェアとの大きな差である.)
 ex. 10m×10mの図形を描画する場合に,そのデータも10m×10mの構造を有する.

 そのため,ビューポート(描画ウィンドウ)のスケールを,設計物にあわせて変更する必要がある.
 ここでは左下隅を減点とする10m×10mのスケール(単位はm)でウィンドウを定義する.

 ここでは,Picture1をビューポートとする.
 まずビューポートの初期設定を,Form_Load()のサブルーチンで行う.

Private Sub Form_Load()
  Form1.ScaleMode = vbTwips
  Picture1.Width = 5000
  Picture1.Height = 5000
  Picture1.ScaleHeight = -10
  Picture1.ScaleWidth = 10
  Picture1.ScaleTop = 10
  Picture1.ScaleLeft = 0
End Sub

2)座標値の格納

 基本的な描画方法については,これまでの授業で学んでいるが,描かれた図形に対する編集は困難であった.それは,ピクチャボックスをクリックした座標値を直接的にLineコマンドに受け渡しており,コンピュータ内にではその座標値を記憶していないためである.
 図形の編集を可能とするためには,座標値をコンピュータ上に記憶しておく必要がある.そこで,ここでは配列を持ちて,プロットした座標を格納する手法について説明する.

構造体を用いた座標の格納

 配列をDim X(100) As Single, Y(100) As Singleとして定義し,それを用いて座標を格納していけばよいのであるが,X,Yは常にペアであるにも関わらず,それぞれが別個に定義され,プログラムでの使い勝手がよくない.そこで,ここで構造体というものを用いて定義する.

 構造体は1つのまとまりとしてデータを定義するものである.
 構造体は,例えば以下のように定義する.

Type 人
  学籍番号 As Long
  名前 As String
  住所 As Stirng
  年齢 As Integer
End Type

 さらにこの構造体を用いて,変数を定義する.ここで変数を学生として考えれば,以下のように定義される.

 Dim 学生 As 人

 これで変数として学生が人という構造体により定義される.

 これを操作するためには,例えば,
  学生.学籍番号=19723423
  学生.年齢=22
 などのように定義すればよい.(プロパティと同様に扱える)

 さらにこれは配列として定義することも可能である.
  Dim 学生(100) As 人
 と定義すれば,以下のように使うことが可能である.
  学生(11).学籍番号=19723255

 このような構造体を用いることにより,特に複合した情報を有するオブジェクトに対する変数の定義が容易に行える.特に座標値を扱う場合に,構造体を定義しておくとよい.

 ここでは,以下のように構造体を定義する.

Private Type Point2D 'Formのコード上ではPrivateをつけなければ構造体は定義できない.
   x As Single
   y As Single
End Type

Dim PointOnLine(100) As Point2D

上記のように定義することにより,例えば10番目のX座標はPointOfLine(10).x,Y座標はPointOfLine(10).yと表すことが可能となる.

あとは,ウィンドウ上でのプロットに応じて座標点を描画するようにしておけばよい.

DIm cPointNum As Integer  '現在のポイント番号を覚えておくための変数を定義
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
' If cPointNum = 0 Then Picture1.PSet (X, Y) Else Picture1.Line -(X, Y)
 cPointNum = cPointNum + 1
 PointOnLine(cPointNum).x = x
 PointOnLine(cPointNum).y = y
 DrawLine  
End Sub

Private Sub DrawLine()
    Picture1.Cls
    Dim n As Integer
    Picture1.PSet (PointOnLine(1).x, PointOnLine(1).y)
    For n = 2 To cPointNum
        Picture1.Line -(PointOnLine(n).x, PointOnLine(n).y)
    Next
End Sub
 

これで点の座標を格納することが可能である.

3)点の編集

すべての描画点について,その座標を格納しているから,その編集を行うことが可能である.
ここで,最も簡単な例として,Deleteキーを押すことにより,直前の描画点を消去する例を示す.

Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer)
   'debug.print KeyCode '押されたキーの番号を確認する場合

  If KeyCode = 46 And cPointNum > 0 Then  '46はDelキー
    cPointNum = cPointNum - 1
    DrawLine
  End If
End Sub

格納された座標値を変更するプログラムを書くことにより,点の移動等も可能である.

4)ファイルへの入出力

描かれた座標値をファイルとして出力する方法,またファイルを読み取り,描画を再現する方法を示す.

ファイルから読み込み描画を再現することを考えると,どのような情報が必要だろうか.

2.0, 1.0
22.2, 12.0
18.0, 17.0
......
のように書き出すことは容易であるが,複数の線を扱う場合には,どれが始点でどれが終点であるかは明らかにしておく必要がある.
そのために2つの方法がある.
1)For  ..Next による読み込みを想定した方法
 For ..Nextを利用する場合には,線を構成する点の数があらかじめ明らかになっていなければならない.
2)Do...Loop による読み込みを想定した場合
  Do ...Loopを利用する場合には,座標値以外の数値や文字を読み込んだら終点であるという条件判断を行う必要がある.

ここでは,1)の方法を用いたプログラムの例を示す.
なお,事前に
 CommonDialogコントロールを追加する.
 Picture1のAutoRedrawプロパティをTrueにしておく(上にウィンドウがかぶっても消えないように..).

ファイルへの出力

Private Sub Command1_Click()
  SaveToFile
End Sub
Private Sub SaveToFile()
  Dim n As Integer
  CommonDialog1.ShowSave
  If CommonDialog1.filename = "" Then Exit Sub
  Open CommonDialog1.filename For Output As #1

  Write #1, cPointNum   'ポイント数を書く
  For n = 1 To cPointNum
    Write #1, PointOnLine(n).x, PointOnLine(n).y
  Next
  Close #1   'ファイルを閉じる
End Sub

ここで情報が適切に出力されているか,メモ帳などで開いてみること..

ファイルからの入力

Private Sub Command2_Click()
  LoadFile
End Sub

Private Sub LoadFIle()
  Dim n As Integer
  CommonDialog1.ShowOpen
  If CommonDialog1.filename = "" Then Exit Sub
  Open CommonDialog1.filename For Input As #1

  Input #1, cPointNum     'ポイント数を読む
  For n = 1 To cPointNum
   Input #1, PointOnLine(n).x, PointOnLine(n).y
  Next
  Close #1  'ファイルを閉じる
  DrawLine
End Sub

5)ファイルフォーマット統一の必要性

 ソフトウェアによって,独自にフォーマットを定めて図形を定義することになるが,このことにより,他のソフトウェアで作成したデータが読み込めないと問題がある.
 建築,土木分野では特に多くの業者が介在し,そのデータ交換も必要となる場合が多く,何らかの共通仕様が必要となる.(建設CALS)
  一般に普及している交換フォーマットとして,
 DXF  (AutoCADが開発した仕様だが,AutoCADのバージョンアップにより頻繁に仕様が変わる)
 IGES (米国で定めた仕様)
などがある.
 さらに近年は,ネットワーク上での情報交換を目的としたDWGなどがある.

 現在,ISO化が図られているSTEPという仕様が,いつの日か標準化する時代が来るであろう..
 (自動車業界などは既に導入しつつある.)

4.自由曲線を描く(パラメトリック曲線)

 CADで設計する物体は必ずしも直線や円などから構成されるわけではない.自動車のように曲線・曲面から構成される物体も多い.このような物体をCAD上でいかに扱うかは大きな課題であり,多くの研究とその開発が行われている.(現在も進行中である.)
 現在,一般に普及している自由曲線として
   スプライン曲線
   ベジェ曲線
   B-スプライン曲線
   NURBS曲線
 などがある.
 これらの曲線は,X,Y(3次元の場合にはZも含む)の曲線上の座標を1つのパラメタをもとにして表現するものであり,パラメトリック曲線と呼ばれる.
 曲線の描画には,任意の制御点を定義し,それに対して,パラメタを用いて,曲線を定義していく.
 

空間内に定められたP1(x1, y1, z1),P2(x2, y2, z2),P3(x3, y3, z3),P4(x4, y4, z4)の4点を境界条件として描く3次元の3次スプライン曲線上の座標値(x, y, z)は下式によって与えられる.

    (t1≦t≦t2 )

ただし,tはパラメータであり, t1,t2は始点と終点のパラメータ値である.Bi(t)は係数である.

それぞれの曲線の描画手法には,特徴(短所を伴う)があり,場合によって使い分けられている.


2)スプライン曲線の描画

 ここでは,スプライン曲線を描くためのプログラムを作成する.その理論はともかく,計算自体はそれほど難しいものではない.これは3次元の計算にもそのまま応用できる

スプライン曲線の計算

パラメータtの範囲を0≦t≦1,すなわちt1 = 0,t2 = 1として正規化した場合,3次スプラインの係数Bi(t)は,式(3-8)により求められる ).
 
 

    (0≦t≦1)

スプライン曲線描画のプログラム

Private Sub drawSpline()
  Dim x As Single, y As Single, b1 As Single, b2 As Single, b3 As Single, b4 As Single, t As Single
  Dim n As Integer

  If cPointNum < 4 Then
    MsgBox "Can't draw spline curve"
    Exit Sub
  End If
   'Picture1.Cls
  For n = 4 To cPointNum
    For t = 0 To 1.05 Step 0.2
       Debug.Print t
       b1 = -t * (t - 1) * (t - 2) / 6
       b2 = (t + 1) * (t - 1) * (t - 2) / 2
       b3 = -(t + 1) * t * (t - 2) / 2
       b4 = (t + 1) * t * (t - 1) / 6

       '以下の_は改行せずに打ち込むの意
       x = b1 * PointOnLine(n - 3).x + b2 * PointOnLine(n - 2).x + b3 * PointOnLine(n - 1).x_
       + b4 * PointOnLine(n).x
       y = b1 * PointOnLine(n - 3).y + b2 * PointOnLine(n - 2).y + b3 * PointOnLine(n - 1).y_
       + b4 * PointOnLine(n).y
       If t = 0 And n = 4 Then
         Picture1.PSet (x, y)
       Else
         Picture1.Line -(x, y), &HFF
       End If
    Next
  Next
End Sub

他の曲線(NURBSを除く)の描画に関しては,下記書籍が参考となる.

佐藤義雄「実習グラフィックス」アスキー出版局 1850円 但し言語はN88-BASIC