Domanda

Sono venuto attraversavano questo: t = morsetto (t / d, 0, 1)  ma non sono sicuro di come eseguire questa operazione su un vettore. Quali sono i passi per bloccare un vettore, se uno è stato iscritto la loro propria implementazione vettore?

Grazie

morsetto di serraggio un vettore ad un minimo e un massimo

es:

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))
È stato utile?

Soluzione

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

modifica

min e max sono di solito operazioni primitive su vettori. Ad esempio, se si sta utilizzando vettori SSE, ci sono _mm_min_ps e _mm_max_ps intrinseci che si trasformano in MINPS e MAXPS istruzioni x86.

Altri suggerimenti

Credo che una volta che si stato chiaramente cosa si intende troverete che la maggior parte del lavoro è fatto per voi ...

Sto indovinando si vuole limitare il lunghezza della grandezza vettoriale (piuttosto che una struttura di dati vettoriali) rientri in un intervallo specificato senza cambiare la sua direzione, no?

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

se la realizzazione delle length() e setlength() dipendono da come avete memorizzato il vostro vettore.


Se il vettore è memorizzato in (angolo, magnitudo) formano questo è quasi banale. Se conservato in forma cartesiana (es. (X, y, z)) si ottiene length dal teorema Pythagorian e setlength dovrebbe scala di ciascun commponent di un fattore desired_length/current_length.

La risposta più semplice è quando si considera un vettore in un sistema di coordinate sferiche: {R, φ, θ}. φ e θ sono già limitati a [-π, π +] e [-½π, + ½π] in ogni caso. Quindi, avete solo bisogno di fissare la distanza dall'origine R.

Bene, mi piacerebbe supponendo che ci si vuole bloccare ciascuna delle coordinate individualmente. Quindi ...

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

La speranza che aiuta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top