Question

Je suis tombé sur ceci: t = Clamp (t / d, 0, 1)  mais je ne suis pas sûr de savoir comment effectuer cette opération sur un vecteur. Quelles sont les étapes pour serrer un vecteur si l'on écrivait leur propre implémentation de vecteur?

Merci

pince de serrage d'un vecteur à un minimum et un maximum

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))
Était-ce utile?

La solution

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

modifier

min et max sont des opérations généralement primitives sur les vecteurs. Par exemple, si vous utilisez des vecteurs SSE, il y a _mm_min_ps et _mm_max_ps intrinsics qui se transforment en MINPS et MAXPS instructions sur x86.

Autres conseils

Je pense qu'une fois que vous indiquer clairement ce que vous voulez dire que vous trouverez que la plupart du travail est fait pour vous ...

Je devine que vous voulez limiter la longueur de la quantité de vecteur (plutôt qu'une structure de données vectorielles) pour se situer dans une plage spécifiée sans changer sa direction, non?

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

où la mise en œuvre de length() et setlength() dépendent de la façon que vous avez enregistré votre vecteur.


Si votre vecteur est stocké sous forme (angle, amplitude) cela est presque trivial. Si elles sont stockées sous forme cartésienne (ie. (X, y, z)) vous obtenez length du théorème pythagoricien et setlength devrait évoluer chaque commponent par un facteur de desired_length/current_length.

La meilleure réponse est si l'on considère un vecteur dans un système de coordonnées sphériques: {R, φ, θ}. φ et θ sont déjà limités à [-π, + π] et [-½π, + ½π] de toute façon. , Il vous suffit donc de bloquer la distance de l'origine R.

Eh bien, je suppose que vous voudriez serrer chacune des coordonnées individuellement. Alors ...

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

L'espoir qui aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top