第二节 数字积分法插补原理实验
一、实验目的
1.掌握数字积分法直线与圆弧插补的基本原理
2.掌握数字积分法直线插补与圆弧插补的程序编制方法
3.加深对数字积分法插补的理解
二、实验原理
数字积分法的基本原理是,使用一系列的小矩形面积之和来近似轮廓曲线函数积分的整个面积。此处为方便理解,从物理上来进行DDA插补的分析。
1.直线插补
设直线的终点坐标为(Xe,Ye),现取容器两个:Qx和Qy,其容量相等,均为Q≥MAX(Xe,Ye)。按一定的节拍不断将Xe值加入Qx,同时将Ye值加入Qy;若Qx中的值超过Q,则在X方向发一个脉冲,若Qy中的值超过Q,则在Y方向发一个脉冲,注意,两个方向发脉冲的过程是相互独立的事件。显然,若Xe>Ye,则X方向脉冲发得较快;若Xe=Ye,则两个方向脉冲发得一样快;若Ye>Xe,则Y方向脉冲发得较快。
可得软件框图如下(图4-11)。
实际上,数字积分直线插补的物理意义是使插补点沿着速度矢量的方向上进给,对于圆弧插补,这同样适用。
2.圆弧插补
圆弧DDA插补与直线DDA插补有以下不同:
(1)直线插补时为常量(终点坐标)累加,圆弧插补时为变量(动点坐标)累加。
(2)直线插补时,Qx中放的是终点X坐标,Qy中放的是终点Y坐标;而圆弧插补时,Qx中放的是动点Y坐标,Qy中放的是动点X坐标。
可得圆弧DDA插补的软件框图(图4-12)。
图4-12 数字积分法圆弧插补软件框图
3.参考程序
直线:
Sub 插补X()
标志X = 0
If 余数X >= Q Then
余数X = 余数X Mod Q
x动点 = x动点 + 1: 标志X = 1
End If
End Sub
Sub 插补Y()
标志Y = 0
If 余数Y >= Q Then
余数Y = 余数Y Mod Q
y动点 = y动点 + 1: 标志Y = 1
End If
End Sub
Sub 插补Z()
标志Z = 0
If 余数Z >= Q Then
余数Z = 余数Z Mod Q
z动点 = z动点 + 1: 标志Z = 1
End If
End Sub
Sub 插补公共()
余数X = 余数X + x终点
余数Y = 余数Y + y终点
余数Z = 余数Z + z终点
插补X
插补Y
插补Z
插补记录 = 插补记录 + 1
End Sub
Sub 插补()
Dim c As Integer
插补记录 = 0: 余数X = 0: 余数Y = 0: 余数Z = 0: 划轮廓线
PSet (z原点, x原点), vbRed
Select Case 象限标志
Case 1: ''第一象限插补
Do Until 插补记录 = Q
插补公共
Line -Step(z步长 × 标志Z, x步长 × 标志X), vbRed
Loop
Case 2: ''第二象限插补
c = x终点: x终点 = z终点: z终点 = -c
c = x步长: x步长 = z步长: z步长 = -c
Do Until 插补记录 = Q
插补公共
Line -Step(x步长 × 标志X, z步长 × 标志Z), vbRed
Loop
Case 3: ''第三象限插补
x终点 = -x终点: z终点 = -z终点
x步长 = -x步长: z步长 = -z步长
Do Until 插补记录 = Q
插补公共
Line -Step(z步长 × 标志Z, x步长 × 标志X), vbRed
Loop
Case 4: ''第四象限插补
c = x终点: x终点 = -z终点: z终点 = c
c = x步长: x步长 = -z步长: z步长 = c
Do Until 插补记录 = Q
插补公共
Line -Step(x步长 × 标志X, z步长 × 标志Z), vbRed
Loop
End Select
End Sub
圆弧:
Sub 插补()
PSet (z原点, x原点), vbRed
余数X = 0: 余数Y = 0: 余数Z = 0: 插补记录 = 0:
过象限标志 = 0: 跨象限数量 = 0
If Opt逆圆 = False Then
xx: 跨象限数量 = 跨象限数量 + 1
Select Case 象限标志
Case 1: ''第一象限插补
过象限预处理
Do Until (x动点对圆心 - x终点对圆心) ^ 2 + (z动点对圆心 - z终点对圆心) ^ 2 <= 跨象限数量 ^ 2
If x动点对圆心 = 0 Then
象限标志 = 2:
过象限标志 = 1
GoTo xx
End If
插补公共
Line -Step(z步长 × 标志Z, -x步长 × 标志X), vbRed
Loop
过象限标志 = 0
Case 2: ''第二象限插补
过象限预处理
Do Until (x动点对圆心 - x终点对圆心) ^ 2 + (z动点对圆心 - z终点对圆心) ^ 2 <= 跨象限数量 ^ 2
If x动点对圆心 = 0 Then
象限标志 = 3:
过象限标志 = 1
GoTo xx
End If
插补公共
Line -Step(-x步长 × 标志X, z步长 × 标志Z), vbRed
Loop
过象限标志 = 0
Case 3: ''第三象限插补
过象限预处理
Do Until (x动点对圆心 - x终点对圆心) ^ 2 + (z动点对圆心 - z终点对圆心) ^ 2 <= 跨象限数量 ^ 2
If x动点对圆心 = 0 Then
象限标志 = 4:
过象限标志 = 1
GoTo xx
End If
插补公共
Line -Step(z步长 × 标志Z, -x步长 × 标志X), vbRed
Loop
过象限标志 = 0
Case 4: ''第四象限插补
过象限预处理
Do Until (x动点对圆心 - x终点对圆心) ^ 2 + (z动点对圆心 - z终点对圆心) ^ 2 <= 跨象限数量 ^ 2
If x动点对圆心 = 0 Then
象限标志 = 1:
过象限标志 = 1
GoTo xx
End If
插补公共
Line -Step(-x步长 × 标志X, z步长 ×标志Z), vbRed
Loop
过象限标志 = 0
End Select
Else
xy: 跨象限数量 = 跨象限数量 + 1
Select Case 象限标志
Case 1: ''第一象限插补
过象限预处理
Do Until (x动点对圆心 - x终点对圆心) ^ 2 + (z动点对圆心 - z终点对圆心) ^ 2 <= 跨象限数量 ^ 2
单步连续判断
If z动点对圆心 = 0 Then
象限标志 = 4:
过象限标志 = 1
GoTo xy
End If
插补公共
Line -Step(-z步长 × 标志Z, x步长 × 标志X), vbRed
Loop
过象限标志 = 0
Case 2: ''第二象限插补
过象限预处理
Do Until (x动点对圆心 - x终点对圆心) ^ 2 + (z动点对圆心 - z终点对圆心) ^ 2 <= 跨象限数量 ^ 2
单步连续判断
If z动点对圆心 = 0 Then
象限标志 = 1:
过象限标志 = 1
GoTo xy
End If
插补公共
Line -Step(x步长 × 标志X, -z步长 × 标志Z), vbRed
Loop
过象限标志 = 0
Case 3: ''第三象限插补
过象限预处理
Do Until (x动点对圆心 - x终点对圆心) ^ 2 + (z动点对圆心 - z终点对圆心) ^ 2 <= 跨象限数量 ^ 2
If z动点对圆心 = 0 Then
象限标志 = 2:
过象限标志 = 1
GoTo xy
End If
插补公共
Line -Step(-z步长 × 标志Z, x步长 × 标志X), vbRed
Loop
过象限标志 = 0
Case 4: ''第四象限插补
过象限预处理
Do Until (x动点对圆心 - x终点对圆心) ^ 2 + (z动点对圆心 - z终点对圆心) ^ 2 <= 跨象限数量 ^ 2
If z动点对圆心 = 0 Then
象限标志 = 3:
过象限标志 = 1
GoTo xy
End If
插补公共
Line -Step(x步长 × 标志X, -z步长 × 标志Z), vbRed
Loop
过象限标志 = 0
End Select
cc: End If
End Sub