Bresenham直线算法.docx
- 文档编号:17995925
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:12
- 大小:16.57KB
Bresenham直线算法.docx
《Bresenham直线算法.docx》由会员分享,可在线阅读,更多相关《Bresenham直线算法.docx(12页珍藏版)》请在冰点文库上搜索。
Bresenham直线算法
#include
#include
#include
#include
#include
#include
usingnamespacestd;
usingnamespacecv;
structline_data{
floatline_k;//直线的斜率,当state为0,1时,将k设置为0,只看b。
floatline_b;//直线的与y轴的焦点
intline_state;//表示是否直线的状态竖线为0,横线为1,其他的线均为2
Point2ipoint_one;//直线的一个端点
Point2ipoint_two;//直线的另外一个端点
line_data(floatk,floatb,intstate,Point2ione,Point2itwo){
line_k=k;
line_b=b;
line_state=state;
point_one=one;
point_two=two;
}
};
vector
Matwimg=imread("F:
/白底.jpg");
voidon_mouse(intevent,intx,inty,intflages,void*ustc){
if(event==CV_EVENT_LBUTTONDOWN)
point.push_back(Point2i(x,y));
}
//Bresenham算法
voidBresenham(Point2ip1,Point2ip2){
intx1=p1.x,y1=p1.y,x2=p2.x,y2=p2.y;//用于记录当前的点的位置
floatdx=x2-x1,dy=y2-y1;
if(0 cout< if(x1>x2&&y1>y2){ inttemp_x=x1,temp_y=y1; x1=x2; y1=y2; x2=temp_x; y2=temp_y; } dx=x2-x1; dy=y2-y1; intnum=abs(x2-x1); vector intp=2*abs(dy)-abs(dx); for(inti=1;i if(p<0){ x1++; temppos.push_back(Point2i(x1,y1)); p=p+2*abs(dy); } else{ x1++; y1++; temppos.push_back(Point2i(x1,y1)); p=p+2*(abs(dy)-abs(dx)); } } for(intj=0;j circle(wimg,temppos[j],0.5,CV_RGB(0,0,0)); } if(dy/dx>1){ vector if(x1>x2&&y1>y2){ inttemp_x=x1,temp_y=y1; x1=x2; y1=y2; x2=temp_x; y2=temp_y; } dx=x2-x1; dy=y2-y1; intnum=abs(y2-y1); intp=2*dx-dy; for(inti=1;i if(p<0){ y1++; temppos.push_back(Point2i(x1,y1)); p=p+2*dx; } else{ x1++; y1++; temppos.push_back(Point2i(x1,y1)); p=p+2*(dx-dy); } } for(intj=0;j cout< for(intj=0;j circle(wimg,temppos[j],0.5,CV_RGB(0,0,0)); } if(-1<=dy/dx&&dy/dx<0){ if(x1>x2&&y1 inttemp_x=x1,temp_y=y1; x1=x2; y1=y2; x2=temp_x; y2=temp_y; } dx=x2-x1; dy=y2-y1; vector intnum=abs(x2-x1); intp=2*(-dy)-dx; for(inti=1;i if(p<0){ x1++; temppos.push_back(Point2i(x1,y1)); p=p+2*(-dy); } else{ x1++; y1--; temppos.push_back(Point2i(x1,y1)); p=p+2*((-dy)-dx); } } for(intj=0;j circle(wimg,temppos[j],0.5,CV_RGB(0,0,0)); } if(dy/dx<-1){ vector if(x1>x2&&y1 inttemp_x=x1,temp_y=y1; x1=x2; y1=y2; x2=temp_x; y2=temp_y; } dx=x2-x1; dy=y2-y1; intnum=y1-y2; intp=2*dx-(-dy); for(inti=1;i if(p<0){ y1--; temppos.push_back(Point2i(x1,y1)); p=p+2*dx; } else{ x1++; y1--; temppos.push_back(Point2i(x1,y1)); p=p+2*(dx-(-dy)); } } for(intj=0;j cout< for(intj=0;j circle(wimg,temppos[j],0.5,CV_RGB(0,0,0)); } if(p1.x==p2.x){ vector if(p1.y>p2.y){ inttemp=p1.y; p1.y=p2.y; p2.y=temp; } for(inti=1;i temppos.push_back(Point2i(p1.x,p1.y+i)); for(intj=0;j circle(wimg,temppos[j],0.5,CV_RGB(0,0,0)); } if(p1.y==p2.y){ vector if(p1.x>p2.x){ inttemp=p1.x; p1.x=p2.x; p2.x=temp; } for(inti=1;i temppos.push_back(Point2i(p1.x+i,p1.y)); for(intj=0;j circle(wimg,temppos[j],0.5,CV_RGB(0,0,0)); } } voidgety_minmax(int&max,int&min,constvector max=pos[0].y; min=pos[0].y; for(inti=0;i if(max max=pos[i].y; if(min>pos[i].y) min=pos[i].y; } } //求直线的方程 voidgetLinefc(vector for(inti=0;i if(i==pos.size()-1){ if(pos[i].x==pos[0].x) lines.push_back(line_data(0,pos[0].x,0,pos[i],pos[0])); elseif(pos[i].y==pos[0].y) lines.push_back(line_data(0,pos[0].y,1,pos[i],pos[0])); else lines.push_back(line_data((float)(pos[i].y-pos[0].y)/(pos[i].x-pos[0].x), (float)(pos[0].y*pos[i].x-pos[0].x*pos[i].y)/(pos[i].x-pos[0].x),2,pos[i],pos[0])); } else{ if(pos[i].x==pos[i+1].x) lines.push_back(line_data(0,pos[i].x,0,pos[i],pos[i+1])); elseif(pos[i].y==pos[i+1].y) lines.push_back(line_data(0,pos[i].y,1,pos[i],pos[i+1])); else lines.push_back(line_data((float)(pos[i].y-pos[i+1].y)/(pos[i].x-pos[i+1].x), (float)(pos[i+1].y*pos[i].x-pos[i+1].x*pos[i].y)/(pos[i].x-pos[i+1].x),2,pos[i],pos[i+1])); } } } //将输入的X进行排序 voidpaixv(vector for(inti=0;i for(intj=i+1;j if(x[i]>x[j]){ floattemp=x[i]; x[i]=x[j]; x[j]=temp; } } } intmain(){ inty_min,y_max;//求y的最大值和最小值 vector cvNamedWindow("IMG",CV_WINDOW_AUTOSIZE); setMouseCallback("IMG",on_mouse,0); cout<<"请使用鼠标左键进行坐标点的选取,点击ESC则开始画直线! "< while (1){ charch=waitKey(100); for(inti=0;i cout< circle(wimg,point[i],0.5,CV_RGB(0,0,0)); } imshow("IMG",wimg); waitKey(30); if(ch==27) break; } cout<<"开始画直线! "< //for(inti=0;i //circle(wimg,point[i],0.5,CV_RGB(0,0,0)); //for(intj=0;j<20;j++) //circle(wimg,Point2f(point[i].x+j,point[i].y+j),0.5,CV_RGB(0,0,0)); //} //imshow("IMG",wimg); //Bresenham(Point2i(305,251),Point2i(304,317)); //Bresenham(Point2i(243,117),Point2i(173,115)); //Bresenham(Point2i(173,115),Point2i(195,81)); for(inti=0;i if(i==point.size()-1) Bresenham(point[i],point[0]); else Bresenham(point[i],point[i+1]); } //cvSmooth(&(IplImage)wimg,&(IplImage)wimg); imshow("IMG",wimg); cvSaveImage("F: \\作业题\\Bresenham直线段扫描转换\\图片\\直线.jpg",&(IplImage)wimg); waitKey(3000); //获取y的最大最小值 gety_minmax(y_max,y_min,point); getLinefc(point,lines); //开始填充 for(inti=y_min+1;i vector for(intj=0;j if((i>=lines[j].point_one.y&&i<=lines[j].point_two.y)||(i<=lines[j].point_one.y&&i>=lines[j].point_two.y)){ if(lines[j].line_state==0) X.push_back(lines[j].line_b); elseif(lines[j].line_state==1){ X.push_back(lines[j].point_one.x); X.push_back(lines[j].point_two.x); } else X.push_back((float)(i-lines[j].line_b)/lines[j].line_k); } } paixv(X); if(X.size()%2==0){ for(intk=0;k<(X.size()/2);k++){ for(intl=(int)X[2*k]+1;l<(int)X[2*k+1];l++) circle(wimg,Point2i(l,i),0.5,CV_RGB(255,0,0)); } } else{ vector for(inti=0;i if((X[i+1]-X[i]>1)) X2.push_back(X[i]); X2.push_back(X[X.size()-1]); for(intk=0;k<(X2.size()/2);k++){ for(intl=(int)X2[2*k]+1;l<(int)X2[2*k+1];l++) circle(wimg,Point2i(l,i),0.5,CV_RGB(255,0,0)); } X2.clear(); } X.clear(); } imshow("IMG",wimg); cvSaveImage("F: \\作业题\\Bresenham直线段扫描转换\\图片\\填充.jpg",&(IplImage)wimg); waitKey(0); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Bresenham 直线 算法