一般方程与参数方程求直线交点

您所在的位置:网站首页 两直线相交怎么求交点坐标 一般方程与参数方程求直线交点

一般方程与参数方程求直线交点

2024-07-17 07:26| 来源: 网络整理| 查看: 265

一、             一个例子:

如上图,有两条直线,设L1,L2。L1上有两点(0, 0)、(10,10),L2上有两点(0,10)、(10,0),它们的交点是(5,5)。求解交点有两种效率较高的常用方法,一般方程法与参数方程法,以下将分别描述其原理及实现。

二、             一般方程法:

直线的一般方程为F(x) = ax + by + c = 0。既然我们已经知道直线的两个点,假设为(x0,y0), (x1, y1),那么可以得到a = y0 – y1, b = x1 – x0, c = x0y1 – x1y0。

因此我们可以将两条直线分别表示为

F0(x) = a0*x + b0*y + c0 = 0, F1(x) = a1*x + b1*y + c1 = 0

那么两条直线的交点应该满足

a0*x + b0*y +c0 = a1*x + b1*y + c1

由此可推出

x = (b0*c1 – b1*c0)/D

y = (a1*c0 – a0*c1)/D

D = a0*b1 – a1*b0, (D为0时,表示两直线重合)

源代码:

 1 #include  2 using namespace std; 3  4 typedef struct 5 { 6     int x, y; 7 } Point; 8 int main() 9 {10     //一般方程法11     Point line1[2], line2[2];12     int a[2], b[2], c[2], x, y, D;13     cout > line1[0].x >> line1[0].y >> line1[1].x >> line1[1].y;15     cout > line2[0].x >> line2[0].y >> line2[1].x >> line2[1].y;17     18     a[0] = line1[0].y - line1[1].y;b[0] = line1[1].x - line1[0].x;19     c[0] = line1[0].x * line1[1].y - line1[1].x * line1[0].y;20     a[1] = line2[0].y - line2[1].y;b[1] = line2[1].x - line2[0].x;21     c[1] = line2[0].x * line2[1].y - line2[1].x * line2[0].y;22     D = a[0] * b[1] - a[1] * b[0];23     if (D != 0)24     {25         x = (b[0] * c[1] - b[1] * c[0]) / D; y = (a[1] * c[0] - a[0] * c[1]) / D;    26         cout > pt[0].y >> pt[1].x >> pt[1].y;15     cout > pt[2].x >> pt[2].y >> pt[3].x >> pt[3].y;    17     t1 = pt[0].x * (pt[3].y - pt[2].y) + pt[2].x * (pt[0].y - pt[3].y) + pt[3].x * (pt[2].y - pt[0].y);18     t2 = - (pt[0].x * (pt[2].y - pt[1].y) + pt[1].x * (pt[0].y - pt[2].y) + pt[2].x * (pt[1].y - pt[0].y));19     D = pt[0].x * (pt[3].y - pt[2].y) + pt[1].x * (pt[2].y - pt[3].y) + pt[3].x * (pt[1].y - pt[0].y) + pt[2].x * (pt[0].y - pt[1].y);20     if (D != 0)21     {22         dx = pt[1].x - pt[0].x; dy = pt[1].y - pt[0].y;23         x = pt[0].x + t1 * dx / D; y = pt[0].y + t1 * dy / D;24         cout 


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3