선을 표현하는 3가지 방식이 있습니다.
- Line (직선) : 선의 양방향이 무한대로 뻗어나가는 선
- Ray (반직선) : 선의 한쪽 방향으로만 무한대로 뻗어나가는 선
- 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
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 |