2D 벡터의 외적 계산


85

wikipedia에서 :

외적은 3 차원 유클리드 공간 에서 두 벡터에 대한 이항 연산으로 , 두 입력 벡터를 포함하는 평면에 수직 인 또 다른 벡터를 생성합니다.

정의가 3 차원 ( 또는 7 차원, 1 차원 및 0 차원) 으로 만 정의된다는 점을 감안할 때 두 2D 벡터의 외적을 어떻게 계산합니까?

두 가지 구현을 보았습니다. 하나는 새 벡터를 반환하고 (단 하나의 벡터 만 허용 함) 다른 하나는 스칼라를 반환합니다 (하지만 두 벡터 간의 계산 임).

구현 1 (스칼라 반환) :

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

구현 2 (벡터 반환) :

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

왜 다양한 구현인가? 스칼라 구현은 무엇에 사용합니까? 벡터 구현은 무엇에 사용합니까?

내가 묻는 이유는 Vector2D 클래스를 직접 작성하고 어떤 방법을 사용해야할지 모르기 때문입니다.


10
구현 2가 잘못되었습니다. 외적을 형성하려면 두 개의 벡터가 필요합니다.
bobobobo 2009-06-24

7
구현 2는 주어진 벡터 v 를 -90도 회전시킵니다 . -90 in x' = x cos θ - y sin θy' = x sin θ + y cos θ. 이 구현의 또 다른 변형은 v 를 +90도 return Vector2D(-v.Y, v.X);회전시키는 것 입니다.
legends2k 2013

3
@ legends2k : 구현 2는 결정자를 사용하여 외적을 평가 하는 확장입니다 . 마지막 행과 열만 제거하면됩니다. 이러한 확장에는 항상 차원에 N-1대한 피연산자가 N있습니다.
Tim Čas 2015 년

4
구현 1 은 교차 곱 의 크기 를 계산합니다 .
Mateen Ulhaq

@MateenUlhaq 종류의, 그것은 "의 서명 크기는"
모리츠 Mahringer

답변:


100

구현 1은 입력 벡터의 정규 3D 외적에서 발생하는 벡터의 크기를 반환하며 Z 값을 암시 적으로 0으로 취합니다 (즉, 2D 공간을 3D 공간에서 평면으로 처리). 3D 외적은 해당 평면에 수직이므로 0 X 및 Y 구성 요소를 갖습니다 (따라서 반환 된 스칼라는 3D 외적 벡터의 Z 값입니다).

3D 외적의 결과로 생성되는 벡터의 크기도 두 벡터 사이의 평행 사변형 영역 과 동일하므로 구현 1에 또 다른 목적을 부여합니다. 또한이 영역은 서명되어 있으며 V1에서 V2 로의 회전이 시계 반대 방향 또는 시계 방향으로 이동하는지 여부를 결정하는 데 사용할 수 있습니다. 또한 구현 1은이 두 벡터로 구성된 2x2 행렬의 결정 자라는 점에 유의해야합니다.

구현 2는 여전히 동일한 2D 평면에있는 입력 벡터에 수직 인 벡터를 반환합니다. 고전적인 의미의 외적은 아니지만 "수직 벡터를주세요"라는 의미에서 일관성이 있습니다.

3D 유클리드 공간은 외적 연산에서 닫힙니다. 즉, 두 3D 벡터의 외적은 다른 3D 벡터를 반환합니다. 위의 2D 구현은 모두 어떤 식 으로든 일치하지 않습니다.

도움이 되었기를 바랍니다...


6
실제로 구현 2는 v와 z 방향을 가리키는 단위 벡터의 외적입니다.
mattiast

@mattiast : 맞습니다. 이것이 바로 2D '퍼프'작업이 3D로 설명되는 방식입니다.
Drew Hall

@mattiast : 구현 2는 결정자를 사용하여 외적을 계산 하는 확장으로 생각할 수 있습니다. --- 마지막 행 및 열만 제거합니다. 구현 1은 DotProduct(a, CrossProduct(b))"수직 내적"의 개념과 일치합니다.
Tim Čas 2015-10-29

