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$ 는
$$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)
)
)
Reference
이 문제에 관하여(3점을 지나는 원을 구한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tydesign/items/2fd456f40f5aeeb461ff텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)