一般方程与参数方程求直线交点
一般方程与参数方程求直线交点
一、 一个例子:
如上图,有两条直线,设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时,表示两直线重合)
源代码:
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]内,则变为求线段的求点
源代码:
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
一般方程与参数方程求直线交点相关推荐
- 关于求直线交点的问题。
二维坐标系下,关于求两条之前的交点问题,在国内网站上查来查去都没找到比较清晰易懂的.多数都是解决线段求交点的问题.最后在外国网站找到一篇,感觉讲解比较清晰.现在把他翻译过来. 2D空间中表示一条直线, ...
- Uva 11178 Morley's Theorem 向量旋转+求直线交点
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=9 题意: Morlery定理是这样的:作三角形ABC每个 ...
- POJ 1269 Intersecting Lines(求直线交点)
http://poj.org/problem?id=1269 求交点见zhhx课件 #include<iostream> #include<cstdio> #include&l ...
- python 求直线交点坐标
参考:http://blog.csdn.net/abcjennifer/article/details/7584628 # -*- coding: utf-8 -*- class Point(obje ...
- java 直线交点_[Java教程]谈谈求线段交点的几种算法(js实现,完整版)
[Java教程]谈谈求线段交点的几种算法(js实现,完整版) 0 2014-08-27 10:05:22 "求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面 ...
- js求两圆交点_谈谈求线段交点的几种算法(js实现,完整版)
"求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法总结一下, 希望对大家有所帮助. ...
- 【计算几何】求三角面和直线交点
需求: 对于给定的三角形面片3个顶点,和一条直线的2个点,求三角面和直线的交点,若无交点,输出-1. 思路: 利用海伦公式,可以得到三角形的面积,然后用3个点的2个向量,进行叉乘,得到面的法向量.ax ...
- 求抛物线和直线交点_直线与抛物线唯一公共点的深入理解
2019年武汉市中考数学压轴题,同样也考察了直线与抛物线有唯一公共点的情形,但本题特殊之处在于,不需要和以往类型的题目那样,通过联立方程,求根的判别式,逆推法同样可行.对于函数综合中的几何部分,融合得 ...
- 求抛物线和直线交点_关于抛物线大题的参考经验(5):浙江历年学考题回顾...
由于水平和时间的限制, 本文中一定还有不少的缺点和错误, 恳请各位读者批评指正. 文中的结论请参考关于抛物线大题的参考经验(1):真·经验部分 题目 19.(2020.1学考T24)如图21, 设抛物 ...
最新文章
- 关于ALV GRID的颜色
- DAZ studio 4.9基础
- P3586-[POI2015]LOG【线段树】
- 2021.08.23学习内容Pytorch与Torch的关系以及Torchvision作用
- 有了代码怎么用python爬虫_python实现简单爬虫功能
- python3记录(3)-os.walk() 方法
- php for 循环 try_PHP基础案例四:展示学生列表
- java 1.7 环境变量_安装JDK1.8之后又安装1.7出现的环境变量问题
- 内部排序算法:堆排序
- Nginx 关于 location 的匹配规则详解
- 大话USB驱动之基础概念
- php 开发微信app支付接口
- DRM-Playready总结
- mysql网游单机架设_网游单机架设直观教程终结版.doc
- outlook 2019 mac中如何设置邮件签名
- 语音压缩:压缩率和比特率
- Docker入门教程 Part 1 基础概念 - 镜像、容器、仓库
- 《般若波罗蜜多心经》注解
- Vert.x ——概述
- kvm 模块加载时报错:insmod: error inserting 'kvm.ko': -1 Unknown symbol in module