#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)가 이루는 삼각형을 기반으로 합니다.

벡터 ABAC는 새로운 좌표축처럼 작동합니다.

행렬식을 통한 계산

세 점이 이루는 삼각형을 포함한 평행사변형의 면적은 다음 행렬식으로 계산됩니다:

determinant = x2 - x1y2 - y1 x3 - x1y3 - y1

= (x2 - x1)(y3 - y1) - (y2 - y1)(x3 - x1)

면적의 방향성

  • 행렬식이 양수: 변환된 좌표계가 반시계 방향으로 정렬됩니다.
  • 행렬식이 음수: 변환된 좌표계가 시계 방향으로 정렬됩니다.
  • 행렬식이 0: 세 점은 일직선 상에 있어 면적이 0입니다.

CCW의 본질

CCW는 다음과 같이 이해할 수 있습니다:

"벡터 ABAC를 이용해 새로운 좌표계를 형성했을 때, 해당 좌표계가 원래 좌표계와 동일한 방향인지(반시계) 또는 반대 방향인지(시계)를 판단하는 과정"

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

+ Recent posts