diff --git a/src/IFoxCAD.Cad/ExtensionMethod/IsOnLine b/src/IFoxCAD.Cad/ExtensionMethod/IsOnLine new file mode 100644 index 0000000000000000000000000000000000000000..61bb01ec53336036238d8b463f4aeaaaf8be5e59 --- /dev/null +++ b/src/IFoxCAD.Cad/ExtensionMethod/IsOnLine @@ -0,0 +1,96 @@ + /// + /// 判断点与另外两点的位置关系 + /// + /// 基点 + /// 起点 + /// 终点 + /// 容差 + /// 枚举类型 + public static PointOnlineType IsOnLine(this Point3d Point, Point3d StartPoint, Point3d EndPoint, double dTol) + { + //以点Point为坐标系Y轴与直线的交点距离,正值则点在直线之上,负值则点在直线之下,零则在直线上 + var dd = (Point.X - StartPoint.X) * (StartPoint.Y - EndPoint.Y) - (Point.Y - StartPoint.Y) * (EndPoint.X - StartPoint.X); + //点StartPoint与点EndPoint的直线距离 + var d12 = Math.Abs(StartPoint.DistanceTo(EndPoint)); + //点Point与点StartPoint的直线距离 + var d01 = Math.Abs(Point.DistanceTo(StartPoint)); + //点Point与点EndPoint的直线距离 + var d02 = Math.Abs(Point.DistanceTo(EndPoint)); + if (dd >0) + { + return PointOnlineType.OnLineUp; + } + else if (dd < 0) + { + return PointOnlineType.OnLineDown; + } + else + { + //点Point在直线起点段的延长线上 + if (d02.Equals(d01 + d12)) + { + //点Point在直线起点段的延长线上且小于等于误差长度 + if (d01 <= dTol) + { + return PointOnlineType.ExtendLineStartPointIn; + } + else + { + return PointOnlineType.ExtendLineStartPointOut; + } + } + //点Point在直线终点段的延长线上 + else if (d01.Equals(d02 + d12)) + { + //点Point在直线终点段的延长线上且小于等于误差长度 + if (d02 <= dTol) + { + return PointOnlineType.ExtendLineEndPointIn; + } + else + { + return PointOnlineType.ExtendLineEndPointOut; + } + } + //点Point在直线两点之间 + else + { + return PointOnlineType.OnLine; + } + } + } + + /// +/// 点与直线关系类型枚举 +/// +public enum PointOnlineType +{ + /// + /// 直线上两点之间 + /// + OnLine, + /// + /// 直线延长线起点误差距离之内 + /// + ExtendLineStartPointIn, + /// + /// 直线延长线起点误差距离之外 + /// + ExtendLineStartPointOut, + /// + /// 直线延长线终点误差距离之内 + /// + ExtendLineEndPointIn, + /// + /// 直线延长线终点误差距离之外 + /// + ExtendLineEndPointOut, + /// + /// 直线之上 + /// + OnLineUp, + /// + /// 直线之下 + /// + OnLineDown, +} \ No newline at end of file