一般方程与参数方程求直线交点
2013-11-23 11:44
309 查看
一般方程与参数方程求直线交点
一、 一个例子:如上图,有两条直线,设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 <iostream>
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 << "Frist Line(x0 y0 x1 y1):";
14 cin >> line1[0].x >> line1[0].y >> line1[1].x >> line1[1].y;
15 cout << "Second Line(x0 y0 x1 y1):";
16 cin >> 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 << "一般方程求解的交点:" << x << "," << y << endl;
27 }
28 else
29 {
30 cout << "两直线重合" << endl;
31 }
32 return 0;
33 }
34
三、 参数方程法:
设直线上的两个点为A0(x0, y0), B0(x1, y1),那么线段
可用向量
=
–
=(x1
– x0, y1 – y0)
表示,
的方向即为直线上的方向,那么直线上的任意点便可表示为
s0(t0) =
+ t0 *
同理,另一条直线(A1(x2, y2), B1(x3, y3)为其上两个点)可类似表示为
s1(t1) =
+ t1 *
因此,满足两条直线的交点必满足以下条件:
+ t0
*
=
+ t1
*
可求出
t0 = (x0(y3 – y2) + x2(y0 – y3) + x3(y2 – y0))/D
t1 = -(x0(y2 – y1) + x1(y0 – y2) + x2(y1 – y0))/D
D = x0(y3 – y2) + x1(y2 – y3) + x3(y1 – y0) + x2(y0 – y1),(D为0时,表示两直线重合)
则交点为:
x = x0 + t0 * (x1 – x0); y = y0 + t0 * (y1 – y0);
或
x = x2 + t1 * (x3 – x2); y = y2 + t1 * (y3 – y2);
如果将t0,t1限定在[0,1]内,则变为求线段的求点
源代码:
1 #include <iostream>
2 using namespace std;
3
4 typedef struct
5 {
6 int x, y;
7 } Point;
8 int main()
9 {
10 //参数方程法
11 Point pt[4];
12 int t1, t2, dx, dy, D, x, y;
13 cout << "Frist Line(x0 y0 x1 y1):";
14 cin >> pt[0].x >> pt[0].y >> pt[1].x >> pt[1].y;
15 cout << "Second Line(x0 y0 x1 y1):";
16 cin >> 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 <<"参数法求交点:" << x << "," << y << endl;
25 }
26 else
27 {
28 cout << "两直线重合" << endl;
29 }
30 return 0;
31 }
32
相关文章推荐
- 一般方程与参数方程求直线交点
- 一般方法编程求直线与圆交点
- 图像处理;C++求已知两直线方程交点
- 椭圆一般方程和参数方程之间关系
- poj 1408 Fishnet(直线方程、交点、三角形面积的应用)
- C++ 实现已知直线上两个点求解直线方程,并求两条直线的交点
- 过抛物线2交点的直线方程
- 直线方程的多种表示
- 【图像处理】提取图片中直线的交点
- hdoj 1466 计算直线的交点数 【dp】
- 求过圆心直线与圆的两个交点
- 两直线求交点的理论知识
- 求直线交点 叉积
- 两空间异面直线公垂线及交点坐标的求解过程
- POJ 1269 Intersecting Lines 判断直线关系(相交(求交点),重合,平行)
- hdu 1466 计算直线的交点数 (数学)
- poj 1269 知识点:直线相交判断,求相交交点
- 椭圆一般方程(ABCDEF)转椭圆参数方程(长短轴,几何中心)
- hough变换直线方程推导
- NEUQ 1194: 【计算直线的交点数】