점과 원의 중심을 통과하는 직선에 평행 한 원의 접선 방정식을 구합니다.

점과 원의 중심을 통과하는 직선에 평행 한 원의 접선 방정식을 구합니다.



점 $Q(x_1,y_1)$ 에서 중심이 $C(x_0,y_0)$ 반경이 $r$ 의 원 $(x-x_0)^2+(y-y_0)^2=r^2$ 의 중심 를 묶은 직선에 평행한 원의 접선 방정식을 구한다.


점 $Q(x_1,y_1)$ 과 원의 중심 $C(x_0,y_0)$ 를 연결한다 직선 방정식
$$(y_1-y_0)x+(x_0-x_1)y+(x_1y_0-x_0y_1)=0\\cdots\①$$

점 $Q$ 와 원의 중심 $C$ 를 묶는 직선 방정식
$$ax+by+c=0\\cdots\①$$
그러면 이 직선의 법선 벡터는 ①에 따라
$$\vec{n}=(a,b)$$

접선의 접점을 $A,B$ 라고 하면,
접점 $A$ 는 원의 중심 $(x_0,y_0)$ 로부터 직선의 법선 벡터 $\vec{n}$ 방향으로 거리 $r$ 의 점이 된다.
접점 $B$ 는 원의 중심 $(x_0,y_0)$ 로부터 직선의 법선 벡터 $\vec{n}$ 방향으로 거리 $-r$ 의 점이 된다.

$\vec{n}$ 의 단위 벡터를 $\vec{h}$ 로 지정하면,
$$\vec{h}=\vec{n}\cdot\frac{1}{\sqrt{a^2+b^2}}=(a,b)\cdot\frac{1}{\sqrt{ a^2+b^2}}=\left(\frac{a}{\sqrt{a^2+b^2}},\frac{b}{\sqrt{a^2+b^2}}\right)$$
가 접점 $A,B$ 의 좌표는,
$$A=(x_0,y_0)+\left(\frac{a}{\sqrt{a^2+b^2}}\cdot r,\frac{b}{\sqrt{a^2+b^ 2}}\cdot r\right)=\left(\frac{ar}{\sqrt{a^2+b^2}}+x_0,\frac{br}{\sqrt{a^2+b^2 }}+y_0\right)$$
$$B=(x_0,y_0)+\left(\frac{a}{\sqrt{a^2+b^2}}\cdot -r,\frac{b}{\sqrt{a^2+b ^2}}\cdot -r\right)=\left(-\frac{ar}{\sqrt{a^2+b^2}}+x_0,-\frac{br}{\sqrt{a^2 +b^2}}+y_0\right)$$
된다.

점 $(x_a,y_a)$ 대로, 직선 $ax+by+c=0$ 에 평행한 직선의 방정식 ( 평행한 직선과 수직인 직선 참조)은,
$$a(x-x_a)+b(y-y_a)=0$$
이 표현식을 확장하고 정리하면,
$$ax+by-(ax_a+by_a)=0$$
이 식의 점 $(x_a,y_a)$ 에 점 $A$ 의 좌표를 대입하면,
$$ax+by-\Biggl\{a\left(\frac{ar}{\sqrt{a^2+b^2}}+x_0\right)+b\left(\frac{br}{\sqrt {a^2+b^2}}+y_0\right)\Biggr\}=0$$
이 표현식을 확장하고 정리하면,
$$ax+by-(ax_0+by_0+r\sqrt{a^2+b^2})=0\\cdots\②$$
여기서, 점 $C,Q$ 의 좌표는 각각 $(x_0,y_0),(x_1,y_1)$ 이므로, 점 $C,Q$ 를 연결하는 직선 $ax+by+c=0$ 의 방정식은, 2점을 통과하는 직선 방정식의 공식에 따라 ( 직선 방정식 참조)
$$(y_1-y_0)x+(x_0-x_1)y+(x_1y_0-x_0y_1)=0$$
된다. 따라서 ①의 식의 계수 $a,b,c$ 는
$$a=y_1-y_0,\\\\b=x_0-x_1,\\\\c=x_1y_0-x_0y_1$$
그리고, 이 값을 ②의 식에 대입하면,
$$(y_1-y_0)x+(x_0-x_1)y-\Biggr\{(y_1-y_0)x_0+(x_0-x_1)y_0+r\sqrt{(y_1-y_0)^2+(x_0-x_1)^ 2}\Biggr\}=0$$
정리하면
$$(y_1-y_0)x+(x_0-x_1)y-(x_0y_1-x_1y_0+r\sqrt{(y_1-y_0)^2+(x_0-x_1)^2})=0$$
이것은 접점 $A$ 쪽의 접선 방정식입니다.
마찬가지로 접점 $B$ 측을 계산하면,
$$(y_1-y_0)x+(x_0-x_1)y-(x_0y_1-x_1y_0-r\sqrt{(y_1-y_0)^2+(x_0-x_1)^2})=0$$
된다.

