逆时针画圆弧,原理:将360度分割成36份,分别标出每10度角度时的坐标点,然后将每个点连接起来只
# include & lt; iostream> # include & lt; opencv2 \ \ core.hpp>核心; # include & lt; opencv2 \ opencv.hpp> # include & lt; opencv2 \ highgui \ highgui.hpp> # include & lt; opencv2 \ contrib \ contrib.hpp> # include & lt; fstream> # include & lt; windows.h> 使用名称空间的简历; 使用名称空间性病;//图像,圆心,开始点,结束点,线宽 空白DrawArc(曾经繁荣ArcCenter垫* src,点,点,点端点,int填) { 如果(填补& lt;=0)返回; vector点; 双Angle1=量化((曾经繁荣。y - ArcCenter.y),(曾经繁荣。x - ArcCenter.x)); 双Angle2=量化((端点。y - ArcCenter.y),(端点。x - ArcCenter.x)); 二倍角=Angle1 - Angle2; 角=角* 180.0/CV_PI; 如果(角& lt;0)角=360 +角; 如果(角==0)角=360; int边缘=地板(角/10);//向下取整 Dots.push_back(曾经繁荣); for (int i=0;我& lt;边缘;我+ +) { 双dSinRot=罪(- (10 * (i + 1) * CV_PI/180); 双dCosRot=cos (- (10 * (i + 1) * CV_PI/180); int x=ArcCenter。x + dCosRot *(曾经繁荣。x - ArcCenter.x) - dSinRot *(曾经繁荣。y - ArcCenter.y); int y=ArcCenter。y + dSinRot *(曾经繁荣。x - ArcCenter.x) + dCosRot *(曾经繁荣。y - ArcCenter.y); 点。push_back方法(点(x, y)); } Dots.push_back(端点); RNG, RNG=theRNG (); 标量颜色=标量(rng。制服(100,255),提高。制服(100,255),提高。制服(100,255)); for (int i=0;我& lt;Dots.size () - 1;我+ +){ 线([我]* src,点,点(i + 1),颜色,填充); } Dots.clear (); } int main () { 垫Img=垫::0 (800、800、CV_8UC3); int64蒂姆=getTickCount ();//坐标零400400点 点起点=点(400、400);//起始坐标150,-100 点曾经繁荣=点(起点。x + 150,起点。y - (-100));//结束坐标-150,-100 点端点=点(起点。x - 150,起点。y - (-100));//圆心相对起始点的坐标-150200 int I=曾经繁荣。x - 150; int J=曾经繁荣。y - (+ 200); 点?点(I, J);//显示圆心坐标 圆(Img弧5、标量(0,0,255),1);//显示起始点坐标 圆(Img,曾经繁荣5标量(255,0,0),1);//显示结束点坐标 圆(Img端点5、标量(0 255 0),1);//图像,圆心,开始点,结束点,线宽 DrawArc(和Img,弧,曾经繁荣,端点,2); imshow(“正多边形”,Img); 蒂姆=getTickCount()——蒂姆?; printf("处理耗时:% fms \ n \ n”, tim * 1000/getTickFrequency ()); waitKey (0); 返回0; }
效果如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。