zyl910

优化技巧、硬件体系、图像处理、图形学、游戏编程、国际化与文本信息处理。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  215 随笔 :: 0 文章 :: 145 评论 :: 111万 阅读
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

一、问题提出

  已知一个n维向量A,和一个标量k,可将它们进行标量乘法运算,得到向量B——
B = kA

  那么,若只知两个共线的向量A、B,如何求k呢,既——
k = B/A = ?


二、解决办法

  我们可以将上下均乘以(点积,dot product)“A”——
k = B/A
= (B . A)/(A . A)
= (B . A)/( |A|^2 )
= (b1*a1 + b2*a2 + b3*a3 + ... + bn*an) / ( a1*a1 + a2*a2 + a3*a3 + ... + an*an )


三、几何解释、推广到非共线向量

  先回忆一下向量点积的的几何算法——
A . B = |A| * |B| * cos(th)
注:th是两个向量的夹角

  将上式除以 |A|(向量A的模长),可得出向量B在向量A上的投影的模长——
| Prj(B)A | = |A| * |B| * cos(th) / |A| = |B| * cos(th)

  将投影的模长再除以 |A|,既是 投影模长在总长度的比例——
k = | Prj(B)A | / |A| = (|B|/|A|) * cos(th)

  对于共线向量而言,很明显,就是先前欲求的标量k值。
  对于非共线向量而言,则是投影向量的相关k值。

  也就是说,不论是否共线,该除法都有值(除非A是零向量)。
  在很多时候,这个特性很有用。比如在写图形编辑系统时,需要计算点击位置是线段的哪一部分。因为鼠标点击坐标是有理数(比例尺),而线段的斜率有可能是无理数,这会造成两个向量不是共线的。而本文的除法算法,可以稳健的处理这一情况。而且投影向量更符合一般的操作习惯。

 

posted on   zyl910  阅读(9228)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示