2016-03-02 79 views
2

我引用了數學論文,但術語是奇怪的,我不確定如何代碼如下:若S上存在點P的垂直投影正交投影線

返回(P2,P3)。

我發現std::inner_product但不確定是否使用正確的方法。

+1

什麼是完整的問題? Inner_product是dot產品的另一個名稱,但您是否需要在此使用取決於問題。 – sashang

+0

@sashang謝謝!我以爲他們有點不同,我想知道如何使用這個給定的結構與點x和y,而不是一個向量 – DaynaJuliana

回答

1

你想P的正投影(由P2和P3中給出的線)是段[P2,P3]內。在數學上,它只是寫(我注意到VECT(A,B)向量AB,因爲我不知道怎麼用箭頭表示):

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); 
} 
+0

第二個檢查'(p_proj <= p3_proj)'只是檢查點P'是否在P3的左邊? – DaynaJuliana

+1

@DaynaJuliana:這就是我從數學觀點開始的原因。 p_proj> = 0表示它在P2之後(在面向P2-> P3的行中)並且p_proj <= p3_proj表示它在P3之前。 BTW p3_proj> = 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

+0

謝謝!首先,我會不會使P-P2正常化? – DaynaJuliana

+0

好問題。不,你不會,因爲P到P2的距離對P'沒有影響,但它應該。 –

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應該是急性的或右)

+0

似乎這兩個答案是不一致的。這與其他答案有何不同?也不是V需要規範化嗎? – DaynaJuliana

+1

我們只比較標誌,所以不需要標準化。兩個答案並不矛盾 - 他們只是提出了不同的方法(有很多方法可以解決這個問題) – MBo