曲面を表す式の形が z=f(x,y)の形をしている場合、これを線図で立体的に表示させる一つの方法に ScanLine法があります。これは、関数zをx-z面、もしくはy-z面に並行な面で輪切りにし、切断面の描く曲線を視点に近い方から作図させます。このとき、作図面上に、既に作図した図形を囲む領域を作っておいて、曲線がその領域の内側にあれば線を引かず、領域の外にあれば線を引くと同時に新しく作図領域を広げます。輪切りにするメッシュ間隔を狭くすると隠れ線の境界が滑らかになりますが、線の間隔が詰まり過ぎて見難い図になります。
この方法で曲面図形を作図させるとき、3次元図形から2次元図形への投影変換が必要です。変換原理にはカメラでの撮影と同じ原理の中心投影法が自然に見えますが、望遠カメラで観察すると平行投影に近づきます。この例題では中心投影を使います。この設定は、仮想のカメラを、ある世界座標空間に置き、そこから原点を視野に納めます。曲面は中心を世界座標の原点に置くようにしますと、全体図形が程よく納まります。ただし、図形の高さによって図が多少上下または左右に触れますので、作図のウインドウ(Dpwind)を少し調整します。
Public Sub Proc7() '--- Surface Drawing of z=f(x,y) by ScanLine Method Dim Gmax(-320 To 320), Gmin(-320 To 320) Dim Igra Dim x, y, z, xi, yi, zi, xo, yo, zo, stepx, stepy, rr Dim ths, ss, th1, th2, thy, thz Dim ii, IX, iy Select Case Ivar Case 1: thy = 0.01 Case 2: thy = 1 Case 3: thy = 1.7 Case 4: thy = 2.7 Case Else: thy = 0.01 End Select '------ Working mesh For ii = -320 To 320 Gmin(ii) = 320: Gmax(ii) = -320 Next ii Dperas Dpwind 0, -10, 640 '------ Camera Position CamP(1) = 880 CamP(2) = 0 CamP(3) = 1000 Dpcam 0.6, 0, Flen ths = -3 * pie / 2 stepx = 4 stepy = 2 ss = 3 * pie * stepx / 400 rr = 70 thz = 0.7 th2 = ths Igra = 0 For IX = 200 To -200 Step -stepx x = IX: Igra = 0: th1 = ths For iy = -200 To 200 Step stepy y = iy z = rr * (Cos(th1) _ + Cos(th1) * Cos(th2) _ + Cos(th2)) xi = x: yi = y: Rotz xi, yi, xo, yo, thz zi = z: xi = xo: Roty zi, xi, zo, xo, thy Projection xo, yo, zo Call Mm_graphics(Gmin(), Gmax(), Igra) th1 = th1 + ss / 2 Next iy th2 = th2 + ss Next IX Dptext 150, 170, ("thy=" + CStr(thy)) End Sub '===================================================== Private Sub Mm_graphics(Gmin(), Gmax(), Igra) Static gx, gy, mgx As Double, mgy As Double gx = Int(Gxxx + 0.5): gy = Int(Gyyy + 0.5) If gy <= Gmin(gx) Or gy >= Gmax(gx) Then If Igra = 1 Then Dpmove mgx, mgy Dpdraw gx, gy End If mgx = gx: mgy = gy If gy < Gmin(gx) Then Gmin(gx) = gy If gy > Gmax(gx) Then Gmax(gx) = gy Igra = 1 Else Igra = 0 End If End Sub