cubelover의 블로그

점 P에서 중심이 O이고 반지름이 r인 원에 접선을 그었을 때, 그 접점을 Q라 하자. OP의 방향을 u, POQ의 크기를 v라 하면 OQ의 방향은 u+v 또는 u-v가 됨을 알 수 있다.



OP의 방향은 atan2 함수로 구할 수 있고, POQ의 크기는 OP의 길이와 OQ의 길이를 알고 있으므로 acos으로 구할 수 있다.


def angle(P, O, r):
    OP = ( (P.x - O.x) ** 2 + (P.y - O.y) ** 2 ) ** 0.5
    u = atan2 ( P.x - O.x, P.y - O.y )
    v = acos ( r / OP )
    return ( u + v , u - v )

'기하' 카테고리의 다른 글

점과 선분 사이의 거리  (0) 2016.01.02
점과 직선 사이의 거리  (0) 2016.01.02

0 이상 1 이하의 실수 t에 대하여 선분 AB를 t:(1-t)로 내분하는 점을 Q라고 하자. 선분 PQ의 길이를 f(t)라고 할 때, 함수 f는 아래로 볼록함을 알 수 있다. (즉, f''(t) >= 0)



함수 f의 최솟값이 점 P와 선분 AB 사이의 거리가 되고, 이는 이분탐색을 통해 구할 수 있다.


def dist(P, A, B):
    for i in range(100):
        if (P.x - A.x) ** 2 + (P.y - A.y) ** 2 > (P.x - B.x) ** 2 + (P.y - B.y) ** 2:
            A = (A + B) / 2
        else:
            B = (A + B) / 2
    dist = ( (P.x - A.x) ** 2 + (P.y - A.y) ** 2 ) ** 0.5
    return ( dist )


점과 직선 사이의 거리를 응용하면 이분탐색을 하지 않고 거리를 구할 수 있다.

'기하' 카테고리의 다른 글

점에서 원에 그은 접선  (0) 2016.01.02
점과 직선 사이의 거리  (0) 2016.01.02

점 P에서 직선 AB에 내린 수선의 발을 H라 하자. 선분 PH의 길이가 점 P와 직선 AB사이의 거리가 된다.


또한, 삼각형 PAB의 넓이는 AB*PH/2 임을 알 수 있다.



삼각형 PAB의 넓이는 외적으로 구할 수 있고, 선분 AB의 길이는 두 점 사이의 거리로 구할 수 있으므로 선분 PH의 길이는 다음처럼 구할 수 있다.


def dist(P, A, B):
    area = abs ( (A.x - P.x) * (B.y - P.y) - (A.y - P.y) * (B.x - P.x) )
    AB = ( (A.x - B.x) ** 2 + (A.y - B.y) ** 2 ) ** 0.5
    return ( area / AB )

'기하' 카테고리의 다른 글

점에서 원에 그은 접선  (0) 2016.01.02
점과 선분 사이의 거리  (0) 2016.01.02