3점을 지나는 원을 구한다

3점을 지나는 원의 중심과 반경을 구한다



점 $A(x_1,y_1)$, 점 $B(x_2,y_2)$, 점 $C(x_3,y_3)$ 를 통과하는 원의 중심 $P$ 와 반경 $r$ 를 구한다.


구하는 방법



3점을 통과하는 원의 중심은, 그 3점을 정점으로 하는 삼각형의 외심이 된다.
(구하는 원은 그 3점을 정점으로 하는 삼각형의 외접원)
삼각형의 각 변의 수직 이등분선의 교점이 그 삼각형의 외심이 된다.
외심은 3개의 정점으로부터 등거리에 있다.
그 외심으로부터 각 점의 정점의 거리가 원의 반경이 된다.


외심을 구하는 방법


  • 점 $A$ 와 점 $B$ 의 중점 $D$ 를 구한다
  • 포인트 $A$ 와 포인트 $B$ 를 통과하는 직선에 수직인 포인트 $D$ 를 통과하는 직선 $L_1$ 를 구한다
  • 점 $A$ 와 점 $C$ 의 중점 $E$ 를 구한다
  • 포인트 $A$ 와 포인트 $C$ 를 통과하는 직선에 수직인 포인트 $E$ 를 통과하는 직선 $L_2$ 를 구한다
  • 직선 $L_1$ 과 직선 $L_2$ 의 교점을 구한다



  • 요구하다



    점 $A$ 와 점 $B$ 의 중점 $D$ 는
    $$D=\left(\frac{x_1+x_2}{2},\frac{y_1+y_2}{2}\right)$$
    점 $A$ 와 점 $B$ 를 통과하는 직선 방정식은 ( 직선 방정식 참조)
    $$(y_2-y_1)x+(x_1-x_2)y+(x_2y_1-x_1y_2)=0$$
    이 직선의 법선 벡터는 $\{(y_2-y_1),(x_1-x_2)\}$이므로,
    점 $A$ 와 점 $B$ 를 통과하는 직선에 수직인 직선의 기울기는 $\dfrac{x_1-x_2}{y_2-y_1}$
    따라서, 직선 $L_1$ 의 방정식은, 1점과 기울기가 주어졌다 직선 방정식 의 공식에 의해,
    $$y-\frac{y_1+y_2}{2}=\frac{x_1-x_2}{y_2-y_1}\left(x-\frac{x_1+x_2}{2}\right)$$
    오른쪽을 확장하고,
    $$y-\frac{y_1+y_2}{2}=\frac{x(x_1-x_2)}{y_2-y_1}-\frac{(x_1+x_2)(x_1-x_2)}{2(y_2- y_1)}$$
    $$y-\frac{y_1+y_2}{2}=\frac{2x(x_1-x_2)-(x_1+x_2)(x_1-x_2)}{2(y_2-y_1)}$$
    양쪽에 $2(y_2-y_1)$ 를 곱하고,
    $$2y(y_2-y_1)-(y_1+y_2)(y_2-y_1)=2x(x_1-x_2)-(x_1+x_2)(x_1-x_2)$$
    한쪽에 모여서
    $$2x(x_1-x_2)+2y(y_1+y_2)+\{(x_2+x_1)(x_2-x_1)+(y_2+y_1)(y_2-y_1)\}=0$$
    따라서,
    $$L_1 : (x_1-x_2)x+(y_1-y_2)y+\frac{x_2^2-x_1^2+y_2^2-y_1^2}{2}=0\\cdots\①$$
    같은 요령으로, 점 $A$ 와 점 $C$ 를 통과하는 직선에 수직인 중간점 $E$ 를 통과하는 직선 $L_2$ 를 구하면,
    $$L_2 : (x_1-x_3)x+(y_1-y_3)y+\frac{x_3^2-x_1^2+y_3^2-y_1^2}{2}=0\\cdots\②$$
    2직선의 교점을 구한다 공식을 사용하여 $L_1$ 과 $L_2$ 의 교차점을 구한다.
    교차점을 $P$ 로 하고, 그 좌표를 $(x_p,y_p)$ 로 하면,
    $$x_p=\frac{(y_1-y_2)(x_3^2-x_1^2+y_3^2-y_1^2)-(y_1-y_3)(x_2^2-x_1^2+y_2^2-y_1^ 2)}{2(x_1-x_2)(y_1-y_3)-2(x_1-x_3)(y_1-y_2)}$$
    $$y_p=\frac{(x_1-x_3)(x_2^2-x_1^2+y_2^2-y_1^2)-(x_1-x_2)(x_3^2-x_1^2+y_3^2-y_1^ 2)}{2(x_1-x_2)(y_1-y_3)-2(x_1-x_3)(y_1-y_2)}$$
    된다.

    또한, 반경 $r$ 는, 점 $A$ 로부터 점 $P$ 까지의 거리를, 2 점간의 거리의 공식을 사용해 구하면,
    $$ r =\sqrt{(x_p - x_1)^2 + (y_p - y_1)^2}$$
    된다.

    3점을 지시하여 원을 만드는 프로그램


    ;; 3点を指示して円を作成
    (defun c:ThreePointCircle (/ p1 p2 p3 c)
        (setq p1 (getpoint "\n1点目を指示")
              p2 (getpoint "\n2点目を指示")
              p3 (getpoint "\n3点目を指示")
              c (circle:3Points p1 p2 p3)
        )
        (entmake:Circle (car c) (cadr c))
        (princ)
    ) 
    
    ;; == sub functions ==
    ;; 3点を通る円の中心と半径を求める
    (defun circle:3Points (p1 p2 p3
        / x1 x2 x3 y1 y2 y3 x1-x2 x1-x3y1-y2 y1-y3 a b c c1 c2 xp yp)
        (setq x1 (car  p1)
              y1 (cadr p1)
              x2 (car  p2)
              y2 (cadr p2)
              x3 (car  p3)
              y3 (cadr p3)
        )
    
        (setq x1-x2 (- x1 x2)
              x1-x3 (- x1 x3)
              y1-y2 (- y1 y2)
              y1-y3 (- y1 y3)
              c1 (- (+ (- (* x2 x2)(* x1 x1))(* y2 y2))(* y1 y1))
              c2 (- (+ (- (* x3 x3)(* x1 x1))(* y3 y3))(* y1 y1))
              a (- (* 2 x1-x2 y1-y3)(* 2 x1-x3 y1-y2))
              b (- (* y1-y2 c2) (* y1-y3 c1))
              c (- (* x1-x3 c1) (* x1-x2 c2))
        )
        (setq xp (/ b a)
              yp (/ c a))
        (list (list xp yp) (sqrt (+ (* (- xp x1) (- xp x1))(* (- yp y1) (- yp y1)))))
    )
    ;; 中心と半径を指定して円を作成
    (defun entmake:CircleBase (c r) (list '(000 . "CIRCLE") (cons 10 c) (cons 40 r)))
    (defun entmake:Circle (c r) (entmake (entmake:CircleBase c r)) (entlast))
    

    3점을 지시하여 원을 작성하는 프로그램(AutoLISP 함수 사용)


    ;; 3点を指示して円を作成
    (defun c:ThreePointCircle2 (/ p1 p2 p3)
        (setq p1 (getpoint "\n1点目を指示")
              p2 (getpoint "\n2点目を指示")
              p3 (getpoint "\n3点目を指示")
        )
        (entmake:CircleFrom3Points p1 p2 p3)
        (princ)
    )
    
    ;; == sub functions ==
    ;; 円周上の3点から円の中心を求める(AutoLISP関数使用)
    (defun circle:GetCenterPointFrom3Points (p1 p2 p3 / ma mb va vb)
        (if (setq ma (mapcar '(lambda (a b) (/ (+ a b) 2.)) p1 p2)
                  va (mapcar '- p2 p1) 
                  mb (mapcar '(lambda (a b) (/ (+ a b) 2.)) p2 p3)
                  vb (mapcar '- p3 p2) 
            )
            (inters ma (mapcar '+ ma (list (- (cadr va)) (car va) 0))
                    mb (mapcar '+ mb (list (- (cadr vb)) (car vb) 0))
                    nil
            )
        )
    )
    ;; 中心と半径を指定して円を作成
    (defun entmake:CircleBase (c r) (list '(000 . "CIRCLE") (cons 10 c) (cons 40 r)))
    (defun entmake:Circle (c r) (entmake (entmake:CircleBase c r)) (entlast))
    ;; 3点を指定して円を作成
    (defun entmake:CircleFrom3Points (p1 p2 p3 / cp)
        (entmake:Circle
            (setq cp (circle:GetCenterPointFrom3Points p1 p2 p3))
            (distance cp p1)
        )
    )
    

    좋은 웹페이지 즐겨찾기