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