#include <iostream>
using namespace std;
// CCW 함수: 세 점의 방향성을 판단합니다.
int ccw(int x1, int y1, int x2, int y2, int x3, int y3) {
// 벡터 AB와 벡터 AC의 외적 계산
int crossProduct = (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1);
// 방향성 판단
if (crossProduct > 0) {
return 1; // 반시계 방향 (Counter ClockWise)
} else if (crossProduct < 0) {
return -1; // 시계 방향 (ClockWise)
} else {
return 0; // 일직선 상 (Collinear)
}
}
// 메인 함수
int main() {
// 테스트 데이터 입력
int x1, y1, x2, y2, x3, y3;
cout << "세 점의 좌표를 입력하세요 (x1 y1 x2 y2 x3 y3): ";
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
// CCW 결과 확인
int result = ccw(x1, y1, x2, y2, x3, y3);
// 결과 출력
if (result == 1) {
cout << "반시계 방향 (Counter ClockWise)" << endl;
} else if (result == -1) {
cout << "시계 방향 (ClockWise)" << endl;
} else {
cout << "세 점이 일직선 상에 있습니다 (Collinear)" << endl;
}
return 0;
}
기본적으로 세개의 점이면 두개의 벡터를 만들수 있는데
이 두개의 벡터를 단위벡터로 사용하는 행렬식을 만들어서 이 행렬식이 0인지 음수인지 양수인지로
시계 반시계 일직선을 알 수 있다
https://www.youtube.com/watch?v=15VOaSeHYeY&pp=ygUQI-2cmOyWtOynhOqzoeyEoA%3D%3D
행렬식에 관해서 이 강의를 한번 시청해봐도 좋을것이다.
나는 행렬식으로 ccw를 이해했기때문에 행렬식에대한 gpt 설명을 첨부한다
행렬식의 기하학적 의미와 CCW 알고리즘의 연결
행렬식은 기하학적으로 좌표계를 변환하고, 해당 변환의 스케일링(크기 조정) 효과를 나타내는 데 중요한 역할을 합니다. 이 글에서는 행렬식의 기하학적 의미와 이를 기반으로 한 CCW 알고리즘의 원리를 설명합니다.
1. 행렬식의 기하학적 의미
2D 행렬의 정의
2D 행렬
A = abcd
의 행렬식은 다음과 같이 정의됩니다:
det(A) = ad - bc
기하학적 의미
- 행렬이 x-축과 y-축의 단위 벡터(기본 좌표축)를 새로운 좌표축으로 변환한다고 가정하면:
- 첫 번째 열 (a, c)는 새로운 x-축을 정의합니다.
- 두 번째 열 (b, d)는 새로운 y-축을 정의합니다.
- 행렬식의 절댓값은 변환된 좌표계에서의 단위 정사각형(기본 좌표계의 한 칸)의 넓이를 나타냅니다.
- 행렬식의 부호는 변환된 좌표계의 방향(시계 방향인지, 반시계 방향인지)을 나타냅니다.
2. 행렬식과 CCW의 연결
평행사변형 면적과 방향성
CCW 알고리즘은 세 점 A(x1, y1), B(x2, y2), C(x3, y3)가 이루는 삼각형을 기반으로 합니다.
벡터 AB와 AC는 새로운 좌표축처럼 작동합니다.
행렬식을 통한 계산
세 점이 이루는 삼각형을 포함한 평행사변형의 면적은 다음 행렬식으로 계산됩니다:
determinant = x2 - x1y2 - y1 x3 - x1y3 - y1
= (x2 - x1)(y3 - y1) - (y2 - y1)(x3 - x1)
면적의 방향성
- 행렬식이 양수: 변환된 좌표계가 반시계 방향으로 정렬됩니다.
- 행렬식이 음수: 변환된 좌표계가 시계 방향으로 정렬됩니다.
- 행렬식이 0: 세 점은 일직선 상에 있어 면적이 0입니다.
CCW의 본질
CCW는 다음과 같이 이해할 수 있습니다:
"벡터 AB와 AC를 이용해 새로운 좌표계를 형성했을 때, 해당 좌표계가 원래 좌표계와 동일한 방향인지(반시계) 또는 반대 방향인지(시계)를 판단하는 과정"
3. 행렬식이 "단위 벡터를 기준으로 한칸의 넓이"라는 관점에서 CCW 이해하기
기존 좌표계
- 기존 좌표계에서 단위 칸의 면적은 1이며, x-축과 y-축은 반시계 방향으로 배열되어 있습니다.
새로운 좌표계와 행렬식
- 행렬식은 새로운 좌표계에서 단위 칸의 면적(스케일링)과 방향(양수 또는 음수)을 나타냅니다.
- 예: 행렬식이 2라면, 새 좌표계의 단위 칸이 2배 넓고 방향은 반시계입니다.
- 예: 행렬식이 -1이라면, 새 좌표계의 단위 칸 크기는 동일하지만 방향이 시계로 전환됩니다.
4. CCW에서 행렬식의 사용 이유
행렬식을 통해 세 점의 관계를 해석
- 양수: 점 C가 벡터 AB의 "왼쪽"에 위치 → 반시계 방향.
- 음수: 점 C가 벡터 AB의 "오른쪽"에 위치 → 시계 방향.
- 0: 점 C가 벡터 AB 위에 위치 → 직선.
5. 시각적 직관
행렬식은 좌표계에서 한 칸의 넓이를 결정합니다. 이를 통해:
- 세 점 A, B, C가 형성한 삼각형이나 평행사변형의 면적과 방향을 계산할 수 있습니다.
- 행렬식의 부호는 좌표계의 회전 방향(시계/반시계), 절댓값은 면적의 크기를 나타냅니다.
6. 결론
행렬식은 좌표계를 변환할 때 단위 벡터를 기준으로 한 칸의 넓이를 나타냅니다.
CCW에서 행렬식의 역할은, 주어진 점들이 이루는 새로운 좌표계가 원래 좌표계와 같은 방향(양수)인지, 반대 방향(음수)인지, 또는 일직선 상(0)에 있는지를 판단하는 것입니다.
이 글을 통해 행렬식의 기하학적 의미와 CCW 알고리즘의 본질을 이해할 수 있기를 바랍니다! 😊
'알고리즘 > 코드' 카테고리의 다른 글
벨만포드 C++ 코드 (0) | 2024.11.06 |
---|---|
다익스트라 C++ 코드 (0) | 2024.11.06 |
LIS, LCS C++코드 (0) | 2024.08.26 |
플로이드 워셜 C++코드 (0) | 2024.08.26 |
에라토스테네스의 체 C++ 코드 (0) | 2024.06.26 |