Frage

Ich kam quer durch das: t = Klemme (t / d, 0, 1)  aber ich bin nicht sicher, wie diese Operation auf einem Vektor durchzuführen. Was sind die Schritte, um einen Vektor zu klemmen, wenn man die eigene Vektor Umsetzung wurde das Schreiben?

Danke

Klemme einen Vektor auf ein Minimum und ein Maximum Klemm

ex:

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))
War es hilfreich?

Lösung

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

Bearbeiten

min und max sind in der Regel primitive Operationen auf Vektoren. wenn Sie SSE Vektoren zum Beispiel verwenden, gibt es _mm_min_ps und _mm_max_ps intrinsics dass wiederum in MINPS und MAXPS Anweisungen auf x86.

Andere Tipps

Ich denke, wenn man klar sagen, was meinen Sie, dass Sie die meiste Arbeit zu finden, ist für Sie getan ...

Ich vermute, Sie die Länge die Vektorgröße (anstelle einer Vektordatenstruktur) zu liegen innerhalb eines bestimmten Bereichs begrenzen mögen, ohne seine Richtung zu ändern, nicht wahr?

So:

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

, wo die Umsetzung von length() und setlength() davon abhängen, wie Sie Ihren Vektor gespeichert haben.


Wenn Ihr Vektor in (Winkel, Größe) gespeichert bilden diese fast trivial. Wenn in rechtwinkliger Form gespeichert (dh. (X, y, z)) Sie length vom Pythagorian Satz bekommen und setlength sollte jeden commponent um einen Faktor von desired_length/current_length skaliert werden.

Die einfachste Antwort ist, wenn Sie einen Vektor in einem Koordinatensystem Sphärische berücksichtigen: {R, f, ?}. f und ? sind bereits darauf beschränkt [-p, + p] und [-½p, ½p +] trotzdem. Daher müssen Sie nur die Entfernung vom Ursprung R klemmen.

Nun, ich würde vorausgesetzt, Sie wollen würde jede der Koordinaten einzeln klemmen. So ...

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

Ich hoffe, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top