Prender um vetor no mínimo e no máximo?
Pergunta
Eu vim acréscimo: t = grampo (t/d, 0, 1), mas não tenho certeza de como executar essa operação em um vetor. Quais são as etapas para prender um vetor se alguém estava escrevendo sua própria implementação de vetor?
Obrigado
Prendimento de aperto um vetor ao mínimo e um máximo
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))
Solução
clamp(vec, lb, ub) == min(max(vec, lb), ub)
editar
Min e Max são geralmente operações primitivas em vetores. Por exemplo, se você está usando vetores SSE, existem _mm_min_ps e _mm_max_ps Intrinsics que se transformam em Minps e Maxps Instruções em x86.
Outras dicas
Eu acho que, uma vez que você afirme claramente o que você quer dizer, você descobrirá que a maior parte do trabalho é feita para você ...
Acho que você quer limitar o comprimento da quantidade vetorial (em vez de uma estrutura de dados vetoriais) estar dentro de um intervalo especificado sem alterar sua direção, não?
Então:
if (v.length > max)
v.setlength(max)
else if (v.length < min)
v. setlength(min)
onde a implementação de length()
e setlength()
depende de como você armazenou seu vetor.
Se o seu vetor for armazenado (ângulo, magnitude), isso é quase trivial. Se armazenado na forma cartesiana (ou seja (x, y, z)) você recebe length
do teorema pitagoriano e setlength
deve escalar cada componente por um fator de desired_length/current_length
.
A resposta mais fácil é quando você considera um vetor em um sistema de coordenadas esféricas: {r, φ, θ}. φ e θ já estão limitados a [-π, +π] e [-½π, +½π] de qualquer maneira. Portanto, você só precisa prender a distância da origem R.
Bem, eu assumindo que você gostaria de prender cada uma das coordenadas individualmente. Então...
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 ajude.