已知直线上的两个点或者已知直线的斜率和截距两种情况下求交点和垂足。
两种情况来自于实际求解中可以找到边界上的两个点列出直线方程,也可以用更准确的求法即获取多个点拟合一条直线。

1.求两直线的交点(两点式)

直线L1的方程为:
y − y 1 y 2 − y 1 = x − x 1 x 2 − x 1 \frac{y - y_1}{y_2 - y_1} = \frac{x - x_1}{x_2 - x_1} y2​−y1​y−y1​​=x2​−x1​x−x1​​
直线L2的方程为:
y − y 3 y 4 − y 3 = x − x 3 x 4 − x 3 = t \frac{y - y_3}{y_4 - y_3} =\frac{x - x_3}{x_4 - x_3} =t y4​−y3​y−y3​​=x4​−x3​x−x3​​=t
可得:
y = ( y 4 − y 3 ) ∗ t + y 3 x = ( x 4 − x 3 ) ∗ t + x 3 y = (y_4 -y_3)*t+y_3\\ x = (x_4 -x_3)*t+x_3 y=(y4​−y3​)∗t+y3​x=(x4​−x3​)∗t+x3​
将上述x,y的等式代入直线L1的方程:
( y 4 − y 3 ) ∗ t + ( y 3 − y 1 ) y 2 − y 1 = ( x 4 − x 3 ) ∗ t + ( x 3 − x 1 ) x 2 − x 1 \frac{(y_4 - y_3)*t+(y_3-y_1)}{y_2 - y_1} =\frac{(x_4 - x_3)*t+(x_3-x_1)}{x_2 - x_1} y2​−y1​(y4​−y3​)∗t+(y3​−y1​)​=x2​−x1​(x4​−x3​)∗t+(x3​−x1​)​

a 1 = y 4 − y 3 , a 2 = y 3 − y 1 , a 3 = y 2 − y 1 b 1 = x 4 − x 3 , b 2 = x 3 − x 1 , b 3 = x 2 − x 1 a_1 = y_4-y_3,a_2 =y_3-y_1,a_3 =y_2-y_1\\ b_1 = x_4-x_3,b_2 =x_3-x_1,b_3 =x_2-x_1 a1​=y4​−y3​,a2​=y3​−y1​,a3​=y2​−y1​b1​=x4​−x3​,b2​=x3​−x1​,b3​=x2​−x1​
可得
a 1 t + a 2 a 3 = b 1 t + b 2 b 3 t = a 3 b 2 − a 2 b 3 a 1 b 3 − a 3 b 1 \frac{a_1t+a_2}{a_3} =\frac{b_1t+b_2}{b_3}\\ t = \frac{a_3b_2-a_2b_3}{a_1b_3-a_3b_1} a3​a1​t+a2​​=b3​b1​t+b2​​t=a1​b3​−a3​b1​a3​b2​−a2​b3​​
将t代回原x,y的公式即可求得交点坐标。

C++实现:

 Point p1,p2,p3,p4;//对应的四个点,根据实际应用场景赋值double a1, a2, a3, b1, b2, b3;double t;Point pp1, pp2;a1 = p4.y - p3.y;a2 = p3.y - p1.y;a3 = p2.y - p1.y;b1 = p4.x - p3.x;b2 = p3.x - p1.x;b3 = p2.x - p1.x;t = (a3 * b2 - a2 * b3) / (a1 * b3 - a3 * b1);pp1.x = (p4.x - p3.x) * t + p3.x;pp1.y = (p4.y - p3.y) * t + p3.y;

2.求两直线的交点(斜截式)

直线L1的方程为:
y − y 1 y 2 − y 1 = x − x 1 x 2 − x 1 = t \frac{y - y_1}{y_2 - y_1} = \frac{x - x_1}{x_2 - x_1}=t y2​−y1​y−y1​​=x2​−x1​x−x1​​=t
直线L2的方程为
y = k x + b y=kx+b y=kx+b
由L1的方程可求得:
x = ( x 2 − x 1 ) ∗ t + x 1 y = ( y 2 − y 1 ) ∗ t + y 1 x = (x_2-x_1)*t+x_1\\y = (y_2-y_1)*t+y_1 x=(x2​−x1​)∗t+x1​y=(y2​−y1​)∗t+y1​
代入L2的方程可得:
( y 2 − y 1 ) ∗ t + y 1 = k ( ( x 2 − x 1 ) ∗ t + x 1 ) + b t = ( k x 1 + b − y 1 ) ( y 2 − y 1 ) − k ( x 2 − x 1 ) (y_2-y_1)*t+y_1=k((x_2-x_1)*t+x_1)+b\\ t=\frac{(kx_1+b-y_1)}{(y_2 - y_1)-k(x_2-x_1)} (y2​−y1​)∗t+y1​=k((x2​−x1​)∗t+x1​)+bt=(y2​−y1​)−k(x2​−x1​)(kx1​+b−y1​)​
将t代回原x,y的公式即可求得交点坐标。

