Pregunta

Me encontré con esto: t = Abrazadera (t / d, 0, 1)  pero no estoy seguro de cómo realizar esta operación en un vector. Cuáles son los pasos para poner freno un vector si uno estaba escribiendo su propia implementación de vectores?

Gracias

abrazadera de sujeción un vector a un mínimo y un máximo

por ejemplo:

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))
¿Fue útil?

Solución

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

editar

min y max son generalmente operaciones primitivas en vectores. Por ejemplo, si estás usando vectores de la ESS, hay _mm_min_ps y _mm_max_ps intrínsecos que se convierten en MINPS y MAXPS instrucciones sobre x86.

Otros consejos

Creo que una vez que usted indique claramente lo que quiere decir que usted encontrará que la mayor parte del trabajo está hecho para usted ...

supongo que desea limitar el longitud de la cantidad vectorial (en lugar de una estructura de datos vectoriales) a se encuentran dentro de un rango especificado sin cambiar su dirección, ¿no?

Así que:

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

cuando la ejecución de length() y setlength() dependerá de cómo se ha almacenado su vector.


Si el vector se almacena en (ángulo, magnitud) forman esto es casi trivial. Si se almacena en forma cartesiana (es decir. (X, y, z)) se obtiene length del teorema Pythagorian y setlength debe escalar cada commponent por un factor de desired_length/current_length.

La respuesta más fácil es si se considera un vector en un sistema de coordenadas esféricas: {R, φ, θ}. φ y θ ya se limitan a [-π, π +] y [-½π, + ½π] de todos modos. Por lo tanto, sólo es necesario para sujetar la distancia desde el origen R.

Bueno, será asumiendo que querrías para sujetar cada una de las coordenadas de forma individual. Así que ...

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

Espero que ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top