namespace IStation.Model { /// /// 直线辅助类 /// public static class CurveLineHelper { /// /// 获取插值Y /// public static double GetInsertY(double x1, double y1, double x2, double y2, double x) { return new CurveLine(x1, y1, x2, y2).GetInsertY(x); } /// /// 是否一个点向x轴的射线穿透线段,有交点且在线的左边 /// public static bool IsIntersectLeft(CurvePoint pt1, CurvePoint pt2, CurvePoint pt) { return new CurveLine(pt1, pt2).IsIntersectLeft(pt); } /// /// 是否一个点向x轴的射线穿透线段,有交点且在线的左边 /// public static bool IsIntersectLeft(double x1, double y1, double x2, double y2, double x, double y) { return new CurveLine(x1, y1, x2, y2).IsIntersectLeft(new CurvePoint(x, y)); } /// /// X1和X2之间连一条线, 在比率ratio处点的坐标 /// public static double GetInnerX(double x1, double x2, double ratio) { double x = x1 + ratio * (x2 - x1); return x; } /// /// X1,Y1和X2 Y2之间连一条线,在X处点的Y坐标 /// public static double GetYbyX(double x1, double y1, double x2, double y2, double x) { return new CurveLine(x1, y1, x2, y2).GetYByX(x); } /// /// X1,Y1和X2 Y2之间连一条线,在Y处点的X坐标 /// public static double GetXbyY(double x1, double y1, double x2, double y2, double y) { return new CurveLine(x1, y1, x2, y2).GetXByY(y); } /// /// 输入(X1,Y1),(X1,Y1)生成直线,返回直线的k和b y=kx+b /// public static bool GetKandB(double x1, double y1, double x2, double y2, out double k, out double b, double ignore = 0.000001) { return new CurveLine(x1, y1, x2, y2).GetKandB(out k, out b, ignore); } /// /// 通过2点,得到通过这2点的直线的k,b 线的形式是 y=k*x+b,竖直返回false /// public static bool GetKandB(CurvePoint pt1, CurvePoint pt2, out double k, out double b, double ignore = 0.000001) { return new CurveLine(pt1, pt2).GetKandB(out k, out b, ignore); } /// /// 取中间点 /// public static CurvePoint GetMiddlePoint(CurvePoint pt1, CurvePoint pt2) { return new CurveLine(pt1, pt2).GetMiddlePoint(); } /// /// 取内部点 /// public static CurvePoint GetInnerPoint(CurvePoint startPt, CurvePoint endPt, double ratio) { return new CurveLine(startPt, endPt).GetInnerPoint(ratio); } /// /// 是否是内部点 /// public static bool IsInnerByX(CurvePoint startPt, CurvePoint endPt, double x) { return new CurveLine(startPt, endPt).IsInnerByX(x); } /// /// 三个点在同一条直线上,输入(X1,Y1),(X2,Y2)以及沿(X2,Y2)侧延长Length,得到的点(X3,Y3) /// public static CurvePoint GetExtendPoint(CurvePoint startPt, CurvePoint endPt, double length) { return new CurveLine(startPt, endPt).GetExtendPoint(length); } /// /// 求直线外一点到该直线的投影点 /// /// 线上任一点 /// 直线斜率 /// 线外指定点 public static CurvePoint GetProjectivePoint(CurvePoint pl, double k, CurvePoint pout) { CurvePoint pProject = new CurvePoint(); if (k == 0) //垂线斜率不存在情况 { pProject.X = pout.X; pProject.Y = pl.Y; } else { pProject.X = (float)((k * pl.X + pout.X / k + pout.Y - pl.Y) / (1 / k + k)); pProject.Y = (float)(-1 / k * (pProject.X - pout.X) + pout.Y); } return pProject; } // /// 求直线外一点到该直线的投影点 /// public static CurvePoint GetProjectivePoint(CurvePoint pLine1, CurvePoint pLine2, CurvePoint pOut) { if (!GetKandB(pLine1, pLine2, out double k, out double b)) return default; return GetProjectivePoint(pLine1, k, pOut); } /// /// 点到线的距离, 注意不一定是垂直距离,点只在(line_start和line_end之间 /// public static double Distance(CurvePoint line_start, CurvePoint line_end, CurvePoint point) { return new CurveLine(line_start, line_end).Distance(point); } } }