Pergunta

De wikipedia:

o produto cruzado é uma operação de binário em dois vectores em um tridimensional espaço euclidiano que resulta em outro vector, que é perpendicular ao plano que contém os dois vectores de entrada.

Tendo em conta que a definição só é definida em três ( ou sete anos, um e zero ) dimensões, como é que um cálculo do produto vectorial dos dois vectores 2d?

Eu vi duas implementações. Um retorna um novo vetor (mas só aceita um único vector), o outro retorna um escalar (mas é um cálculo entre dois vetores).

Implementação 1 (devolve um escalar):

float CrossProduct(const Vector2D & v1, const Vector2D & v2) const
{
    return (v1.X*v2.Y) - (v1.Y*v2.X);
}

de execução 2 (retorna um vector):

Vector2D CrossProduct(const Vector2D & v) const
{
    return Vector2D(v.Y, -v.X);
}

Por implementações diferentes? O que eu iria usar a implementação escalar para? O que eu iria usar a implementação vector para?

A razão que eu peço é porque eu estou escrevendo uma classe Vector2D mim e não sei qual método usar.

Foi útil?

Solução

Implementação 1 devolve a magnitude do vector que iria resultar a partir de um produto cruzado 3D regular dos vectores de entrada, tendo os seus valores de Z implicitamente como 0 (isto é, tratando o espaço 2D como um plano no espaço 3D). O produto cruzado 3D será perpendicular a este plano, e assim, tem 0 X & Y componentes (portanto o escalar devolvido é o valor Z do vector produto cruzado 3D).

Note que a magnitude do vetor resultante de produto cruzado 3D também é igual ao área do paralelogramo entre os dois vetores, o que dá Implementação 1 outra finalidade. Além disso, esta área é assinado e pode ser utilizado para determinar se rotação de V1 a V2 move-se num sentido anti-horário ou no sentido horário. Também deve-se notar que a implementação 1 é o determinante da matriz 2x2 construído a partir desses dois vetores.

Implementação 2 devolve um vector perpendicular ao vector de entrada ainda no mesmo plano 2D. Não é um produto cruzado no sentido clássico, mas consistente no "dá-me um vetor perpendicular" sentido.

Note-se que o espaço euclidiano 3D é fechada sob a operação de produto cruzado - isto é, um produto de cruzamento de dois vectores 3D retorna outro vector 3D. Ambos acima implementações 2D são inconsistentes com que de uma forma ou de outra.

Espero que isso ajude ...

Outras dicas

Em resumo:. É uma notação abreviada para um hack matemática

explicação longa:

Você não pode fazer um produto cruz com vetores no espaço 2D. A operação não é definido lá.

No entanto, muitas vezes é interessante avaliar o produto cruzado de dois vectores, assumindo que os vectores de 2D são estendidos a 3D, definindo a sua coordenada z para zero. Este é o mesmo que trabalhar com vectores 3D sobre o plano xy.

Se você estender os vetores que forma e calcular o produto cruzado de tal par vector estendida você vai perceber que apenas o z-componente tem um valor significativo:. X e y será sempre zero

Essa é a razão por que o z-componente do resultado é muitas vezes simplesmente retornado como um escalar. Isto pode escalar por exemplo, ser usado para encontrar a dissolução de três pontos no espaço 2D.

A partir de um ponto matemático puro de vista o produto cruzado no espaço 2D não existe, a versão escalar é o hack e um produto de cruz 2D que retorna um vetor 2D não faz sentido em tudo.

Outra propriedade útil do produto cruzado é que a sua magnitude está relacionada com o seno do ângulo entre os dois vetores:

| um x b | = | A | . | B | . sine (teta)

ou

sine (theta) = | um x b | / (| |. | A b |)

Assim, a implementação 1 acima, se a e b são conhecidos de antemão a ser vetores unitários, em seguida, o resultado dessa função é exatamente isso sine valor ().

Implementação 1 é o perp dot produto dos dois vetores. A melhor referência que eu sei de para gráficos 2D é o excelente Gráficas Gems série. Se você está fazendo zero trabalho 2D, é realmente importante ter esses livros. Volume IV tem um artigo chamado "The Pleasures of Perp Dot produtos" que vai sobre um monte de usos para ele.

Um maior uso de produto perp dot é obter a sin escalado do ângulo entre os dois vetores, assim como o dot produto retorna o cos escalado do ângulo . Claro que você pode usar dot produto e produto perp dot em conjunto para determinar o ângulo entre dois vetores.

Aqui é um post sobre ele e < a href = "http://mathworld.wolfram.com/PerpDotProduct.html" rel = "nofollow"> aqui é o artigo Wolfram Math Mundial.

Eu estou usando produto cruzado 2d no meu cálculo para encontrar a nova rotação correto para um objeto que está sendo atuado por um vetor de força em um ponto relativo arbitrário ao seu centro de massa. (Z A um escalar.)

Uma operação útil vector 2D é um produto transversal que retorna um escalar. Eu usá-lo para ver se duas bordas sucessivas em uma curva polígono esquerda ou direita.

A partir da Chipmunk2D fonte:

/// 2D vector cross product analog.
/// The cross product of 2D vectors results in a 3D vector with only a z component.
/// This function returns the magnitude of the z value.
static inline cpFloat cpvcross(const cpVect v1, const cpVect v2)
{
        return v1.x*v2.y - v1.y*v2.x;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top