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

标签 c++ geometry line

我在想出如何将一条线限制为最大长度时遇到了一些困难。假设我有两个 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;
}

如有任何指导,我们将不胜感激!

最佳答案

您应该使用二维 vector 类。这将使事情变得简单得多。
然后像这样使用它

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;

关于c++ - 如何调整由两点定义的线的大小,使其受 C++ 中的最大线长度约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29687029/

相关文章:

c++ - 只改变成员的子类是有效的做法吗?

c++ - cin 导致运行时错误

c++ - 未执行代码的性能

java - Bukkit:如何获得玩家到圆边缘的距离?

c++ - 几何变换

c++ - 生成字符串的所有可能的唯一子串

css - 如何修复悬停时CSS变换添加的白线?

PowerShell 获取大(大)文件的行数

javascript - 用一条线连接两个圆圈(使用 DOM 元素)