1

我遇到了这个: t = Clamp(t/d, 0, 1) 但我不确定如何对向量执行此操作。如果一个人正在编写自己的向量实现,那么钳位向量的步骤是什么?

谢谢

将向量钳位到最小值和最大值

前任:

pc = # the point you are coloring now
p0 = # start point
p1 = # end point
v = p1 - p0
d = Length(v)
v = Normalize(v) # or Scale(v, 1/d)

v0 = pc - p0

t = Dot(v0, v)
t = Clamp(t/d, 0, 1)

color = (start_color * t) + (end_color * (1 - t))
4

4 回答 4

5

我认为,一旦你清楚地说明你的意思,你会发现大部分工作都是为你完成的......

我猜您想将向量(而不是向量数据结构)的长度限制在指定范围内而不改变其方向,不是吗?

所以:

if (v.length > max)
   v.setlength(max)
else if (v.length < min)
   v. setlength(min)

实现的地方length()取决于setlength()你如何存储你的向量。


如果您的矢量以(角度,幅度)形式存储,这几乎是微不足道的。如果以笛卡尔形式存储(即 (x,y,z) ),您可以length从勾股定理得到,并且setlength应该将每个分量缩放desired_length/current_length.

于 2010-06-09T19:41:03.790 回答
4
clamp(vec, lb, ub) == min(max(vec, lb), ub)

编辑

min 和 max 通常是向量上的原始操作。例如,如果您使用 SSE 向量,则有_mm_min_ps_mm_max_ps内在函数在 x86 上转换为MINPSMAXPS指令。

于 2010-06-09T19:39:28.587 回答
0

最简单的答案是当您考虑球坐标系中的向量时:{R, φ, θ}。无论如何,φ 和 θ 已经被限制为 [-π,+π] 和 [-½π, +½π]。因此,您只需要钳制与原点 R 的距离。

于 2010-06-10T09:19:50.607 回答
-3

好吧,我假设你想单独夹住每个坐标。所以...

void clamp(const Vector3 &v, const Vector3 &min, const Vector3 &max)
{
    v.x = clamp(v.x, min.x, max.x);
    v.y = clamp(v.y, min.y, max.y);
    v.z = clamp(v.z, min.z, max.z);
}

int clamp(int value, int min, int max)
{
    if (value < min)
    {
        return min;
    }
    else if (value > max)
    {
        return max;
    }

    return value;
}

希望有帮助。

于 2010-06-09T19:42:48.130 回答