2015-04-16 15 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

相关问题