求两条线段的交点
/// <summary> /// 求两条线段的交点 /// </summary> /// <param name="x1"></param> /// <param name="y1"></param> /// <param name="x2"></param> /// <param name="y2"></param> /// <param name="x3"></param> /// <param name="y3"></param> /// <param name="x4"></param> /// <param name="y4"></param> /// <param name="point"></param> /// <returns></returns> public bool GetSegInter(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, ref Point2d point) { double A1 = y2 - y1; double B1 = x1 - x2; double C1 = -A1 * x1 - B1 * y1; double A2 = y4 - y3; double B2 = x3 - x4; double C2 = -A2 * x3 - B2 * y3; double dlt = A1 * B2 - A2 * B1; double dltx = C1 * B2 - C2 * B1; double dlty = A1 * C2 - A2 * C1; if (Math.Abs(dlt) < 0.00000001) { return false; } else { point = new Point2d(-1.0 * (dltx / dlt), -1.0 * (dlty / dlt)); bool bResInPoly = IsPointInLine(new Point2d(x1, y1), new Point2d(x2, y2), point); bool bResInTile = IsPointInLine(new Point2d(x3, y3), new Point2d(x4, y4), point); return bResInPoly && bResInTile; } } public bool IsPointInLine(Point2d a, Point2d b, Point2d c, double bAllowGap = 0.01) { double lac = Math.Sqrt((a.X - c.X) * (a.X - c.X) + (a.Y - c.Y) * (a.Y - c.Y)); double lbc = Math.Sqrt((b.X - c.X) * (b.X - c.X) + (b.Y - c.Y) * (b.Y - c.Y)); double lab = Math.Sqrt((a.X - b.X) * (a.X - b.X) + (a.Y - b.Y) * (a.Y - b.Y)); return (lac + lbc < lab + bAllowGap) ? true : false; }