drawtiles サブルーチンと drow サブルーチンは、歩道の円形タイルの作成と計算に使用します。
円形タイルは、1 番目の引数で指定された歩道に沿って指定された距離に描画され、列は 2 番目の引数で指定された距離だけ歩道に垂直にオフセットされます。各円形タイルは、gpuser サブルーチンで取得され、前に定義したグローバル変数に格納された値に基づいて、庭園の歩道の輪郭内に描画されます。タイルの各列が描画されるにつれて、描画される後続の列それぞれが、より多くの空間を埋め、より整った配列となるようにオフセットされて描画されます。
' Place one row of tiles the given distance along path
' and possibly offset it
Private Sub drow(pd As Double, offset As Double)
Dim pfirst(0 To 2) As Double
Dim pctile(0 To 2) As Double
Dim pltile(0 To 2) As Double
Dim cir As AcadCircle
Dim varRet As Variant
varRet = ThisDrawing.Utility.PolarPoint(sp, pangle, pd)
pfirst(0) = varRet(0)
pfirst(1) = varRet(1)
pfirst(2) = varRet(2)
varRet = ThisDrawing.Utility.PolarPoint(pfirst, angp90, offset)
pctile(0) = varRet(0)
pctile(1) = varRet(1)
pctile(2) = varRet(2)
pltile(0) = pctile(0)
pltile(1) = pctile(1)
pltile(2) = pctile(2)
Do While distance(pfirst, pltile) < (hwidth - trad)
Set cir = ThisDrawing.ModelSpace.AddCircle(pltile, trad)
varRet = ThisDrawing.Utility.PolarPoint(pltile, angp90, (tspac + trad + trad))
pltile(0) = varRet(0)
pltile(1) = varRet(1)
pltile(2) = varRet(2)
Loop
varRet = ThisDrawing.Utility.PolarPoint(pctile, angm90, tspac + trad + trad)
pltile(0) = varRet(0)
pltile(1) = varRet(1)
pltile(2) = varRet(2)
Do While distance(pfirst, pltile) < (hwidth - trad)
Set cir = ThisDrawing.ModelSpace.AddCircle(pltile, trad)
varRet = ThisDrawing.Utility.PolarPoint( _
pltile, angm90, (tspac + trad + trad))
pltile(0) = varRet(0)
pltile(1) = varRet(1)
pltile(2) = varRet(2)
Loop
End Sub
drow サブルーチンは、円形タイルを 1 列だけ描画しますが、While ループとともに使用することで、円形タイルのすべての列を繰り返し描画するようにすることができます。上の図に示すように、隣り合った列のタイルは正三角形を形成します。これらの正三角形の辺の長さは、タイルの半径の 2 倍とタイル間の間隔の和と等しくなっています。したがって、三角法では、歩道上の列の間隔は 60°の正弦にこの値を掛けた値となり、奇数列のオフセットは 60°の余弦にこの値を掛けた値となります。
If 文は、1 列おきに強制的にオフセットするために使用されています。offset 変数が 0 (ゼロ)の場合、前に説明したように、実際のオフセットはタイルの中心間の距離と 60°の余弦の積に設定されます。offset 変数が 0 でない場合、オフセットは 0 に設定されます。このサブルーチンによって自由にタイルのオフセットを設定できます。
' Draw the rows of tiles
Private Sub drawtiles()
Dim pdist As Double
Dim offset As Double
pdist = trad + tspac
offset = 0
Do While pdist <= (plength - trad)
drow pdist, offset
pdist = pdist + ((tspac + trad + trad) * Sin(dtr(60)))
If offset = 0 Then
offset = (tspac + trad + trad) * Cos(dtr(60))
Else
offset = 0
End If
Loop
End Sub