如何调整由两点定义的线的大小,使其受C++的最大线长度的约束

How to resize a line, defined by two points, so that its constrained by a maximum line length in C++

本文关键字:最大线长 约束 C++ 调整 何调整 定义 两点      更新时间:2023-10-16

我在研究如何将一行限制为最大长度时遇到了一些困难。假设我有两个SDL_Point的p1p2来构造一条线,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;
}

对此的任何指导将不胜感激!

您应该使用 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;