向量法求点在直线上的投影

news/2024/4/30 0:07:57

已知直线上两点a、b和直线外一点p,求p在直线ab上的投影点。
根据《计算几何之 点在直线上的投影 代码模板与证明》一文中所述,p的投影点p’就是a+ x ⃗ \vec x x (直线的点向式),所以我们只要求出 x ⃗ \vec x x 就能求出p’了。
在这里插入图片描述
x ⃗ \vec x x = t v ⃗ \vec v v ,这个t就是 ∣ x ⃗ \vec x x ∣ 和 ∣ v ⃗ \vec v v ∣ 的比值。假设两个向量的夹角为 θ \theta θ,则有:
t = ∣ x ⃗ ∣ ∣ v ⃗ ∣ = ∣ u ⃗ ∣ ∗ c o s θ ∣ v ⃗ ∣ t=\frac{|\vec x|}{|\vec v|}=\frac{|\vec u|*cos\theta}{|\vec v|} t=v x =v u cosθ
根据向量的知识我们可以知道向量的夹角计算方式为:
c o s θ = u ⃗ ∗ v ⃗ ∣ u ⃗ ∣ ∗ ∣ v ⃗ ∣ cos\theta = \frac{\vec u*\vec v}{|\vec u|*|\vec v|} cosθ=u v u v
因此,t的解算可以优化为:
t = ∣ u ⃗ ∣ ∗ c o s θ ∣ v ⃗ ∣ = ∣ u ⃗ ∣ ∣ v ⃗ ∣ ∗ u ⃗ ∗ v ⃗ ∣ u ⃗ ∣ ∗ ∣ v ⃗ ∣ = u ⃗ ∗ v ⃗ ∣ v ⃗ ∣ 2 t=\frac{|\vec u|*cos\theta}{|\vec v|}=\frac{|\vec u|}{|\vec v|}*\frac{\vec u*\vec v}{|\vec u|*|\vec v|}=\frac{\vec u*\vec v}{|\vec v|^2} t=v u cosθ=v u u v u v =v 2u v
于是乎,我们就可以得到向量 x ⃗ \vec x x :
x ⃗ = t ∗ v ⃗ = u ⃗ ∗ v ⃗ ∗ v ⃗ ∣ v ⃗ ∣ 2 \vec x = t*\vec v = \frac{\vec u*\vec v*\vec v}{|\vec v|^2} x =tv =v 2u v v
由此,我们就可以计算出所需要的向量 x ⃗ \vec x x ,但是某些时候我们只知道向量的一个端点以及它的夹角,是否有更为方便的方式使用上述的式子呢?对于上述式子,我们还可以将其进一步简化。对于向量 v ⃗ \vec v v 而言,其可以简写成:
v ⃗ = ∣ v ⃗ ∣ ∗ e ⃗ \vec v =|\vec v|*\vec e v =v e
其中, e ⃗ \vec e e v ⃗ \vec v v 的单位向量。
因此,向量 x ⃗ \vec x x 也可以写成:
x ⃗ = t ∗ v ⃗ = u ⃗ ∗ e ⃗ ∗ e ⃗ \vec x = t*\vec v = {\vec u*\vec e*\vec e} x =tv =u e e
注意这里的运算方式,前面的 u ⃗ ∗ e ⃗ \vec u*\vec e u e 代表的是向量的点乘,因此得到的是一个具体的数,数再乘以向量最后得到一个新的向量。因此,通过这种方式我们也可以使用这种方式来计算它的投影向量。

因此,对于最开始的问题,关于点p在向量上的投影点,其计算方式可以写为:
p ′ = p + x ⃗ = p + u ⃗ ∗ e ⃗ ∗ e ⃗ p' =p+\vec x = p+{\vec u*\vec e*\vec e} p=p+x =p+u e e
简单的代码实现:

    Vec2f vec;//向量Vec2f P;//向量外的点Vec2f P_pro;//投影点theta = 1.2;//向量的夹角vec[0] = 4.3;//向量上的一个点vec[1] = 2.2;P[0] = 1;P[1] = 0;Vec2f e;//单位向量e[0] = cos(theta);e[1] = sin(theta);Vec2f u;u = P-vec;//向量U,终点减起点P_pro = vec+(u.dot(e))*e;

