2015-04-16 10 views
0

我在處理如何將線限制爲最大長度時遇到一些困難。假設我有兩個SDL_Point的p1p2構成一條線,p2由鼠標位置決定,而p1是恆定的。我有一個函數可以計算線的長度,並檢查該長度是否大於最大長度。如果它大於最大長度,我想縮放線條以使角度相同,效果將會是p2已縮放以符合最大長度標準。如何調整由兩點定義的線的大小,使其受C++中的最大線長限制

我使用這種方法來計算距離:

double Foo::CalculateDistance(SDL_Point p1, SDL_Point p2) 
{ 
    int xd = p2.x- p1.x; 
    int yd = p2.y - p1.y; 
    return sqrt(xd*xd + yd*yd); 
} 

SDL_Point Foo::CalculatePosition(int mousePosX, int mousePosY) 
{ 
    SDL_Point p2; 
    p2.x = mousePosX; 
    p2.y = mousePosY; 
    lineLength = (int) CalculateDistance(p2,p1); 
    if (lineLength > MAX_LINE_LENGTH) 
    { 
     // Buggy code 
     p2.x /= lineLength; 
     p2.y /= lineLength; 
    } 

    return p2; 
} 

對此有何指導,將不勝感激!

+1

提示:尋找*角*,然後'p2.x'和'p2.y'可以通過'sin'和'cos'來計算。 – usr2564301

+4

@Jongware這是困難的方式。 –

回答

6

您應該使用2d矢量類。這會讓事情變得更簡單。
然後用它像

p2 = p1 + (p2 - p1).normalized() * MAX_LINE_LENGTH; 

或沒有載體

p2.x = p1.x + (p2.x - p1.x)/lineLength * MAX_LINE_LENGTH; 
p2.y = p1.y + (p2.y - p1.y)/lineLength * MAX_LINE_LENGTH; 

和一個完整的例子

SDL_Point p2; 
p2.x = mousePosX; 
p2.y = mousePosY; 

lineLength = (int) CalculateDistance(p2,p1); 

if (lineLength > MAX_LINE_LENGTH) 
{ 
    p2.x = p1.x + (p2.x - p1.x)/lineLength * MAX_LINE_LENGTH; 
    p2.y = p1.y + (p2.y - p1.y)/lineLength * MAX_LINE_LENGTH; 
} 

return p2; 
+0

不幸的是,我不被允許在這個項目中有一個人在未來看這個偉大的建議! – JH95

+1

你忘了結論:'p2.x = p1.x + x; p2.y = p1.y + y;' –

+0

@MarkRansom新增 – Axalo

相關問題