'点到直线的垂足
' P1 P2 为直线上的两点,确定了这条直线
' P3 为空间一点
' P4 为P3到直线P1P2的垂足
Function P2LineP(ByVal P1() As Double, ByVal P2() As Double, ByVal P3() As Double) As Object
'如果三点在一条直线上,则垂足就是P3点。
'直线P1-P2的向量{M(0),M(1),M(2)}
Dim M(5) As Double
M(0) = P2(0) - P1(0)
M(1) = P2(1) - P1(1)
M(2) = P2(2) - P1(2)
'直线P2-P3的向量{M(3),M(4),M(5)}
M(3) = P2(0) - P3(0)
M(4) = P2(1) - P3(1)
M(5) = P2(2) - P3(2)
Dim T As Double
T = -(M(0) * M(3) + M(1) * M(4) + M(2) * M(5)) / (M(0) ^ 2 + M(1) ^ 2 + M(2) ^ 2)
'垂足
Dim P4(2) As Double
P4(0) = M(0) * T + P2(0)
P4(1) = M(1) * T + P2(1)
P4(2) = M(2) * T + P2(2)
Return P4
End Function
' P1 P2 为直线上的两点,确定了这条直线
' P3 为空间一点
' P4 为P3到直线P1P2的垂足
Function P2LineP(ByVal P1() As Double, ByVal P2() As Double, ByVal P3() As Double) As Object
'如果三点在一条直线上,则垂足就是P3点。
'直线P1-P2的向量{M(0),M(1),M(2)}
Dim M(5) As Double
M(0) = P2(0) - P1(0)
M(1) = P2(1) - P1(1)
M(2) = P2(2) - P1(2)
'直线P2-P3的向量{M(3),M(4),M(5)}
M(3) = P2(0) - P3(0)
M(4) = P2(1) - P3(1)
M(5) = P2(2) - P3(2)
Dim T As Double
T = -(M(0) * M(3) + M(1) * M(4) + M(2) * M(5)) / (M(0) ^ 2 + M(1) ^ 2 + M(2) ^ 2)
'垂足
Dim P4(2) As Double
P4(0) = M(0) * T + P2(0)
P4(1) = M(1) * T + P2(1)
P4(2) = M(2) * T + P2(2)
Return P4
End Function
http://bbs.mjtd.com/thread-81725-1-1.html
点到直线的垂足
[CommandMethod("t11")]
public static void Test11()
{
var db = HostApplicationServices.WorkingDatabase;
var doc = Application.DocumentManager.GetDocument(db);
var ed = doc.Editor;
var resEnt = ed.GetEntity("\n请选择一条直线:");
if (resEnt.Status != PromptStatus.OK)
return;
var resPnt = ed.GetPoint("\n请选择直线外的一点:");
if (resPnt.Status != PromptStatus.OK)
return;
using (var tr = db.TransactionManager.StartTransaction())
{
Line line = resEnt.ObjectId.GetObject(OpenMode.ForRead) as Line;
LineSegment3d ls3d = new LineSegment3d(line.StartPoint, line.EndPoint); ;
Line3d l3d = new Line3d(line.StartPoint, line.EndPoint);
Point3d pt1 = resPnt.Value;
Point3d pt2 = l3d.GetClosestPointTo(pt1).Point;
ed.WriteMessage
(
"\n点{0}\n到直线的垂足为{1};\n距离为{2};\n在直线{3}",
pt1,
pt2,
(pt2 - pt1).Length,
ls3d.IsOn(pt2) ? "内" : "外"
);
ed.DrawVector(pt1, pt2, 1, false);
}
}
[本日志由 tiancao1001 于 2018-07-26 00:30 AM 编辑]
|
暂时没有评论
发表评论 - 不要忘了输入验证码哦! |