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

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

相关文章

chart 完成拓扑图单节点拖拽不影响其他节点位置

就是做这种的功能,箭头原本是可以动态重复移动的,但不知道哪里问题导致没箭头了,然后补了个edgeSymbol: ['','arrow'], 字段,才增加了箭头。 拖拽某个节点,只有关联到的线条会跟着变动其他的节点位置不变。 参考 https://gallery.echartsjs.com/editor.html?c=x8Fgri22P9 https://echarts.baidu.com/exa

在 Java 中,JDK、JRE、JVM 分别代表什么,有何关系和区别?

在Java开发的世界中,我们会经常听到JDK、JRE和JVM这三个词。它们都与Java的运行环境以及Java程序的编译和运行有关,它们之间也存在一些关联性和区别。 什么是JDK、JRE和JVM 我们来看它们分别是什么。 JDK,全称Java Development Kit,即Java开发工具包。顾名思义,JDK是用于Java开发的一套工具包,里面包含了Java的编译器javac、

ScrollView 往上滑动,里面的一个View停在某个位置的思路

1.scrollView的contentoffset 为view的左上角,减去此时scrollView的左上角 2.而且还不需要让那个红色的view removeFromSuperView ,直接self.view AddSubView 就会自动从原来的那个View脱离开来 3.以后遇到问题的思路。当发现UIView很许多奇特的效果的时候,思考它是不是在不断的改变父控件。 #pragma m

1_CString char* string之间的关系

CString转char*,string string转char*,CString char* 转CString,string 一、CString转char*,string //字串转换测试 CString CString1; std::string string1; CHAR* char1=NULL; //1string1=CString1.GetBuffer();CStri

算法7— 判断一个单链表是否有环,如果有,找出环的起始位置

第一种方法是从单链表head开始,每遍历一个,就把那个node放在hashset里,走到下一个的时候,把该node放在hashset里查找,如果有相同的,就表示有环,如果走到单链表最后一个node,在hashset里都没有重复的node,就表示没有环。 这种方法需要O(n)的空间和时间。 第二种方法是设置两个指针指向单链表的head, 然后开始遍历,第一个指针走一步,第二个指针走两步,如果没

直线一级倒立摆微分建模

建模内容如下:         https://mp.weixin.qq.com/s?__biz=Mzg5OTIyNDEzMg==&mid=2247483673&idx=1&sn=c4e8024ebffd87611b757f7fd570f3c4&chksm=c057c632f7204f2442d0aab652847e342447fa604f04d74faafb798f022fb30e

Mysql数据库约束的概述 , 逐渐约束 , 主键自增 , 表关系的概念和外键 ,多表关系约束介绍和使用

约束和表设计 1、DQL查询语句-limit语句(掌握) 目标 能够掌握limit语句的使用 讲解 作用: LIMIT是限制的意思,所以LIMIT`的作用就是限制查询记录的条数。 LIMIT语句格式: select * from 表名 limit offset, row_count;mysql中limit的用法:返回前几条或者中间某几行数据-- 1 表示分页查询的索引,对应数

抽象类和接口之间的关系

1。类可以实现多个接口而只能继承一个超类。 2。抽象类可以有非抽象方法而接口的方法只能都是抽象的。 3。抽象类可以定义和使用变量而接口则不可以。 4。抽象类中的方法可以有各种不同的修饰符,而接口中的方法默认都是public,不允许字面定修饰符。 一个接口中的成员函数可以在不同的类中安装,而它的成员函数可以有很多种的实现方法,但是抽象类却不能象这样,它必须是由子类来继承,然后由子类来实现它的

材质、纹理、贴图的关系

材质、纹理、贴图的关系 材质 (Material)包含贴图 (Map),贴图包含纹理 (Texture)。 纹理(Texture)是最基本的数据输入单位。

机器学习基础:与Python关系和未来发展

目录 初识Python Python的由来 自由软件运动 编译方式的演进 Python语言的特点 语法简单,易于理解 语法结构清晰,快速上手 丰富的第三方库 机器学习 监督学习 无监督学习 半监督学习         欢迎回到我们的神经网络与深度学习Tensorflow实战学习,本篇为人工智能学习第三篇文章。前面的文章中我们学习安装了Tensorflow-GPU,在本