得到的结果如下:
在这里插入图片描述
图中箭头代表的是向量,左侧的紫色球体代表平面上的一点,右下方的紫色球体代表该点在向量上的投影位置。
例如我们修改向量的方向及位置:

    theta = 0.2;//向量的夹角vec[0] = 1.3;//向量上的一个点vec[1] = 0.2;

则会得到新的位置关系:
在这里插入图片描述
从上述的结果来看原式子的结论应该是没有问题的。

补充知识点:如何判断点在向量的左侧还是右侧?
根据夹角的计算方式:
c o s θ = u ⃗ ∗ v ⃗ ∣ u ⃗ ∣ ∗ ∣ v ⃗ ∣ cos\theta = \frac{\vec u*\vec v}{|\vec u|*|\vec v|} cosθ=u v u v
由于分母为模长,必定为正数,所以角度的正负由分子决定,因此,根据向量的点乘结果即可以判断点在向量的左侧还是右侧。
参考:
计算几何之 点在直线上的投影 代码模板与证明
向量点乘(内积)和叉乘(外积、向量积)概念及几何意义解读
Numpy计算给定线段上点的投影位置(x,y)
点在直线的投影坐标 n维向量投影坐标 几何投影坐标


http://www.mrgr.cn/p/00847158

相关文章

JAVAEE——线程池

文章目录 线程池的概念什么是线程池? 标准库中的线程池线程池的创建工厂模式工厂模式的用途线程池涉及到的类有哪些Executor接口ExecutorService接口Executors工厂类AbstractExecutorService虚类ThreadPoolExecutor普通类ThreadPoolExecutor内部的实现4个拒绝策略 线…

蚂蚁感冒

一、问题描述 P8611 [蓝桥杯 2014 省 AB] 蚂蚁感冒 二、问题简析 这道题的关键是如何处理蚂蚁掉头的问题。我们可以把蚂蚁掉头看作直接穿了过去。为什么可以这样做?如果两只蚂蚁中有一只感染,则碰头后两只都感染了,不需要区分哪一只。如果两只蚂蚁都没感染,则碰头后仍未感染…

SpringMVC | SpringMVC中的 “文件上传和下载”

