已知三點求圓心與半徑

2021-06-25 21:01:53 字數 1397 閱讀 3214

已知三點求圓心與半徑

[email protected]

在計算機影象圖形學中,經常會用到求圓心或圓半徑的情況,本文介紹一種已知三個點求圓心和圓半徑的方法(當然三個點不能共線,共線的三個點不能構成圓)。

原理:相互連線三個點,選取其中的任意兩條直線,通過對這兩條直線的中心做垂線,兩條垂線的交點就是圓心,以此點為圓心,以此點到任意一點的距離為半徑畫圓。

三個點分別計為pt1, pt2, pt3:取直線p1p2和p1p3(也可以取其他直線),直線的中點則分別為:

cvpoint midpt1, midpt2;

midpt1.x = (pt2.x + pt1.x)/2;

midpt1.y = (pt2.y + pt1.y)/2;

midpt2.x = ( pt3.x + pt1.x)/2;

midpt2.y = ( pt3.y + pt1.y)/2;

由於p1p2和p1p3的垂線與其自身的斜率的乘積為-1,則其垂線的斜率分別為:

float k1 = -(pt2.x - pt1.x)/(pt2.y - pt1.y);

float k2 = -(pt3.x - pt1.x)/(pt3.y - pt1.y);

那麼對應的垂線的直線可以表示為:

y - midpt1.y = k1( x - midpt1.x);

y = midpt2.y = k2( x - midpt2.x);

對上面兩條直線表示式進行聯解,則可以分別求出其交點x, y的值,其中:

center.x = (midpt2.y - midpt1.y- k2* midpt2.x + k1*midpt1.x)/(k1 - k2);

center.y = midpt1.y + k1*( midpt2.y - midpt1.y - k2*midpt2.x + k2*midpt1.x)/(k1-k2);

x、y就是圓的圓心。圓心與任意乙個頂點的距離即為圓的半徑,表達為:

float radius = sqrtf((center.x - pt1.x)*(center.x - pt1.x) + (center.y - pt1.y)*(center.y - pt1.y));
完整的**如下:

typedef struct 

circledata;

circledata findcircle( cvpoint pt1, cvpoint pt2, cvpoint pt3)

測試效果如圖所示:

已知三點座標,求外接圓圓心座標與半徑。

已知三點座標,求外接圓圓心座標與半徑。a y2 y1 y3 y3 y1 y1 x3 x3 x1 x1 y3 y1 y2 y2 y1 y1 x2 x2 x1 x1 2.0 x3 x1 y2 y1 x2 x1 y3 y1 b x2 x1 x3 x3 x1 x1 y3 y3 y1 y1 x3 x1 x2 ...

已知兩點座標和半徑,求圓心

已知圓上的兩點座標和半徑,求圓心。數學分析 這個題目,涉及到簡單的數學問題,但是計算比較繁瑣。假設已知圓上的兩點座標分別為n x1,y1 和m x2,y2 半徑為r,圓心座標為o a,b 根據數學知識可得到 x1 a 2 y1 b 2 r 2 1 式 x2 a 2 y2 b 2 r 2 2 式 分別...

C 已知兩點及半徑,求圓心座標

已知a點和b點及半徑,其中b點為所在圓的切點,求該圓心座標 float radius 半徑 float angleo 圓心角 vector3 m yuanxin 圓心座標 計算圓心座標 a點 第一點 b點 第二點,即切點 半徑 void calculateo listve else if ve 0 ...