如上图所示两种情况,代码如下:
/// <summary>
/// 求空间某点到线段的垂直交点
/// </summary>
/// <param name="A">点</param>
/// <param name="BC">线段</param>
/// <returns></returns>
public Autodesk.Revit.DB.XYZ GetPointToLineVecIntersection(XYZ A, Line BC)
{
XYZ normal = BC.Direction.Normalize();
XYZ dir = XYZ.BasisZ;
//垂直于BC的法线
XYZ cross = normal.CrossProduct(dir);
Line AD = Autodesk.Revit.DB.Line.CreateUnbound(A, cross);
//求BC与AD的交点
IntersectionResultArray results;
Autodesk.Revit.DB.SetComparisonResult result = BC.Intersect(AD, out results);
//重叠,没有重叠就是平行
if (result != Autodesk.Revit.DB.SetComparisonResult.Overlap)
return null;
//没有交点或者交点不是1个
if (results == null || results.Size != 1)
return null;
//取得交点
IntersectionResult iResult = results.get_Item(0);
//取得交点坐标
Autodesk.Revit.DB.XYZ intersectionPoint = iResult.XYZPoint;
return intersectionPoint;
}