题目的意思没有说清楚,分两种情况:
设直线两端点为AB,点为C
1、点在直线上,即已知垂足,很简单,求出AB与X轴的夹角(用AngleFromXAxis(Point1, Point2))即可得到,此角加 PI/2 即为垂线与X轴夹角,用PolarPoint(Point, Angle, Distance)或极坐标,可得到垂线上任意一点坐标,垂线就可以画出来。
2、点在直线外,即垂足未知(这需要先判断点确实不在直线或其延长线上,可以分别求AC、BC与X轴夹角,非常接近0或PI 即为在直线上)。可以以AC或BC为直径,画圆,用IntersectWith(IntersectObject, ExtendOption)方法可以求出圆与AB的两个交点,其中一个为A(以AC为直径)或B点(以BC为直径),另一个为垂足D点。
AngleFromXAxis(Point1, Point2)比较好用,但在CAD中有时不太方便,比如在比较大的循环中使用时很耗时间,Undo时也比较麻烦。我一般习惯自己编写函数。以下是求直线AB与X轴夹角的函数,使用时要注意起点坐标在前,终点坐标在后,返回值为弧度。MConstdblPI为常量PI值,建议作为全局常量赋值,大小为3.14159265358979 。
 - Function GetAngle(mydblPntAX As Double, mydblPntAY As Double, mydblPntBX As Double, mydblPntBY As Double) As Double
- Dim dblDeltaX As Double
- Dim dblDeltaY As Double
- Dim dblTmpAngle As Double
- Dim dbltmpTGAngle As Double
- dblDeltaX = mydblPntBX - mydblPntAX
- dblDeltaY = mydblPntBY - mydblPntAY
-
- If dblDeltaX = 0 Then
- dblTmpAngle = IIf(dblDeltaY >= 0, MConstdblPI / 2, 3 * MConstdblPI / 2)
- Else
- If dblDeltaY = 0 Then
- dblTmpAngle = IIf(dblDeltaX >= 0, 0#, MConstdblPI)
- Else
- dbltmpTGAngle = dblDeltaY / dblDeltaX
- If dblDeltaX > 0 Then
- dblTmpAngle = Atn(dbltmpTGAngle)
- Else
- dblTmpAngle = Atn(dbltmpTGAngle) + MConstdblPI
- End If
- End If
- End If
- GetAngle = dblTmpAngle
- End Function
|