質問
私はこのaccrossに来ました: T =クランプ(T / D、0、1) 私は、ベクターでこの操作を実行するかどうかはわかりません。何は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)
編集
最小値と最大値は、通常のベクトルの基本操作です。あなたは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