C++实现:

 Point p1,p2;//对应的两个点,根据实际应用场景赋值vector<Point> points;//用来拟合直线的点Vec4f line;fitLine(points, line, DIST_L2, 0, 0.01, 0.01);//拟合得到直线,具体求解根据实际情况double cos_theta = line[0];double sin_theta = line[1];double x0 = line[2], y0 = line[3];double k = sin_theta / cos_theta;double b = y0 - k * x0;t = (k * p1.x + b - p1.y) / (p2.y - p1.y - k * (p2.x - p1.x));Point pp1;pp1.x = (p2.x - p1.x) * t + p1.x;pp1.y = (p2.y - p1.y) * t + p1.y;

3.求垂足(两点式)

直线L的方程为:
y − y 1 y 2 − y 1 = x − x 1 x 2 − x 1 \frac{y - y_1}{y_2 - y_1} = \frac{x - x_1}{x_2 - x_1} y2​−y1​y−y1​​=x2​−x1​x−x1​​
L的方向向量为:
( a , b ) = ( x 2 − x 1 , y 2 − y 1 ) (a,b) = (x_2-x_1,y_2-y_1) (a,b)=(x2​−x1​,y2​−y1​)
则垂直于L的垂线的方向向量为:
( − b , a ) = ( y 1 − y 2 , x 2 − x 1 ) (-b,a) = (y_1-y_2,x_2-x_1) (−b,a)=(y1​−y2​,x2​−x1​)
经过点(x3,y3)的垂线的点向式为:
x − x 3 − b = y − y 3 a = t \frac{x-x_3}{-b} = \frac{y-y_3}{a} = t −bx−x3​​=ay−y3​​=t
可得
x = − b t + x 3 y = a t + y 3 x = -bt+x_3\\ y=at+y_3 x=−bt+x3​y=at+y3​
代入直线L的方程可求出t:
t = a ( y 1 − y 3 ) + b ( x 3 − x 1 ) a 2 + b 2 t = \frac{a(y_1 - y_3)+b(x_3-x_1)}{a^2 + b^2} t=a2+b2a(y1​−y3​)+b(x3​−x1​)​
将t代回原x,y的公式即可求得垂足。

C++实现:

 Point p1,p2;//对应的两个点,根据实际应用场景赋值  int a = p2.x - p1.x;int b = p2.y - p1.y;double t = (a * (p1.y - p3.y) + b * (p3.x - p1.x));t = t / (a * a + b * b);//分两步计算,直接一步实现会由于精度问题导致结果出错Point p;p.x = -b * t + p3.x;p.y = a * t + p3.y;

4.求垂足(斜截式)

直线L的方程为:
y = k 1 x + b 1 y=k_1x+b_1 y=k1​x+b1​
假设垂线的方程为:
y = k 2 x + b 2 y=k_2x+b_2 y=k2​x+b2​
互相垂直的两条直线斜率满足以下关系(斜率不存在的情况需要另外求):
k 2 = − 1 k 1 k_2 = -\frac{1}{k_1} k2​=−k1​1​
由(x3,y3)在垂线上可求得
b 2 = y 3 − k 2 x 3 b_2 = y_3-k_2x_3 b2​=y3​−k2​x3​
联立方程组
y = k 1 x + b 1 y = k 2 x + b 2 y = k_1x+b_1\\ y = k_2x+b_2 y=k1​x+b1​y=k2​x+b2​
得到
x = b 2 − b 1 k 1 − k 2 x=\frac{b_2-b_1}{k_1-k_2} x=k1​−k2​b2​−b1​​
将x代入以上任何一个直线方程即可得到y,即求得垂足(x,y)。

C++实现:

 Point p3;//直线外一点vector<Point> points;//用来拟合直线的点Vec4f pline;fitLine(points, pline, DIST_L2, 0, 0.01, 0.01);cos_theta = pline[0];sin_theta = pline[1];x0 = pline[2], y0 = pline[3];double k1 = sin_theta / cos_theta;double b1 = y0 - k1 * x0;double b2 = 0;double k2 = -1 / k1;b2 = p3.y - k2 * p3.x ;pp1.x = (b2 - b1) / (k1 - k2);pp1.y = k2 * pp1.x + b2;

5.斜率不存在

若直线是横向的,即直线方程为y=c,则直线外一点找的垂足的y为c,x与直线外一点的x相同。竖向同理,不赘述。

