我来到这里: 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))
答案 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定理得到length
,setlength
应该将每个组合比例调整为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;
}
希望有所帮助。