/// <summary> /// 判断两条线段是否相交。 /// </summary> /// <param name="line1">线段1</param> /// <param name="line2">线段2</param> /// <returns>相交返回真,否则返回假。</returns> public static bool CheckTwoLineCrose(LineD line1, LineD line2) { return(CheckCrose(line1, line2) && CheckCrose(line2, line1)); }
/**************************************求交***************************************************/ /// <summary> /// 两直线求交,返回交点 线公式 AX+BY+C1=0; /// </summary> /// <param name="lineA_z"></param> /// <param name="lineB"></param> /// <returns></returns> public static Point jiaoD(this LineD lineA_z, LineD lineB) { //定义交点 Point res = new Point(); double X1 = 0, X2 = 0, X3 = 0, X4 = 0, Y1 = 0, Y2 = 0, Y3 = 0, Y4 = 0; if (Math.Abs(lineA_z.Start.X - lineA_z.End.X) > 0.01) { //lineA的两点坐标 X1 = lineA_z.Start.X; Y1 = lineA_z.Start.Y; X2 = lineA_z.End.X; Y2 = lineA_z.End.Y; //lineB的两点坐标 X3 = lineB.Start.X; Y3 = lineB.Start.Y; X4 = lineB.End.X; Y4 = lineB.End.Y; } else if (Math.Abs(lineB.Start.X - lineB.End.X) > 0.01) { //lineB的两点坐标 X1 = lineB.Start.X; Y1 = lineB.Start.Y; X2 = lineB.End.X; Y2 = lineB.End.Y; //lineA的两点坐标 X3 = lineA_z.Start.X; Y3 = lineA_z.Start.Y; X4 = lineA_z.End.X; Y4 = lineA_z.End.Y; } else { MessageBox.Show("求交过程中被输入两条平行线,无法获得交点"); } //lineA套入直线公式 double A1 = Y2 - Y1; double B1 = X1 - X2; double C1 = X2 * Y1 - X1 * Y2; //lineB套入直线公式 double A2 = Y4 - Y3; double B2 = X3 - X4; double C2 = X4 * Y3 - X3 * Y4; //A1*X+B1*Y+C1=0; //A2*X+B2*Y+C2=0; ///y=a0+a1*x ///a1*x-y+a0=0 ///A=a1 ///B=-1 /// //解出交点 // 1 提出lineA中的未知数Y // Y*B1 = -A1*X - C1; // Y = -X*A1/B1 - C1/B1; // 2 把Y 套入 lineB的公式中 // A2*X+B2*(-A1/B1 * X - C1/B1)+C2=0; // 3 提出lineB的公式中的未知数X // A2*X + B2*(-X*A1/B1 - C1/B1) + C2=0; // double g =B2*(A1/B1); // double h =B2*(C1/B1); // A2*X + (-B2*(A1/B1) * X - B2*(C1/B1)) + C2=0; // A2*X + (-g * X - h) + C2=0; // A2*X - g * X =h-C2; // (A2-g)*X=h-C2; // X=(h-C2)/(A2-g); res.X = (B2 * (C1 / B1) - C2) / (A2 - B2 * (A1 / B1)); //4 把X套入步骤 1的公式 res.Y = -res.X * A1 / B1 - C1 / B1; res.Z = lineA_z.Start.Z; return(res); }