C++实现求两条直线的交点,以及已知直线外一点求垂足相关推荐

  1. 求两条曲线的交点 matlab,matlab求两条曲线交点

    用Matlab 实现了 3 次样条曲线插值的算法.边界条件取为自然边界条件,即:... 二元一次函数曲线拟合的Matlab实现_IT/计算机_专业资料.第 27 卷 1... (x1)); y2=in ...

  2. python 求两条曲线的交点_这几种问法都是考察张角问题,高考数学圆锥曲线的焦点弦张角定理...

    在高考数学的圆锥曲线中,有很多神奇的问法,比如 (1)在x轴上是否存在点Q,使得∠PQM+∠PQN=180° (2)在x轴上是否存在一点B使得∠ABM=∠ABN: (3)在x轴上是否存在定点Q,使得直 ...

  3. matlab中如何求两条曲线的交点并在图中标出

    有如下两条曲线: y1=2sin(x)+0.5x y2=cos(x)+x 求y1和y2在[0,4π]上的图形,并用红色五角星标出二者的交点. 解答: 第一步: x=0:pi/100:4pi; y1=2 ...

  4. 求两条轨迹间的hausdorff距离_高中数学:求轨迹方程的几种常用方法

    由已知条件求动点轨迹方程是解析几何的基本问题之一,也是解析几何的重点.轨迹方程的常用方法可归纳为以下四种. 一.普通法 例1. 求与两定点距离的比为1:2的点的轨迹方程. 分析:设动点为P,由题意,则 ...

  5. 用矢量变换的方法求两条直线的交点

    求两条直线的交点,最常见的写法是列出两条直线的方程,联立求解.     但这种办法的弊端很大:     1 )算法是坐标系相关的,要考虑直线是水平还是垂直,写出很多判断条件,增加了程序的不稳定性    ...

  6. 求两条轨迹间的hausdorff距离_题型 | 圆上有n个点到直线距离为d?

    圆上有n个点到直线的距离为d 圆 上到直线 的距离为 的点有( )个 方法一:常规方法,画图分析 由图象可以明显看出,圆在直线上方的部分内没有满足题意的点,在直线下方的部分内有两个满足题意的点. 但是 ...

  7. Bentley-Ottmann算法:求N条线段的交点

    Bentley-Ottmann算法:求N条线段的交点 Bentley-Ottmann算法 算法复杂度 1. 使用暴力求解,遍历每一条线段 i ,固定 i 遍历 j 与 i 是否存在交点: 2. 此时我 ...

  8. [LeetCode] Intersection of Two Linked Lists 求两个链表的交点

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  9. python求交点坐标_Python求两个圆的交点坐标或三个圆的交点坐标方法

    计算两个圆的交点 代码如下: # -*- coding: utf-8 -*- import math import numpy as np def insec(p1,r1,p2,r2): x = p1 ...

最新文章

  1. 一次失败的面试,复习一次一致性哈希算法
  2. php暂停函数sleep()和usleep的区别
  3. 民政部部长李纪恒:适龄人口生育意愿偏低,总和生育率破警戒线
  4. 浅谈缓存技术在ASP.NET中的运用
  5. java 模块设计模式_Java9模块化学习笔记二之模块设计模式
  6. php 后期发展,php面对对象之后期绑定
  7. what is web farm
  8. 看到的一个很不错的分析LCA和RMQ的文章(转载,先收着)
  9. C Hello World程序
  10. 接口测试常见问题及答案
  11. 计算机三级信息安全技术考什么?计算机三级有必要考吗?
  12. 华为悦盒E6108无线投屏-机顶盒连接wifi-我的盒子-DLNA-手机视频有TV标识-点击TV标识
  13. kendoui实现单选多选汉字/拼音/简拼筛选过滤
  14. 各种建筑风格及其代表建筑
  15. 23岁女工为600元全勤奖带伤加班3天 一周后身亡
  16. Nitrux安装JDK-10(Linux通用)教程
  17. android 菜鸟面单打印_Android开发的菜鸟小记
  18. 一个安全架构师需要做什么?有什么能力要求?
  19. 圣思园——Java SE Lesson 2
  20. 移动端开发纯css实现家谱世系图(uniapp)

热门文章

  1. PostgreSQL之pgdump备份恢复
  2. mysql查询集合中的特定数据_快速查询List中指定的数据
  3. 论坛php 图片上传,Discuz上传图片失败的解决方法
  4. 系统盘垃圾清理(XP版)
  5. 程序员五一如何虚度时光
  6. Qt:36---QSettings
  7. wp网站怎么搬家服务器,蓝色早晨-UED | WordPress搬家完整详细教程及换域名
  8. Unity Cinemachine插件学习笔记,结合Timeline实现简单场景动画
  9. 《乐高EV3机器人搭建与编程》——2.7 齿轮
  10. 用计算机弹吃鸡,Win10系统玩吃鸡提示游戏缺少msvcp140.dll的解决方法