|
楼主 |
发表于 2016-10-15 11:40
|
显示全部楼层
- Type kjPoint
- x As Double
- y As Double
- z As Double
- End Type
- Sub lqxs()
- Dim ptA As kjPoint, ptB As kjPoint, ptC As kjPoint, n&
- Dim ABFa, ABFb, ABFc, ACFa, ACFb, ACFc, BCFa, BCFb, BCFc
- Dim ABl, ACl, BCl
- Dim zd, ABz_x, ABz_y, ACz_x, ACz_y
- Dim ABzxFa, ABzxFb, ABzxFc, ACzxFa, ACzxFb, ACzxFc
- Dim ABsz_z, BCzl
- Dim zx_x, zx_y, zx_z
- ptA.x = [c5].Value: ptA.y = [d5].Value: ptA.z = [e5].Value '点A坐标
- ptB.x = [c6].Value: ptB.y = [d6].Value: ptB.z = [e6].Value '点B坐标
- ptC.x = [c7].Value: ptC.y = [d7].Value: ptC.z = [e7].Value '点C坐标
- 'XY平面
- ABFa = ptB.y - ptA.y: ABFb = ptA.x - ptB.x: ABFc = -ABFb * ptA.y - ABFa * ptA.x '直线AB的方程系数'
- BCFa = ptC.y - ptB.y: BCFb = ptB.x - ptC.x: BCFc = -BCFb * ptB.y - BCFa * ptB.x '直线BC的方程系数'
- ACFa = ptC.y - ptA.y: ACFb = ptA.x - ptC.x: ACFc = -ACFb * ptA.y - ACFa * ptA.x '直线AC的方程系数'
- ABl = dist(ptA.x, ptA.y, ptB.x, ptB.y) '直线AB的XY平面的投影长度
- ACl = dist(ptA.x, ptA.y, ptC.x, ptC.y) '直线AC的XY平面的投影长度
- BCl = dist(ptB.x, ptB.y, ptC.x, ptC.y) '直线BC的XY平面的投影长度
- 'D'坐标
- zd = (ptA.x - ptB.x) / 2
- ABz_x = zd + ptB.x
- zd = (ptA.y - ptB.y) / 2
- ABz_y = zd + ptB.y
- 'G'坐标
- zd = (ptA.x - ptC.x) / 2
- ACz_x = zd + ptC.x
- zd = (ptA.y - ptC.y) / 2
- ACz_y = zd + ptC.y
- 'AB垂直平分线方程的系数
- ABzxFa = ABFb: ABzxFb = -ABFa: ABzxFc = ABFa * ABz_y - ABFb * ABz_x
- 'AC垂直线方程的系数
- ACzxFa = ACFb: ACzxFb = -ACFa: ACzxFc = ACFa * ACz_y - ACFb * ACz_x
- '圆心x,y坐标
- zx_x = jiaox1(ABzxFa, ABzxFb, ABzxFc, ACzxFa, ACzxFb, ACzxFc)
- zx_y = jiaoy1(ABzxFa, ABzxFb, ABzxFc, ACzxFa, ACzxFb, ACzxFc)
- 'AB垂直平分线与BC的交点坐标(F')
- abzx2bc_x = jiaox1(ABzxFa, ABzxFb, ABzxFc, BCFa, BCFb, BCFc)
- abzx2bc_y = jiaoy1(ABzxFa, ABzxFb, ABzxFc, BCFa, BCFb, BCFc)
- D_z = (ptA.z - ptB.z) / 2 + ptB.z
- dol = dist(ABz_x, ABz_y, zx_x, zx_y)
- If ptB.x <= ptC.x Then xmin = ptB.x: xmax = ptC.x Else xmin = ptC.x: xmax = ptB.x
- If ptB.y <= ptC.y Then ymin = ptB.y: ymax = ptC.y Else ymin = ptC.y: ymax = ptB.y
- If abzx2bc_x >= xmin And abzx2bc_x <= xmax Then
- 'B'F'长度 ' 直线BC上B点到垂直线交点的XY平面的投影长度
- BFl = dist(ptB.x, ptB.y, abzx2bc_x, abzx2bc_y)
- 'AB中线D的Z轴坐标值
- 'F点的Z值 AB垂直平分线与BC交点的Z轴坐标值
- F_z = BFl / BCl * (ptC.z - ptB.z) + ptB.z
- dfl = dist(ABz_x, ABz_y, abzx2bc_x, abzx2bc_y)
- 'dol = dist(ABz_x, ABz_y, zx_x, zx_y)
- Bl = dol / dfl
- '圆心z坐标
- zx_z = Bl * (F_z - D_z) + D_z
- Else
- abzx2ac_x = jiaox1(ABzxFa, ABzxFb, ABzxFc, ACFa, ACFb, ACFc)
- abzx2ac_y = jiaoy1(ABzxFa, ABzxFb, ABzxFc, ACFa, ACFb, ACFc)
- If ptA.x <= ptC.x Then xmin = ptA.x: xmax = ptC.x Else xmin = ptC.x: xmax = ptA.x
- If ptA.y <= ptC.y Then ymin = ptA.y: ymax = ptC.y Else ymin = ptC.y: ymax = ptA.y
- If abzx2ac_x >= xmin And abzx2ac_x <= xmax Then
- AGl = dist(ptA.x, ptA.y, abzx2ac_x, abzx2ac_y)
- G_z = AGl / ACl * (ptC.z - ptA.z) + ptA.z
- dgl = dist(ABz_x, ABz_y, abzx2ac_x, abzx2ac_y)
- Bl = dol / dgl
- zx_z = Bl * (G_z - D_z) + D_z
- End If
- End If
- MsgBox "外接圆心的坐标是 (" & Format(zx_x, "0.0000") & "," & Format(zx_y, "0.0000") & "," & Format(zx_z, "0.0000") & ")"
- End Sub
- '直线交点的X坐标
- Function jiaox1(ca1, cb1, cc1, ca2, cb2, cc2)
- jiaox1 = (cc2 * cb1 - cc1 * cb2) / (ca1 * cb2 - ca2 * cb1)
- End Function
- Function jiaoy1(ca1, cb1, cc1, ca2, cb2, cc2)
- jiaoy1 = -(ca1 * cc2 - ca2 * cc1) / (ca1 * cb2 - ca2 * cb1)
- End Function
- Function dist(cordx1, cordy1, cordx2, cordy2)
- dist = Sqr((cordx2 - cordx1) ^ 2 + (cordy2 - cordy1) ^ 2)
- End Function
复制代码 |
|