假設在opencv中有乙個正方形的m*m的影象,現在要在這個影象上面畫乙個半徑m的圓。現在假設只能打點的方法來畫,則中點畫圓法是乙個很好的方法。opencv中的影象就是乙個m行m列的矩陣,座標(0,0)代表第0行第0列的點。
1 圓的方程與圓的特性
取半徑r=m/2,要畫的圓心座標是(r,r),則圓的方程是(x1-r)2+(y1-r)2=r2。選取x=x1-r,y=r-y1,則在新座標系中有x2+y2=r2。新座標系圓心位於影象的中心(r,r)處。
如下圖,當某點(x,y)在圓上時(假定圓心座標為(0,0)),則(x,-y),(-x,y),(-x,-y),(y,x),(y,-x),(-y,x),(-y,-x)都將在這個圓周上。
2 中點畫圓法
如下圖所示,考慮圓的方程x2+y2=r2,構造判別式f(x,y)= x2+y2-r2,當某點在圓上時,f(x,y)=0;當某點在圓內時,f(x,y)<0;當某點在圓外時,f(x,y)>0。依據圓的八分法特性,只要畫出圓在第一象限中的上半部分。設某點p(xi,yi)在圓周上,要取的新點只會是p1(xi+1,yi)或者p2(xi+1,yi-1),p1和p2的中點為m(xi+1,yi-0.5),當f(xi +1, yi – 0.5)< 0時,m點在圓內,說明p1點離實際圓弧更近,應該取p1作為圓的下乙個點。同理分析,當f(xi + 1, yi – 0.5)> 0時,p2離實際圓弧更近,應取p2作為下乙個點。當f(xi + 1, yi – 0.5)= 0時,p1和p2都可以作為圓的下乙個點,演算法約定取p2作為下乙個點。
現在將m點座標(xi+ 1, yi–0.5)帶入判別函式f(x,y),得到判別式d:
d= f
(xi+1, yi–0.5)= (xi+1)2+(yi–0.5)2–r2
d』=f
(xi+2, yi–0.5)= (xi+2)2+(yi–0.5)2–r2
展開後將d帶入可得到判別式的遞推關係:
d』=d + 2xi+3
d』=f
(xi+2, yi–1.5)= (xi+ 2)2+(yi–1.5)2–r2
展開後將d帶入可得到判別式的遞推關係:
d』= d + 2(xi-yi)+5
特別的,在第乙個象限的第乙個點(0, r)時,可以推倒出判別式d的初始值d0:
3 貼出程式
#include
#include
using
namespace cv;
//此程式對於
opencv3
版需要額外包含標頭檔案:
#include
#define window_name1 "
【繪製圖1】
"//為視窗標題定義的巨集
#define window_name2 "
【繪製圖2】
"//為視窗標題定義的巨集
#define window_width 600//
定義視窗大小的巨集
void drawline( mat img, point start, point end );//
繪製線段
void mp_circle(mat img,intr);
int main( void )
void drawpoint(mat img,point pt)
void mp_circle(mat img,intr)
else
x++;
drawpoint(img,point(x+r , r-y));
drawpoint(img,point(x+r,r+y));
drawpoint(img,point(-x+r,r-y));
drawpoint(img,point(-x+r,r+y));
drawpoint(img,point(r-y,x+r));
drawpoint(img,point(r+y,x+r));
drawpoint(img,point(r-y,-x+r));
drawpoint(img,point(r+y,-x+r));}}
效果如圖:
mfc DDA演算法 中點畫線演算法函式
直線的端點座標 x0,y0 x1,y1 void cquhongjuanview draw line dda cdc pdc,int x0,int x1,int y0,int y1 double y y0 for int x x0 x x1 x double x x0 for int y y0 y ...
如何計算交點畫圓 滴定管如何正確使用
滴定分析又叫容量分析,是將一種已知準確濃度的標準溶液滴加到被測定物質的溶液中,直到被測定物質與所加標準溶液完全反應為止,然後根據標準溶液的所用體積和濃度計算出物質的含量。液體體積的精密測量,是滴定分析的重要操作,是獲得良好分析結果的重要因素,為此,必須了解如何正確使用容量分析儀器。根據長度和容積的不...
在Visual C 中使用openCV
新建c 工程後,在工程屬性的vc directories中的include directories裡新增c opencv build include。也可以在c 下的additional include directories裡新增。在library directories裡新增c opencv b...