簡単な数学関数の応用で得られる幾何学図形の幾つかを例示しました。プログラムそのものは短いものです。この例題のCardioid とNephroidとは、 FILE/DataSaveメニューでメタファイルに作成すると、円を描くデータが並びます。DataReadメニューで読み出して結果を比較すると面白いでしょう。円の塗りつぶしのモードを、メニューからLine, FillStyle, Transparentの順で設定しておいて、DataReadメニューでメタファイル読み出して結果を比較すると下の図を再現させることができます。
Public Sub Proc18() 'Cardioid etc. Dim ift ift = FormGraphic.Picture1.FillStyle '-----save FillStyle FormGraphic.Picture1.FillStyle = 1 Dperas Dpwind 0, 0, 640 Select Case Ivar Case 1: Cardioid '---- Cardioid Case 2: Nephroid '---- Nephroid Case 3: Archimedes '---- Archimedean Spiral Case 4: Clothoid '---- Cornu's Spiral Case Else: Cardioid End Select FormGraphic.Picture1.FillStyle = ift '---- restore FillStyle End Sub '----------------------------------------------- Cardioid Private Sub Cardioid() r = 80: e = r For ang = 0 To 360 Step 6 Th = ang * pie / 180 d = e * Sqr(2 - 2 * Cos(Th)) X = r * Cos(Th) Y = r * Sin(Th) Dpcirc X, Y, d Next Dptext 100, 200, "cardioid" End Sub
'---- Nephroid Private Sub Nephroid() r = 100: e = r For ang = 0 To 360 Step 5 Th = ang * pie / 180 d = Abs(e * Sin(Th)) X = r * Cos(Th) Y = r * Sin(Th) Dpcirc X, Y, d Next Dptext 100, 200, "nephroid" End Sub
'---- Archimedean Spiral Private Sub Archimedes() a = 4.5 For ang = 0 To 360 * 8 Step 8 Th = ang * pie / 180 r = a * Th X = r * Cos(Th) Y = r * Sin(Th) If ang = 0 Then Dpmove X, Y Else Dpdraw X, Y End If Next Dptext 100, 200, "Archimedean Spiral" End Sub
高速道路や高速鉄道の緩和曲線として知られているクロソイドは、数学ではCornu's Spiralと呼ばれている曲線の原点付近の性質を利用したものです。
'---- Cornu's Spiral Private Sub Clothoid() 'Cornu's Spiral Dim segl, ang0, fk, tr, el, dx, dy, sc, xleft, ytop sc = Www * 0.25 '---- magnification factor xleft = Www / 2 ytop = xleft * Gaspect0 Dpmove -xleft, 0 Dpdraw xleft, 0 Dpmove 0, ytop Dpdraw 0, -ytop ' N = 200 Th = 8 * pie '----- four round spiral segl = Sqr(Th * 2) / N ang0 = segl * segl / 6 For j = 1 To -1 Step -2 Dpmove 0, 0 X = (sc * j) * segl: Y = 0 Dpdraw X, Y For i = 1 To N fk = 1 - 3 * i + 3 * CSng(i) * i ang = ang0 * fk tr = segl * segl * (i + i - 1) tr = 1 - tr * tr / 96: el = (sc * j) * segl * tr dx = el * Cos(ang) dy = el * Sin(ang) X = X + dx: Y = Y + dy Dpdraw X, Y Next Next Dptext 10, 200, "Clothoid" End Sub