【예】점(15,5)과 중심(3,2) 반경 5의 원의 중심을 연결한 직선에 평행한 원의 접선의 방정식을 구한다.





위 공식,
$$(y_1-y_0)x+(x_0-x_1)y-(x_0y_1-x_1y_0+r\sqrt{(y_1-y_0)^2+(x_0-x_1)^2})=0$$
$$(y_1-y_0)x+(x_0-x_1)y-(x_0y_1-x_1y_0-r\sqrt{(y_1-y_0)^2+(x_0-x_1)^2})=0$$
따라서 첫 번째 접선 방정식은
$$(5-2)x+(3-15)y-(3\cdot5-15\cdot2+5\sqrt{(5-2)^2+(3-15)^2})=0$$
그러므로
$$3x-12y+15-15\sqrt{17}=0$$
소수로 표현하면,
$$3x-12y-46.8466=0$$
두 번째 접선 방정식은
$$(5-2)x+(3-15)y-(3\cdot5-15\cdot2-5\sqrt{(5-2)^2+(3-15)^2})=0$$
그러므로
$$3x-12y+15+15\sqrt{17}=0$$
소수로 표현하면,
$$3x-12y+76.8466=0$$
된다.

샘플 프로그램



원형 모양을 선택하고 그 다음 점을 지시합니다. 그 점과 원의 중심을 통과하는 직선에 평행 한 원의 접선을 만듭니다.


;; 点と円の中心を通る直線に平行な円の接線の方程式を求める
(defun c:CreateTangentOfParallelPoint (/ circle point)
    ;; 円を選択
    (while (null circle)
        (setvar 'ERRNO 0)
        (setq circle (car (entsel "円を選択: ")))
        (cond
            ;; 空振り
            ((= 7 (getvar 'ERRNO))
             (princ "\n**空振り!!再選択**\n")
             (setq circle nil)
            )
            ;; 空Enter
            ((= 52 (getvar 'ERRNO))
             (princ "\n**空Enter!!再選択**\n")
             (setq circle nil)
            )
            ;; 図形が選択された
            (circle
             (if (/= "CIRCLE" (entity:GetType circle))
                 (progn
                     (princ "\n**円ではありません!!再選択**\n")
                     (setq circle nil)
                 )
                 (princ "\n**円が選択されました。**\n")
             )
            )
        )
    )
    ;; 点を選択
    (setq point (getpoint "点を指示: " ))

    ;; 接線を作成
    (mapcar
        (function
            (lambda (f)
                (entmake:XlineFromEquation (car f) (cadr f) (caddr f))
            )
        )
        (circle:GetEquationOfParallelPoint circle point)
    )
)

;; == sub functions ==
;; 図形のDXF定義データの値を取得
(defun entity:GetDxf (g e)
    (cond
        ((= (type e) 'ENAME) (cdr (assoc g (entget e))))
        ((listp e) (cdr (assoc g e))) 
    )
)
;; 図形のタイプを取得
(defun entity:GetType (e) (entity:GetDxf 0 e))
;; 円の中心を取得
(defun circle:GetCenterPoint (e) (entity:GetDxf 10 e))
;; 円の半径を取得
(defun circle:GetRadius (e) (entity:GetDxf 40 e))
;; 点と円の中心を通る直線に平行な円の接線の方程式を求める
(defun circle:GetEquationOfParallelPoint (circle point / a b c d r o x0 x1 y0 y1)
    (setq r (circle:GetRadius circle)
          o (circle:GetCenterPoint circle)
          x0 (car o) y0 (cadr o)
          x1 (car point) y1 (cadr point)
          a (- y1 y0) b (- x0 x1)
          c (- (* x0 y1) (* x1 y0))
          d (sqrt (+ (* a a) (* b b)))
    )
    (list
        (list a b (- (- c) (* r d)))
        (list a b (+ (- c) (* r d)))
    )
)

;; 構築線を定義
(defun entmake:XlineBase (p u)
    (list '(000 . "XLINE")
          '(100 . "AcDbEntity")
          '(100 . "AcDbXline")
          (cons 010 p)
          (cons 011 u)
    )
)

;; 基点と単位方向ベクトルから構築線を作成
(defun entmake:Xline (p u) (entmake (entmake:XlineBase p u)) (entlast))

;; 直線の方程式から構築線を作成
(defun entmake:XlineFromEquation (a b c)
    (entmake:Xline (list (- (/ c a)) 0. 0.) (list (- b) a 0.))
)

좋은 웹페이지 즐겨찾기