《点和直线投影及位置关系》

2024-05-24 07:58
文章标签 关系 位置 直线 投影

本文主要是介绍《点和直线投影及位置关系》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 直线方程
  • 点在直线投影
    • 直线求交点
    • 向量点积
  • 点和直线关系
    • 直线方程
    • 向量叉积

再简单的问题,也需要认真推导!

直线方程

  • 点斜式: y − y 0 = k ( x − x 0 ) y - y_0 = k(x-x_0) yy0=k(xx0)
  • 斜距式: y = k x + b y=kx+b y=kx+b
  • 两点式: x − x 1 x 2 − x 1 = y − y 1 y 2 − y 1 \frac{x-x_1}{x_2-x_1} = \frac{y-y_1}{y_2-y_1} x2x1xx1=y2y1yy1 (不包括垂直坐标轴直线)
  • 截距式: x a + y b = 1 \frac{x}{a} + \frac{y}{b}=1 ax+by=1
  • 一般式: A x + B y + C = 0 Ax+By+C=0 Ax+By+C=0 (AB不同时为0)
  • 已知直线上两点 P 1 ( x 1 , y 1 ) P_1(x_1,y_1) P1(x1,y1) P 2 ( x 2 , y 2 ) P_2(x_2,y_2) P2(x2,y2),和直线外一点 P 3 ( x 3 , y 3 ) P_3(x_3,y_3) P3(x3,y3)
    • 求投影点 P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P0(x0,y0) 坐标
    • 求点和直线位置关系

点在直线投影

直线求交点

$$
P_1P_2: y=k_{12}x+b_{12} \
P_0P_3: y=k_{03}x+b_{03} \

\begin{cases}
x_1,x_1 = x_2 \
y_1,y_1 = y_2 \
x = \frac{b_{03} - b_{12}}{k_{12} - k_{03}},other
\end{cases}
$$

def cal_proj1(P1, P2, P3):if P1[0] == P2[0]:x = P1[0]y = P3[1]elif P1[1] == P2[1]:x = P3[0]y = P1[1]else:k_12 = (P2[1]-P1[1]) / (P2[0] - P1[0])b_12 = P1[1] - k_12 * P1[0]k_03 = -1/k_12b_03 = P3[1] - k_03 * P3[0]x = (b_03 - b_12) / (k_12 - k_03)y = k_12 * x + b_12return [x, y]

向量点积

$$
k * \vec{P_{12}} = \vec{P_{10}} \
k = \frac{|\vec{P_{10}}|}{|\vec{P_{12}}|} = \frac{|\vec{P_{13}}| * cos(∠P_3P_1P_2)}{|\vec{P_{12}}|} = \frac{\vec{P_{13}}.\vec{P_{12}}}{|\vec{P_{12}}|^2} \

P_0 = k * \vec{P_{12}} + P_1
$$

def cal_proj2(P1, P2, P3):P_12 = [P2[0]-P1[0], P2[1]-P1[1]]P_13 = [P3[0]-P1[0], P3[1]-P1[1]]k = (P_12[0] * P_13[0] + P_12[1] * P_13[1]) / (math.pow(P_12[0], 2) + math.pow(P_12[1], 2))x = k * P_12[0] + P1[0]y = k * P_12[1] + P1[1]return [x, y]

点和直线关系

  • 点在直线上
  • 点在直线左右
  • 点在直线上下

直线方程

  • 求直线方程
    • 已知x,求y估计和y关系
    • 已知y,求x估计和x关系
def lf_relation_between_line_and_point(P1, P2, P3):if P1[0] == P2[0]:if P3[0] == P1[0]:return 0elif P3[0] < P1[0]:return -1 # leftelse:return 1 # rightelif P2[1] - P1[1] == 0:# 水平无左右?return 0else:k = (P2[1] - P1[1]) / (P2[0] - P1[0])b = P1[1] - k*P1[0]x_ = (P3[1] - b) / kif x_ == P3[0]:return 0elif x_ < P3[0]:return 1else:return -1def tb_relation_between_line_and_point(P1,P2,P3):if P2[0] - P1[0] == 0:# 垂直无上下?return 0k = (P2[1] - P1[1]) / (P2[0] - P1[0])b = P1[1] - k * P1[0]y_ = k * P3[0] + bif y_ == P3[1]:return 0elif y_ < P3[1]:return -1 # bottomelse:return 1 # up

向量叉积

  • 通过它的符号判断两矢量相互之间的顺逆时针关系

若 P × Q > 0 , 则P在Q的顺时针方向。
若 P × Q < 0 , 则P在Q的逆时针方向。
若 P × Q = 0 , 则P与Q共线,但可能同向也可能反向。

  • 满足右手螺旋准则
def lf_relation_between_line_and_point2(P1,P2, P3):if P1[1] == P2[1]:# 水平无左右return 0# 确定vector方向elif P1[1] > P2[1]:v1 = [P1[0] - P2[0], P1[1] - P2[1]]v2 = [P3[0] - P2[0], P3[1] - P2[1]]elif P1[1] < P2[1]:v1 = [P2[0] - P1[0], P2[1] - P1[1]]v2 = [P3[0] - P1[0], P3[1] - P1[1]]# v1 x v2A_cross_B = v1[0] * v2[1] - v1[1] * v2[0]if A_cross_B > 0:return -1elif A_cross_B < 0:return 1else:return 0def tb_relation_between_line_and_point2(P1,P2,P3):if P1[0] == P2[0]:# 垂直无上下return 0# 确定vector方向elif P1[0] > P2[0]:v1 = [P1[0] - P2[0], P1[1] - P2[1]]v2 = [P3[0] - P2[0], P3[1] - P2[1]]elif P1[0] < P2[0]:v1 = [P2[0] - P1[0], P2[1] - P1[1]]v2 = [P3[0] - P1[0], P3[1] - P1[1]]# v1 x v2A_cross_B = v1[0] * v2[1] - v1[1] * v2[0]if A_cross_B > 0:return -1elif A_cross_B < 0:return 1else:return 0

这篇关于《点和直线投影及位置关系》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/997822

相关文章

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

PyCharm如何更改缓存位置

《PyCharm如何更改缓存位置》:本文主要介绍PyCharm如何更改缓存位置的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm更改缓存位置1.打开PyCharm的安装编程目录2.将config、sjsystem、plugins和log的路径

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下

MYSQL关联关系查询方式

《MYSQL关联关系查询方式》文章详细介绍了MySQL中如何使用内连接和左外连接进行表的关联查询,并展示了如何选择列和使用别名,文章还提供了一些关于查询优化的建议,并鼓励读者参考和支持脚本之家... 目录mysql关联关系查询关联关系查询这个查询做了以下几件事MySQL自关联查询总结MYSQL关联关系查询

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p