728x90

두 점 A와 B가 만드는 선분 AB가 있고, 한 점 P에서 이 선분까지 거리를 구하려고 할 때 단순히 AB를 통과하는 직선과 점 P의 거리를 구해서 쓰면 안 된다. 그림처럼 P가 P'의 위치에 있는 경우에 AB를 통과하는 직선과의 거리가 더 짧지만, 선분과의 거리는 P'와 A와 거리로 주어진다. 마찬가지로 P가 P"에 있을 때는 점 B와 거리가 최단거리다. 정리하면,
1. 선분 AP와 선분 AB로의 사이각이 90도를 넘는 경우는 A점과의 거리;
       cos (사이각) = ((P.x - A.x)*(B.x - A.x) + (P.y - A.y)*(B.y - A.y)) /(AP길이 * AB길이) < 0 ;
2. 선분 AP와 선분 AB로의 정사영의 길이가 선분 AB의 길이보다 클 때는 B점과의 거리
       정사영 길이 = (P.x - A.x)*(B.x - A.x) + (P.y - A.y)*(B.y - A.y) /(AB 길이) > (AB 길이) ;
3. 직선 AB와의 길이 = AP의 직선에 수선으로의 정사영 길이
       수선으로 정사영 = -(P.x - A.x)*(B.y - A.y) + (P.y - A.y)*(B.x - A.x) /(AB 길이) ;

struct CfPt {
    double x, y ;
    double DistanceTo(CfPt P) {
        return sqrt((P.x - x)*(P.x - x) + (P.y - y)*(P.y - y)) ;
    }
};
//선분과의 거리;
double SegmentDistance(CfPt A, CfPt B, CfPt P ) {
    double lineLen = A.DistanceTo(B) ;
    if (lineLen == 0) return A.DistanceTo(P) ;//A == B;
    // lineLen != 0 case
    double prj = ((P.x - A.x )*(B.x - A.x) + (P.y - A.y) * (B.y - A.y)) / lineLen;
    if (prj < 0) return A.DistanceTo(P) ;
    else if (prj > lineLen) return B.DistanceTo(P) ;
    else {
        //return normal_projection
        return fabs((-1)*(P.x - A.x)*(B.y - A.y) + (P.y - A.y)*(B.x - A.x)) / lineLen;
    }
};

'Computational Geometry' 카테고리의 다른 글

Finding the Convex Hull of Simple Polygon  (0) 2010.07.03
Polyline Simplication  (0) 2010.01.17
한 점에서 선분까지 거리  (1) 2010.01.16
삼각형 채우기  (0) 2009.12.19
Triangulation을 이용한 Imge Effect  (0) 2009.12.18
Ellipse Drawing Algorithm  (0) 2008.06.04
Posted by helloktk

댓글을 달아 주세요

  1. killofki 2015.07.20 01:31 신고  댓글주소  수정/삭제  댓글쓰기

    ㅠ,ㅠ,, 감사합니다.. - 내적 사용법을 잘 모르던 1人..