如何调整由两点定义的线的大小,使其受 C++ 中的最大线长度约束
How to resize a line, defined by two points, so that its constrained by a maximum line length in C++
我在想出如何将一条线限制为最大长度时遇到了一些困难。假设我有两个 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;
}
任何关于这方面的指导将不胜感激!
您应该使用二维向量 class。这将使事情变得简单得多。
然后像
一样使用它
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;
我在想出如何将一条线限制为最大长度时遇到了一些困难。假设我有两个 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;
}
任何关于这方面的指导将不胜感激!
您应该使用二维向量 class。这将使事情变得简单得多。
然后像
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;