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 ベクトルを使用している場合、 x86 でMINPSおよびMAXPS命令に変換される_mm_min_psおよび_mm_max_ps組み込み関数があります。

于 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 に答える