将矢量夹紧到最小和最大?

时间:2010-06-09 19:36:22

标签: c++ c algorithm clamp

我来到这里: t =钳位(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 个答案:

答案 0 :(得分:4)

clamp(vec, lb, ub) == min(max(vec, lb), ub)

修改

min和max通常是对向量的基本操作。例如,如果您使用的是SSE向量,则 _mm_min_ps _mm_max_ps 内在函数会变为 MINPS MAXPS 关于x86的说明。

答案 1 :(得分:4)

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

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

所以:

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

length()setlength()的实施取决于您存储矢量的方式。


如果你的矢量以(角度,幅度)形式存储,这几乎是微不足道的。如果以笛卡尔形式存储(即(x,y,z)),则从Pythagorian定理得到lengthsetlength应该将每个组合比例调整为desired_length/current_length

答案 2 :(得分:0)

最简单的答案是考虑球面坐标系中的矢量:{R,φ,θ}。无论如何,φ和θ已经限于[-π,+π]和[-½π,+ 1 /2π]。因此,您只需要夹住距离原点R的距离。

答案 3 :(得分:-4)

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

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;
}

希望有所帮助。