目录: 一、文件上传1.1 文件上传“概述”1.2 文件上传“具体配置” :“前端”中配置“文件上传” ( type“file” 满足3个条件 )“后端”中配置“文件上传” ( 配置id为“CommonsMultipartResolver”的bean 配置“文件上传”的“约束条件” 通过“MultipartFile接口”参数接…

SpringMVC | Spring MVC中的“拦截器”

目录: 一、拦截器 :1. 拦截器的 “概述”2. 拦截器的 “定义” (创建“拦截器”对象)3. 拦截器的 “配置” (让“拦截器”对象生效)4. 拦截器的 “执行流程”“单个拦截器”的执行流程“多个拦截器”的执行流程 二、应用案例一实现用户登录权限验证 作者简介 &#…

iMX6ULL-OpenWRT

iMX6ULL-OpenWRT 基于正点原子的imx6ull阿尔法开发板,移植OpenWRT23.05,仅支持SD卡启动。开源工程地址:https://github.com/boxwoodt/imx6ull_openwrt 功能列表:RTL8188J无线EC20 4G联网WEB 升级1、硬件环境 正点原子阿尔法开发板。核心板V1.6,底板V2.2。4G模块使用EC20-C…

虚拟环境装torch与cuda

遇到问题1 在python环境中导入torchvision的时候,出现了以下错误 ImportError: cannot import name PILLOW_VERSION from PIL 问题:Pillow包版本过高。 解决方法:1.卸载新版本 pip uninstall Pillow 2.安装新版本 pip install Pillow==6.2.2 备注:通过conda进行uninstall好…

SQLiteC/C++接口详细介绍sqlite3_stmt类(十三)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(十二) 下一篇: SQLite数据库文件损坏的可能几种情况 51、sqlite3_stmt_scanstatus_reset sqlite3_stmt_scanstatus_reset 函数用于重置指…

Finereport11 类Excel筛选

微信公众号:次世代数据技术 关注可了解更多的教程。问题或建议,请公众号留言或联系本人; 微信号:weibw162 本教程视频讲解可以关注本人B站账号进行观看:weibw162一、需求描述 在使用FIneReport软件开发时,我们希望前台报表展示时可以类似Excel表格筛选那样,在表头进行多选…

Mybatis复习

mybatis最基础的要记的部分用于简化JDBC的操作,直接在mybatis中编写sql,发送给数据库执行,然后返回结果 编写sql有注解和xml文件两种方法 LocalDate类型对应数据表中的date类型 LocalDateTime类型对应数据表中的datetime类型 预编译sql性能高,安全 like拼接时使用concat(%,…

Linux虚拟机不显示ip地址

情况说明:通过资源管理器结束全部以vm开头的进程,重启后不显示IP地址。

C++自主点餐系统

一、 题目 设计一个自助点餐系统,方便顾客自己点餐,并提供对餐厅销售情况的统计和管理功能。 二、 业务流程图 三、 系统功能结构图 四、 类的设计 五、 程序代码与说明 头文件1. SystemMap.h #pragma once #ifndef SYSTEMMAP #define SYSTEMMAP #in…

把项目推送到gitee

好久不用git了,今天就用git上传自己菜鸟项目。上传了模型训练还有模型部署到web的项目。

【Java程序设计】【C00387】基于(JavaWeb)Springboot的校园食堂订餐系统(有论文)

基于(JavaWeb)Springboot的校园食堂订餐系统(有论文) 项目简介项目获取开发环境项目技术运行截图 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发,开发过…

文本数据读取

文本数据读取 在自然语言处理的第一步,要面对的是各种各样以不同形式表现的文本数据,比如,有的是纯 txt 文档,有的是存储在 Excel 中的表格数据,还有的是无法直接打开的 pkl 文件等。刚开始接触编程的同学在这里就犯难了,这可怎么把文本数据拿来进行代码层面的操作呢? 事…

yolov部署到app

今天把模型部署到app上

全球首位AI程序员Devin诞生,以此谈谈AI对程序员的影响

目录 一、简介 二、AI程序员Devin的特长 三、对程序员的影响 一、简介 全球首位 AI 程序员 Devin 是由初创公司 Cognition AI 创造的。这家公司成立仅四个月,却已经引起了广泛关注。 Devin作为人工智能的代表,将展示出人工智能在编程领域的潜力和能…

硬件组成-CPU-编码-浮点数

计算机的基本硬件系统由运算器、控制器、存储器、输入设备和输出设备5大部件组成。运算器、控制器等部件被集成在一起统称为中央处理单元(CPU)。CPU是硬件系统的核心,用于数据的加工处理,能完成各种算术、逻辑运算及控制功能。存储器是计算机系统中的记忆设备,分为内部存储…

OpenGL 实现“人像背景虚化“效果

手机上的人像模式,也被人们称作“背景虚化”或 ”双摄虚化“ 模式,也称为 Bokeh 模式,能够在保持画面中指定的人或物体清晰的同时,将其他的背景模糊掉。突出画面的主体部分,主观上美感更强烈。 人像模式的一般实现原理是,利用双摄系统获取景深信息,并通过深度传感器和图…

在window10或window11 上运行带有签名的.msix 文件。

1)、单击有签名的.msix 文件》属性》 ok,这样就可以成功安装了编程是个人爱好

SEO 的未来:GPT 和 AI 如何改变关键词研究

谷歌Gemini与百度文心一言:AI训练数据的较量 介绍 想象一下,有一个工具不仅可以理解错综复杂的关键字网络,还可以预测搜索引擎查询的变化趋势。 这就是生成式预训练 Transformer (GPT) 和其他人工智能技术发挥作用的地方,以我们从…