algorithm

[기하] 선분과 선분의 교차점

아르비스 2019. 7. 19. 13:16

이차원 평면으로 직선의 연립방정식으로 교차점을 구하는 방식은 예외처리를 따로 해주어야 하고, 복잡함.

 Cramer's rule(크라메르 공식)을 활용하여 해결 시도함.

 만약, 선형 방정식의 해가 존재하지 않는다면 두 직선은 평행한 것이다. 당신은 2개의 직선을 나타내는 4개의 점을 입력받아 두 직선의 교점을 구할 수 있음.

▣ 2개의 연립방정식을 이용한 풀이

  ax + by = e

  cx + dy = f

이것의 유일한 해, x, y는 ?

 

이를 코드화 하면..

 

 

 

위 4개의 점에 대해서. 

L1 은 (x1,y1) (x2,y2) , L2 는 (x3,y3) (x4, y4) 라고 한다면.

두 직선의 교점인 x, y라고 정의함.

 

Ax + By = E    (L1)

Cx + Dy = F    (L2)

 

L1 직선은 

A = y2 - y1;
B = x1 - x2;
E = (A * x1) + (B * y1);

 

L2 직선은

C = y4 - y3;

D = x3 - x4;

F = (C * x3) + (D * y3);

 

DE = (A * D) - (B * C);    // Deteminant

 

if (DE==0)  // 두선은 평행, 교차점 없음.

else // 두선은 교차함.

X = ((E * D) - (B * F)) / DE

Y = ((A * F) - (E * C)) / DE

 


코드화

        double A, B  E;   // ax + by = e
        double C, D, F;   // cx + dy = f

        A = y2 - y1;
        B = x1 - x2;
        E = (y2 - y1)*x1 + (x1 - x2)*y1;

        C = y4 - y3;
        D = x3 - x4;
        F = (y4 - y3)*x3 + (x3 - x4)*y3;

        double DE = (A*D) - (B*C);

        if(DE==0) {
            System.out.println("Parallel");
        } else {
            double X = ((E * D) - (B * F)) / DE;
            double Y = ((A * F) - (E * C)) / DE ;
        }

 

 

 


[참조 URL]

 

https://ko.wikipedia.org/wiki/%ED%81%AC%EB%9D%BC%EB%A9%94%EB%A5%B4_%EA%B3%B5%EC%8B%9D

 

크라메르 공식 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 선형대수학에서, 크라메르 공식(Cramer公式, 영어: Cramer's rule) 또는 크래머 공식은 유일한 해를 가지며 변수와 방정식의 수가 같은 연립 일차 방정식의 해를 구하는 공식이다. 계수 행렬과 그 한 열을 상수항으로 대신하여 얻는 행렬들의 행렬식의 비를 통해 해를 나타낸다. 둘 또는 셋 이상의 방정식으로 이루어진 연립 일차 방정식의 경우, 크라메르 공식에 의한 알고리즘은 가우스 소거법에 의한 알고리즘보다 훨씬

ko.wikipedia.org

 

http://www.gisdeveloper.co.kr/?p=89

 

두 선의 교차점 구하기 – GIS Developer

이 글은 두 선분의 교차점을 구하는 알고리즘이 작업에 필요해서 작성해둔 글이다. 참고로, 예전에 두선분의 교차점을 구하는 것 자체가 쉬울 것으로 생각하고 흔히 생각하는 기울기, y 절편을 이용하여 접근하려고 하였다. 이는 상당히 비효율적 방법이였고 조금 더 효율적인 방법으로 접근하였다. 먼저 직선의 방정식으로써, 기울기와 절편으로 나타내지 말고, t 매개변수를 이용해 나타내면 다음과 같다. P1과 P2는 직선의 시작점과 끝점을 나타내며, t의 범위는 0에

www.gisdeveloper.co.kr

https://www.etlcpp.com/blog/2017/11/07/finding-the-crossing-points-of-two-lines/

불러오는 중입니다...