线上正交投影

时间:2016-03-02 06:52:54

标签: c++ math linear-algebra

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

enter image description here

答案 1 :(得分:1)

是的,您可以使用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应该是锐利的还是正确的)

答案 2 :(得分:1)

您希望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);
}