벡터의 외적
벡터의 내적과 외적의 가장 큰 차이는 내적은 결과값이 스칼라값이라는 점이고 외적은 벡터값이라는 것이다. 2차원에서 외적을 활용하기가 다소 어렵다. 그럼에도 벡터의 외적을 활용할수 있는 방법에 대해 알아보고자 한다.
게임수학) Chapter2. 벡터
스칼라 (Scalar) ㆍ흔히 생각할 수 있는 수치. ㆍ거리의 값이 있을 때 이 값은 방향정보는 가지고 있지 않고 오로지 수치만을 나타내는것이 스칼라 값. 벡터(Vector) ㆍ벡터를 사용하면 정적인 위치
pjnull.tistory.com
2D에서의 외적 활용
외적은 2D에서 시계/반시계방향을 체크하는데 매우 유용하게 쓰인다. 이러한 방향 체크는 다소 불필요해 보이지만 범위를 체크하는데 매우 유용하다.
위의 세가지 벡터가 있다. 각각 v1과vp vp와v2에 대해서 외적을 실행할 경우 재밋는 결과가 나오는데, v2 v1범위 내에 vp가 존재할 경우 외적의 부호값이 동일하고 만약 범위에서 벗어날 경우 두 외적값의 부호가 다르게 나온다. 실제 코드에서 이러한 결과를 확인하면 더욱 확실히 알수 있을 것이다.
활용하기
앞서 설명한 외적을 이용하여 삼각형의 세 꼭지점(_ptr1,_ptr2,_ptr3)에서 부터 9가지 벡터를 이용해 삼각형 내부에 마우스가 존재하는지를 판별하는 프로그램을 구현하고자 한다. 마우스가 삼각형 내부에 있을 경우 모든 외적의 부호가 양수가 되고 각 범위를 벗어날 경우 해당 외적의 부호가 음수가 된다.
float Cross(Vector other) //외적
{
return x * other.y - y * other.x;
}
Utils::DrawLine(hdc, _ptr1, _ptr2);
Utils::DrawLine(hdc, _ptr2, _ptr3);
Utils::DrawLine(hdc, _ptr3, _ptr1);
Utils::DrawLine(hdc, _ptr1, mousepos);
Utils::DrawLine(hdc, _ptr2, mousepos);
Utils::DrawLine(hdc, _ptr3, mousepos);
Vector v12 = _ptr2 - _ptr1;
Vector v1m = mousepos - _ptr1;
Vector v13 = _ptr3 - _ptr1;
Vector v21 = _ptr1 - _ptr2;
Vector v2m = mousepos-_ptr2;
Vector v23 = _ptr3 - _ptr2;
Vector v31 = _ptr1 - _ptr3;
Vector v3m = mousepos - _ptr3;
Vector v32 = _ptr2 - _ptr3;
v12.Normalize();
v1m.Normalize();
v13.Normalize();
v21.Normalize();
v2m.Normalize();
v23.Normalize();
v31.Normalize();
v3m.Normalize();
v32.Normalize();
float c1 = v12.Cross(v1m);
float c2 = v1m.Cross(v13);
float c3 = v23.Cross(v2m);
float c4 = v2m.Cross(v21);
float c5 = v31.Cross(v3m);
float c6 = v3m.Cross(v32);
wstring str = format(L"c1({0}),c2({1}),c3({2}),c4({3}),c5({4}),c6({5})",c1,c2,c3,c4,c5,c6);
Utils::DrawText(hdc, {20,50},str);
마우스가 삼각형 안에 위치할 경우
마우스가 해당 범위에서 벗어날 경우
이런식으로 범위에 따라 부호가 달라지는 것을 확인할수 있다.
'게임엔진 > 윈도우API' 카테고리의 다른 글
윈도우API)12. 모작 (1) | 2022.12.23 |
---|---|
윈도우API)11. 역삼각함수 (0) | 2022.12.23 |
윈도우API)9. 벡터의 내적 (0) | 2022.12.22 |
윈도우API)8. 벡터 (0) | 2022.12.18 |
윈도우API)7. 삼각함수 (0) | 2022.12.18 |
댓글