문제

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 클래스를 직접 작성하고 어떤 방법을 사용할 것인지 모르기 때문입니다.

도움이 되었습니까?

해결책

구현 1은 입력 벡터의 일반 3D 교차 생성물로부터 발생하는 벡터의 크기를 반환하여 z 값을 암시 적으로 0으로 취합니다 (즉, 2D 공간을 3D 공간에서 평면으로 처리). 3D 크로스 제품은 해당 평면에 수직이므로 0 X & Y 구성 요소가 있습니다 (따라서 스칼라는 3D 크로스 제품 벡터의 Z 값입니다).

3D 크로스 제품으로 인한 벡터의 크기는 또한 지역 두 벡터 사이의 평행 사변형 중 하나는 구현 1을 또 다른 목적으로 제공합니다. 또한,이 영역은 서명되며 V1에서 V2 로의 회전이 시계 방향 또는 시계 방향으로 이동하는지 여부를 결정하는 데 사용될 수 있습니다. 또한 구현 1 은이 두 벡터에서 구축 된 2x2 행렬의 결정 요인입니다.

구현 2는 동일한 2D 평면에서 입력 벡터에 수직 인 벡터를 반환합니다. 고전적인 의미의 교차 제품은 아니지만 "수직 벡터를 줘"감각에서 일관성이 있습니다.

3D 유클리드 공간은 크로스 제품 작동하에 닫힙니다. 즉, 2 개의 3D 벡터의 교차 생성물은 다른 3D 벡터를 반환합니다. 위의 2D 구현은 두 가지 방법과 일치하지 않습니다.

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

다른 팁

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

긴 설명 :

2D 공간에서 벡터로 크로스 제품을 할 수 없습니다. 작업은 거기에 정의되어 있지 않습니다.

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

벡터를 그런 식으로 확장하고 이러한 확장 된 벡터 쌍의 교차 생성물을 계산하면 z- 성분만이 의미있는 값을 갖는다는 것을 알 수 있습니다. x와 y는 항상 0이됩니다.

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

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

크로스 제품의 또 다른 유용한 특성은 그 크기가 두 벡터 사이의 각도의 사인과 관련이 있다는 것입니다.

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

또는

사인 (theta) = | axb | / (| a |. | b |)

따라서 위의 구현에서 if a 그리고 b 단위 벡터로 미리 알려져 있으며, 그 함수의 결과는 정확히 sine () 값입니다.

구현 1은입니다 Perp Dot 제품 두 벡터의. 2D 그래픽에 대해 내가 아는 최고의 참조는 우수합니다. 그래픽 보석 시리즈. 스크래치 2D 작업을하고 있다면 그렇습니다 진짜 이 책을 갖는 것이 중요합니다. IV 권에는 "Perp Dot Products의 즐거움"이라는 기사가 있습니다.

하나의 주요 사용 Perp Dot 제품 스케일을 얻는 것입니다 sin 두 벡터 사이의 각도는 도트 제품 스케일링을 반환합니다 cos 각도의. 물론 사용할 수 있습니다 도트 제품 그리고 Perp Dot 제품 함께 두 벡터 사이의 각도를 결정합니다.

여기 그것에 대한 게시물입니다 여기 Wolfram Math World 기사입니다.

나는 계산에 2D 크로스 제품을 사용하여 질량 중심에 비해 임의의 지점에서 힘 벡터에 의해 작동되는 객체에 대한 새로운 올바른 회전을 찾습니다. (스칼라 z 하나.)

유용한 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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top