现在已经开发了用户输入子例程和用于绘制轮廓的子例程,下面将用圆形瓷砖来填充小路。该任务需要一些几何图形。
在 VBA IDE 的“代码”窗口中,在 drawout 子例程后面输入下列代码:
' 按沿小路的给定距离放置一行瓷砖
' 并且可能需要偏移
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
' 绘制每行瓷砖
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))
否则
offset = 0
End If
Loop
End Sub
要理解这些子例程如何工作,请参考下面的图解。子例程 drow 按其第一个参数指定的沿小路的给定距离绘制一行瓷砖,并沿垂直小路方向将行偏移由第二个参数指定的距离。可以交替偏移瓷砖行以覆盖更多空间,并使排列更美观。
drow 子例程使用 PolarPoint 方法找到第一行的位置,并以第一个参数指定的距离沿小路移动。然后该子例程再次使用 PolarPoint 方法沿垂直小路方向移动偏移距离。该子例程使用 While 语句继续绘制圆,直至遇到小路的边。第一个 While 语句中的 PolarPoint 方法按两个瓷砖半径 (trad) 和一个瓷砖间间距 (tspac) 的距离移动到下一个瓷砖的位置。然后第二个 while 循环绘制垂直小路方向的行中的瓷砖,直至遇到另一边。
drawtiles 子例程重复调用 drow 来绘制所有的瓷砖行。该子例程的 While 循环沿小路前进,为每行调用 drow。相邻行的瓷砖构成了等边三角形,如前面的图解所示。这些三角形的边长等于两个瓷砖半径加上一个瓷砖间距。因此,可以利用三角函数进行计算,即两行之间沿小路方向的距离是 60 度正弦乘以边长,奇数行的偏移是 60 度余弦乘以边长。
drawtiles 中使用了 If 语句来实现隔行偏移。如果偏移值为 0,则将它设置为瓷砖中心之间间距乘以 60 度余弦,如前所述。如果偏移值不为 0,则将它设置为 0。这将如希望的那样交替设置行的偏移值。