题
我来翻过这样的: 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))
解决方案
clamp(vec, lb, ub) == min(max(vec, lb), ub)
修改强>
min和max通常是在载体的原语操作。例如,如果你使用SSE矢量,还有的 _mm_min_ps 和<强> _mm_max_ps 强>内在其转成的 MINPS 和<强> MAXPS 强>上的x86指令。
其他提示
我认为一旦你清楚说明你的意思,你会发现,大部分的工作是为你...
完成我猜要限制在长度矢量量(而不是矢量数据结构),以在指定范围内的谎言不改变其方向,不是吗?
所以:
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
的因子缩放每个commponent。
在最简单的答案是当你考虑在一个球坐标系的矢量:{R,φ,θ}。 φ和θ都已经限于[-π,+π]和[-½π,+½π]反正。因此,你只需要从原点R钳位的距离。
好了,我会假设你要单独夹每个坐标。所以......
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;
}
希望有所帮助。
不隶属于 StackOverflow