计算两条直线的交点

/// <summary>
        /// 计算两条直线的交点
        /// </summary>
        /// <param name="lineFirstStar">L1的点1坐标</param>
        /// <param name="lineFirstEnd">L1的点2坐标</param>
        /// <param name="lineSecondStar">L2的点1坐标</param>
        /// <param name="lineSecondEnd">L2的点2坐标</param>
        /// <returns></returns>
        public static Point GetIntersectionPoint(Point lineFirstStar, Point lineFirstEnd, Point lineSecondStar, Point lineSecondEnd)
        {
            /*
             * L1,L2都存在斜率的情况:
             * 直线方程L1: ( y - y1 ) / ( y2 - y1 ) = ( x - x1 ) / ( x2 - x1 )
             * => y = [ ( y2 - y1 ) / ( x2 - x1 ) ]( x - x1 ) + y1
             * 令 a = ( y2 - y1 ) / ( x2 - x1 )
             * 有 y = a * x - a * x1 + y1   .........1
             * 直线方程L2: ( y - y3 ) / ( y4 - y3 ) = ( x - x3 ) / ( x4 - x3 )
             * 令 b = ( y4 - y3 ) / ( x4 - x3 )
             * 有 y = b * x - b * x3 + y3 ..........2
             *
             * 如果 a = b,则两直线平等,否则, 联解方程 1,2,得:
             * x = ( a * x1 - b * x3 - y1 + y3 ) / ( a - b )
             * y = a * x - a * x1 + y1
             *
             * L1存在斜率, L2平行Y轴的情况:
             * x = x3
             * y = a * x3 - a * x1 + y1
             *
             * L1 平行Y轴,L2存在斜率的情况:
             * x = x1
             * y = b * x - b * x3 + y3
             *
             * L1与L2都平行Y轴的情况:
             * 如果 x1 = x3,那么L1与L2重合,否则平等
             *
            */
            double a = 0, b = 0;
            int state = 0;
            if (Math.Abs(lineFirstStar.X - lineFirstEnd.X) > double.Epsilon)
            {
                a = (lineFirstEnd.Y - lineFirstStar.Y) / (lineFirstEnd.X - lineFirstStar.X);
                state |= 1;
            }
            if (Math.Abs(lineSecondStar.X - lineSecondEnd.X) > double.Epsilon)
            {
                b = (lineSecondEnd.Y - lineSecondStar.Y) / (lineSecondEnd.X - lineSecondStar.X);
                state |= 2;
            }
            switch (state)
            {
                case 0: //L1与L2都平行Y轴
                    {
                        if (Math.Abs(lineFirstStar.X - lineSecondStar.X) < double.Epsilon)
                        {
                            //throw new Exception("两条直线互相重合,且平行于Y轴,无法计算交点。");
                            return new Point(0, 0);
                        }
                        else
                        {
                            //throw new Exception("两条直线互相平行,且平行于Y轴,无法计算交点。");
                            return new Point(0, 0);
                        }
                    }
                case 1: //L1存在斜率, L2平行Y轴
                    {
                        double x = lineSecondStar.X;
                        double y = (lineFirstStar.X - x) * (-a) + lineFirstStar.Y;
                        return new Point(x, y);
                    }
                case 2: //L1 平行Y轴,L2存在斜率
                    {
                        double x = lineFirstStar.X;
                        //网上有相似代码的,这一处是错误的。你可以对比case 1 的逻辑 进行分析
                        //源code:lineSecondStar * x + lineSecondStar * lineSecondStar.X + p3.Y;
                        double y = (lineSecondStar.X - x) * (-b) + lineSecondStar.Y;
                        return new Point(x, y);
                    }
                case 3: //L1,L2都存在斜率
                    {
                        if (Math.Abs(a - b) < double.Epsilon)
                        {
                            // throw new Exception("两条直线平行或重合,无法计算交点。");
                            return new Point(0, 0);
                        }
                        double x = (a * lineFirstStar.X - b * lineSecondStar.X - lineFirstStar.Y + lineSecondStar.Y) / (a - b);
                        double y = a * x - a * lineFirstStar.X + lineFirstStar.Y;
                        return new Point(x, y);
                    }
            }
            // throw new Exception("不可能发生的情况");
            return new Point(0, 0);
        }

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值