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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top