【问题标题】:Orthogonal Projection of Point onto Line点到直线的正交投影
【发布时间】:2016-03-02 15:59:27
【问题描述】:

我正在参考一篇数学论文,但术语很奇怪,我不确定如何编写以下代码:

如果点 P 的正交投影存在于 S(P2, P3) 上,则返回。

我找到了std::inner_product,但不确定这是否是正确的使用方法。

【问题讨论】:

  • 完整的问题是什么? Inner_product 是点积的别称,但这里是否需要使用它取决于问题。
  • @sashan 谢谢!我认为它们略有不同,我想知道如何在给定具有点 x 和 y 的结构而不是向量的情况下使用它

标签: c++ math linear-algebra


【解决方案1】:

概念是将 P 投影到 S 上,然后检查投影 P' 是否在 P2 和 P3 之间。

为了简单一点,你说 P2 是 S 的支持向量,P3-P2 是方向向量。然后将 P-P2 投影到标准化的 P3-P2 上(计算它们之间的标量积),从而得出 P' 到 P2 的距离 D。 现在在您的情况下,您只想知道 P' 是否在 P2 和 P3 之间。如果 D 介于 0 和 1 之间,则为真。

【讨论】:

  • 谢谢!首先,我不会规范化 P-P2 吗?
  • 好问题。不,你不会,因为 P 到 P2 的距离不会对 P' 产生影响,但它应该。
【解决方案2】:

您希望 P 的正交投影(在 P2 和 P3 给出的线上)位于段 [P2,P3] 内。从数学上讲,它写得很简单(我注意到向量 AB 的 vect(A, B),因为我不知道如何使用箭头符号):

0 <= vect(P2, P) . vect (P2, P3) <= vect(P2, P3) . vect(P2, P3)

您确实可以使用std::inner_product,但如果您的观点很简单:

struct Point {
    double x;
    double y;
};

你可以使用

double operator - (const Point& a, const Point& b) {
    return a.x - b.x + a.y - b.y;
}
double operator * (const Point& a, const Point& b) {
    return a.x * b.x + a.y * b.y;
}

而数学公式只是给出:

bool is_proj_inside(const Point& P, const Point& P2, const Point& P3) {
    double p_proj = (P - P2) * (P3 - P2);
    double p3_proj = (P3 - P2) * (P3 - P2);

    return (p_proj >= 0) && (p_proj <= p3_proj);
}

【讨论】:

  • 第二次检查(p_proj &lt;= p3_proj)是否只是检查点P`是否在P3的左侧?
  • @DaynaJuliana:这就是我从数学角度开始的原因。 p_proj >= 0 表示它在 P2 之后(在面向 P2->P3 的行中),p_proj =0 是有保证的,因为它是一个平方积。
【解决方案3】:

是的,您可以使用 inner_product(点积)以非常简单的方式获取结果。

制作向量

V2 = P - P2
V3 = P - P3
V =  P3 - P2

寻找点积的迹象 D2 = Dot(V2,V)D3 = Dot(V3,V)

如果

点 P 的投影位于 S(P2, P3)
D2 >=0 and
D3 <=0

注意 - 不需要归一化、平方根等。只是一些减法、乘法和加法。

(解释 - 角度 P-P2-P3P-P3-P2 应该是锐角或右角)

【讨论】:

  • 似乎这两个答案不一致。这与其他答案有何不同? V也不需要归一化吗?
  • 我们只比较符号,所以不需要标准化。两个答案并不矛盾——它们只是提出了不同的方法(有很多方法可以解决这个问题)
猜你喜欢
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 2013-01-22
  • 2015-03-07
相关资源
最近更新 更多