2D 벡터의 외적 계산
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 유클리드 공간은 외적 연산에서 닫힙니다. 즉, 두 3D 벡터의 외적은 다른 3D 벡터를 반환합니다. 위의 2D 구현은 모두 어떤 식 으로든 일치하지 않습니다.
도움이 되었기를 바랍니다...
요컨대 : 수학적 해킹에 대한 속기 표기법입니다.
긴 설명 :
2D 공간에서는 벡터로 외적을 할 수 없습니다. 작업이 정의되어 있지 않습니다.
그러나 종종 2D 벡터가 z 좌표를 0으로 설정하여 3D로 확장된다고 가정하여 두 벡터의 외적을 평가하는 것이 흥미 롭습니다. 이것은 xy 평면에서 3D 벡터로 작업하는 것과 동일합니다.
이러한 방식으로 벡터를 확장하고 확장 된 벡터 쌍의 외적을 계산하면 z 구성 요소 만 의미있는 값이 있음을 알 수 있습니다. x와 y는 항상 0입니다.
이것이 결과의 z 성분이 종종 단순히 스칼라로 반환되는 이유입니다. 예를 들어이 스칼라는 2D 공간에서 세 점의 권선을 찾는 데 사용할 수 있습니다.
순수한 수학적 관점에서 2D 공간의 외적은 존재하지 않으며 스칼라 버전은 해킹이며 2D 벡터를 반환하는 2D 외적은 전혀 의미가 없습니다.
외적의 또 다른 유용한 특성은 그 크기가 두 벡터 사이 각도의 사인과 관련되어 있다는 것입니다.
| axb | = | a | . | b | . 사인 (세타)
또는
사인 (세타) = | axb | / (| a |. | b |)
따라서 위의 구현 1에서 a
및 b
사전에 단위 벡터로 알려진 경우 해당 함수의 결과는 정확히 sine () 값입니다.
구현 1은 두 벡터 의 perp 내적 입니다. 2D 그래픽에 대해 제가 아는 가장 좋은 참고 자료는 우수한 Graphics Gems 시리즈입니다. 스크래치 2D 작업을하고 있다면 이 책들을 가지고있는 것이 정말 중요합니다. Volume IV에는 "Perp Dot 제품의 즐거움"이라는 기사가 있습니다.
하나 개의 주요 사용 범인 도트 제품은 스케일 얻는 것입니다 sin
단지처럼 두 벡터 사이의 각도의 내적 (가) 조정 반환 cos
각도의. 물론 내적 과 perp 내적을 함께 사용하여 두 벡터 사이의 각도를 결정할 수 있습니다.
여기 그것에 포스트이며, 여기 볼프람 수학 세계 기사입니다.
내 계산에서 2d 외적을 사용하여 질량 중심에 상대적인 임의의 지점에서 힘 벡터에 의해 작용하는 물체에 대한 새로운 올바른 회전을 찾습니다. (스칼라 Z 1입니다.)
유용한 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;
}
참고 URL : https://stackoverflow.com/questions/243945/calculating-a-2d-vectors-cross-product
'Development Tip' 카테고리의 다른 글
Java 8의 기본 Xmxsize (0) | 2020.11.03 |
---|---|
Xcode 스토리 보드 : 내부 오류. (0) | 2020.11.03 |
HTML : 유효한 XHTML 방식으로 각 TABLE ROW에 FORM 태그를 가질 수 있습니까? (0) | 2020.11.03 |
Rails 마이그레이션 : 존재 여부를 확인하고 계속 진행 하시겠습니까? (0) | 2020.11.03 |
MySQL에 IP 주소를 저장하는 가장 효율적인 방법 (0) | 2020.11.03 |