가능한 중복 :
How do you detect where two line segments intersect?두 선분이 교차하는지 확인 하시겠습니까?
사람이 두 선분이 교차하는 경우 결정하는 알고리즘 또는 C 코드를 제공 할 수 있습니까?
가능한 중복 :
How do you detect where two line segments intersect?두 선분이 교차하는지 확인 하시겠습니까?
사람이 두 선분이 교차하는 경우 결정하는 알고리즘 또는 C 코드를 제공 할 수 있습니까?
두 줄로 equation을 빌드하고 교차점을 찾은 다음 해당 세그먼트에 속하는지 확인하십시오.
정말 선이 표시되는 방법에 따라 다릅니다. 나는 당신이 그들을 파라 메트릭 형태
X (t) = U + t V
표현했다고 가정거야 x (t) = u,210 + s는 벡터 ℜ 2에 (더 굵게 표시) 여기에
1 상기 X 년대, U 년대 및 V 't V 및 t ∈ [0, 1].
두 선분 모두에있는 점이 있으면이 두 점이 교차합니다. 어떤 시점 P있다 따라서 만약 그렇게
P = X 0 (t) = 에서이 있다고 U 0 + t V 0
및
P = X 1 (S) = U 1 + S V 1
그리고 또한, 모두 S, T ∈ [0, 1]이면 두 선이 교차합니다. 그렇지 않으면, 그들은하지 않습니다.
우리는이 등식을 결합하면, 우리는
U + t V = U +의 V
를 얻을 수
또는 등가
U 0 - U 1 = S V 1 - t V 0
U 0 = (x 43,210, Y 00)
U 1 = (X 10, Y 10)
V 0 = (X 01, Y)
우리가 매트릭스 형태로 상기 식을 재 기입하면
, 우리가 지금
| x00 - x10 | | x11 | | x01 |
| y00 - y10 | = | y11 | s - | y01 | t
이 턴 등가로되어있다 = ( 11는 Y, X 11)V 1 행렬 표현으로
| x00 - x10 | | x11 x01 | | s|
| y00 - y10 | = | y11 y01 | |-t|
이제 두 가지 경우가 있습니다. 고려하다. 첫 번째,이 왼쪽면이 제로 벡터이면 사소한 해결책이 있습니다. 단지 s = t = 0으로 설정하고 점들이 교차합니다. 그렇지 않으면 오른편 행렬이 역전 일 때만 유일한 해법이 있습니다.우리는 그 다음 행렬의 역행렬을
| x11 x01 |
d = det(| y11 y01 |) = x11 y01 - x01 y11
을하게되면 그건 경우
| x11 x01 |
| y11 y01 |
는 결정이 0 인 경우이 행렬이 정의되지 않았
| y01 -x01 |
(1/d) | -y11 x11 |
참고로 제공되지만, true는 라인이 평행하고 따라서 교차하지 않는다는 것을 의미합니다.
| s| | y01 -x01 | | x00 - x10 |
|-t| = (1/d) | -y11 x11 | | y00 - y10 |
| (x00 - x10) y01 - (y00 - y10) x01 |
= (1/d) | -(x00 - x10) y11 + (y00 - y10) x11 |
그래서이 이들 값 모두
s = (1/d) ((x00 - x10) y01 - (y00 - y10) x01)
t = (1/d) -(-(x00 - x10) y11 + (y00 - y10) x11)
경우 것을 의미 행렬이 가역 인 경우, 우리는이 행렬로 왼쪽 곱하여 상기 선형 시스템을 해결
[0, 1]의 범위에 있으면 두 선분이 교차하여 교차점을 계산할 수 있습니다. 그렇지 않으면 교차하지 않습니다. 또한 d가 0이면 두 선이 평행을 이루며 이는 관심의 대상이 될 수도 있고 아닐 수도 있습니다. 이것을 C로 코딩하는 것은 그렇게 나쁘지 않아야합니다. 당신은 0으로 나누지 않도록 조심해야합니다.
희망이 도움이됩니다. 누구든지 수학을 재확인 할 수 있다면 좋을 것입니다.
C 언어를 사용하고 있습니다 – user420878
비행기 또는 3D 공간에 있습니까? – galymzhan
입력은 어떻게 주어 집니까? – sunmoon