我没有访问AutoCAD/VBA的权限,但使用Excel/VBA编写了以下内容,您可以将其应用于AutoCAD/VBA。
我使用了一些向量代数(即叉积)而不是tri来确定圆弧与径向线的垂直线,因为它避免了垂直线(斜率=0)的潜在问题。请注意,对向180°的弧将导致错误,因为到弧端点的切线是平行的,因此不相交。
- Sub ArcVertex()
- Range("B2:b2").Select
- p1x = ActiveCell.Value
- ActiveCell.Offset(0, 1).Select
- p1y = ActiveCell.Value
- ActiveCell.Offset(1, -1).Select
- p2x = ActiveCell.Value
- ActiveCell.Offset(0, 1).Select
- p2y = ActiveCell.Value
- ActiveCell.Offset(1, -1).Select
- pcenx = ActiveCell.Value
- ActiveCell.Offset(0, 1).Select
- pceny = ActiveCell.Value
- Call cross(pcenx - p1x, pceny - p1y, 0, 0, 0, 1, p3x, p3y, p3z)
- p3x = p3x + p1x
- p3y = p3y + p1y
- Call cross(pcenx - p2x, pceny - p2y, 0, 0, 0, 1, p4x, p4y, p4z)
- p4x = p4x + p2x
- p4y = p4y + p2y
- Range("B6:B6").Select
- ActiveCell.Value = p3x
- ActiveCell.Offset(0, 1).Select
- ActiveCell.Value = p3y
- ActiveCell.Offset(1, -1).Select
- ActiveCell.Value = p4x
- ActiveCell.Offset(0, 1).Select
- ActiveCell.Value = p4y
- pintx = ((p3x * p1y - p1x * p3y) * (p4x - p2x) - (p4x * p2y - p2x * p4y) * (p3x - p1x)) / _
- ((p3x - p1x) * (p4y - p2y) - (p4x - p2x) * (p3y - p1y))
- pinty = ((p3x * p1y - p1x * p3y) * (p4y - p2y) - (p4x * p2y - p2x * p4y) * (p3y - p1y)) / _
- ((p3x - p1x) * (p4y - p2y) - (p4x - p2x) * (p3y - p1y))
- ActiveCell.Offset(1, -1).Select
- ActiveCell.Value = pintx
- ActiveCell.Offset(0, 1).Select
- ActiveCell.Value = pinty
- End Sub
- Sub cross(ax, ay, az, bx, by, bz, cx, cy, cz)
- cx = ay * bz - az * by
- cy = az * bx - ax * bz
- cz = ax * by - ay * bx
- End Sub
|