본문 바로가기
Computation Geography

5. 선 (Line), 선과 선의 교차점 체크하기

by SimonLee 2023. 9. 9.

선을 표현하는 3가지 방식이 있습니다.

 

  1. Line (직선) : 선의 양방향이 무한대로 뻗어나가는
  2. Ray (반직선) : 선의 한쪽 방향으로만 무한대로 뻗어나가는
  1. Line Segment (선분) : 선의 끝점이 고정된 .\

 

(Line) 방정식은 다음과 같이 표현합니다.

c = vt + a

v 방향 벡터을 의미합니다.

위의 변수 t 값의 의미는 v 벡터 방향으로 얼마나 떨어져 있는가를 말합니다.

 

특정 방향으로 얼마만큼 떨어져 있는 벡터 값에 a 점의 위치와 더해서 새로운 지점 c 만듭니다.

 

 

3차원인 좌표에 대해서는 t 대해서 다음과 같이 정리할수 있습니다.

 

 

1) 값이 (4, -1, 3)인 점 p를 통과하고 벡터(1, 4, -3)에 평행한 직선의 방정식을 찾아보세요.

 

 

2) 다음 두 직선의 방정식이 주어졌을때, 접점을 구하여라

 

Line과 Line의 교차점을 구하는 코드 입니다.

AB line, CD line이 교차점이 있는지 체크하는 함수입니다.

Orientation2d 함수의 구현은 아래 챕터를 참고하세요

https://graphicsimon.tistory.com/31

 

4. 벡터의 Orientation

벡터의 방향 (Orientation) 에 대해서 알아보자. 3차원 방향과 크기를 가리키는 벡터의 표현 방식은 (x, y, z)로 나타낼수 있다. 3차원 좌표도 동일하게 (x, y, z)로 나타낼수 있기 때문에 혼동하면 안된

graphicsimon.tistory.com

AB line과 CD line이 겹치는 경우 교차점이 생깁니다.

 

xor 함수 부분 해석은 다음과 같습니다.

1> AB line 기준으로

- point C가 좌측에 있으면 point D가 우측에 있어야 하고,

- point C가 우측에 있으면 point D가 좌측에 있어야 하고,

2> CD line 기준으로

- point A가 좌측에 있으면 point B가 우측에 있어야 하고,

- point A가 우측에 있으면 point B가 좌측에 있어야 합니다.

위 조건이 둘다 만족을 해야 교차점이 있습니다.

 

public bool Intersection(Point2d a, Point2d b, Point2d c, Point2d d)
{
    var ab_c = Orientation2d(a, b, c);
    var ab_d = Orientation2d(a, b, d);
    var cd_a = Orientation2d(c, d, a);
    var cd_b = Orientation2d(c, d, b);

    if (
        ab_c == RelativePosition.Beetween || ab_c == RelativePosition.origin || ab_c == RelativePosition.destination ||
        ab_d == RelativePosition.Beetween || ab_d == RelativePosition.origin || ab_d == RelativePosition.destination ||
        cd_a == RelativePosition.Beetween || cd_a == RelativePosition.origin || cd_a == RelativePosition.destination ||
        cd_b == RelativePosition.Beetween || cd_b == RelativePosition.origin || cd_b == RelativePosition.destination
    ) return true;

    var a1 = _xor(ab_c == RelativePosition.Left, ab_d == RelativePosition.Left);
    var a2 = _xor(cd_a == RelativePosition.Left, cd_b == RelativePosition.Left);
    return a1 && a2;
}

 

'Computation Geography' 카테고리의 다른 글

7. 두 점(Point)의 교점 구하기  (0) 2023.09.13
6. 면 (Plane)  (0) 2023.09.11
4. 벡터의 Orientation  (2) 2023.09.09
1. 벡터의 기본 (덧셈, 뺄셈, Magnitude, Normalize)  (0) 2023.09.02
3. 외적 ( Cross Product )  (0) 2023.09.01