첫 번째 단락에서 크기는 반환되는 항목의 절대 값입니다. Z 구성 요소와 완전히 동일하지 않습니다. 두 번째 단락에서 지적했듯이 십자가의 기호를 사용하여 뱀파이어를 격퇴 할 수 있습니다. 예를 들어, 벡터가 떠날 때와 다각형의 외곽선에 들어가는 때를 감지합니다.
Peter Cordes

68

요컨대 : 수학적 해킹에 대한 속기 표기법입니다.

긴 설명 :

2D 공간에서 벡터로 외적을 할 수 없습니다. 작업이 정의되어 있지 않습니다.

그러나 종종 2D 벡터가 z 좌표를 0으로 설정하여 3D로 확장된다고 가정하여 두 벡터의 외적을 평가하는 것이 흥미 롭습니다. 이것은 xy 평면에서 3D 벡터로 작업하는 것과 동일합니다.

이러한 방식으로 벡터를 확장하고 확장 된 벡터 쌍의 외적을 계산하면 z 구성 요소 만 의미있는 값이 있음을 알 수 있습니다. x와 y는 항상 0입니다.

이것이 결과의 z 성분이 종종 단순히 스칼라로 반환되는 이유입니다. 예를 들어이 스칼라는 2D 공간에서 세 점의 권선을 찾는 데 사용할 수 있습니다.

순수한 수학적 관점에서 2D 공간의 외적은 존재하지 않으며 스칼라 버전은 해킹이며 2D 벡터를 반환하는 2D 외적은 전혀 의미가 없습니다.


"예를 들어 2D 공간에서 세 점의 권선을 찾는 데 사용됩니다."@Nils Pipenbrinck,이 문맥에서 권선이란 무엇을 의미합니까?
Nader Belal

1
@NaderBelal 여기서 감기는 것을 의미한다고 생각합니다. a 지점에서 b 지점에서 c 지점으로 이동하면 방금 스팬 각도를 기준으로 시계 방향 또는 시계 반대 방향으로 이동할 것입니다.
Amit Tomar

12

외적의 또 다른 유용한 특성은 그 크기가 두 벡터 사이 각도의 사인과 관련되어 있다는 것입니다.

| axb | = | a | . | b | . 사인 (세타)

또는

사인 (세타) = | axb | / (| a |. | b |)

따라서 위의 구현 1에서 ab사전에 단위 벡터로 알려진 경우 해당 함수의 결과는 정확히 sine () 값입니다.


1
... 또한 벡터 a와 벡터 b 사이의 삼각형 면적의 두 배입니다.
Tim Lovell-Smith

5

구현 1은 두 벡터 의 perp 내적 입니다. 2D 그래픽에 대해 제가 아는 최고의 참고 자료는 우수한 Graphics Gems 시리즈입니다. 스크래치 2D 작업을하고 있다면 이 책들을 가지고있는 것이 정말 중요합니다. Volume IV에는 "Perp Dot 제품의 즐거움"이라는 기사가 있습니다.

하나 개의 주요 사용 범인 도트 제품은 스케일 얻는 것입니다 sin단지처럼 두 벡터 사이의 각도의 내적 (가) 조정 반환 cos각도의. 물론 내적perp 내적을 함께 사용하여 두 벡터 사이의 각도를 결정할 수 있습니다.

여기 그것에 포스트이며, 여기 볼프람 수학 세계 기사입니다.


3

내 계산에서 2d 외적을 사용하여 질량 중심에 상대적인 임의의 지점에서 힘 벡터에 의해 작용하는 물체에 대한 새로운 올바른 회전을 찾습니다. (스칼라 Z 1입니다.)


3

유용한 2D 벡터 연산은 스칼라를 반환하는 외적입니다. 다각형의 두 연속 가장자리가 왼쪽 또는 오른쪽으로 구부러 지는지 확인하는 데 사용합니다.

로부터 Chipmunk2D의 소스 :

/// 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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.