我在解决如何将线路限制到最大长度方面遇到了一些困难.假设我有两个SDL_Point p1并p2构造一条线,p2由鼠标位置确定并且p1是常量.我有一个函数来计算线的长度,我检查该长度是否大于最大长度.如果它大于我想要缩放线的最大长度,那么角度是相同的,效果将被p2缩放以满足最大长度标准.
我正在使用这种方法来计算距离:
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;
}
Run Code Online (Sandbox Code Playgroud)
任何有关这方面的指导将非常感谢!
你应该使用2d矢量类.这将使事情变得更加简单.
然后像使用它一样
p2 = p1 + (p2 - p1).normalized() * MAX_LINE_LENGTH;
Run Code Online (Sandbox Code Playgroud)
或没有载体
p2.x = p1.x + (p2.x - p1.x) / lineLength * MAX_LINE_LENGTH;
p2.y = p1.y + (p2.y - p1.y) / lineLength * MAX_LINE_LENGTH;
Run Code Online (Sandbox Code Playgroud)
和一个完整的例子
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |