直线扫描转换

(6页)

'直线扫描转换'
1 实验目的 1)掌握直线段的中点Bresenham扫描转换算法; 2)掌握直线绘制类的设计实现; 3)掌握菱形图案的生成方法。2 实验要求 1)直线绘制通过设计类似MFC的直线绘制类来实现,有类似的MoveTo()函数设置直线段起点,LineTo()函数设置直线段终点并完成绘制,还要有直线段颜色设置函数; 2)直线的绘制采用中点Bresenham扫描转换算法实现,根据直线斜率k的范围区分五种不同的情况处理; 3)调用设计实现的直线绘制类,在视图区绘制菱形线框,并要求各边颜色不同。3 详细设计 3.1 核心算法及类型设计使用中点Bresenham扫描算法完成绘制:CP2::CP2(){ x=0.0; y=0.0;}CP2::~CP2(){}CP2::CP2(double x,double y){ this->x=x; this->y=y;}CLine::CLine() //构造函数{}CLine::~CLine() //析构函数{}void CLine::SetLineColor(COLORREF color){ clr=color;}void CLine::MoveTo(CP2 p0){ P0=p0;}void CLine::MoveTo(double x,double y){ P0.x=x; P0.y=y;}void CLine::LineTo(double x,double y,CDC*pDC){ CP2 p; p.x=x; p.y=y; LineTo(p,pDC);}void CLine::LineTo(CP2 p1,CDC*pDC){ P1=p1; CP2 p, t; if(fabs(P0.x-P1.x)<1e-6)//绘制垂线 { if(P0.y>P1.y) { t=P0; P0=P1; P1=t; } for(p=P0;p.y<P1.y;p.y++) { pDC->SetPixelV (Round(p.x),Round(p.y),clr); } } else { double k,d; k=(P1.y-P0.y)/(P1.x-P0.x); if(k>1.0) { if(P0.y>P1.y) { t=P0; P0=P1; P1=t; } d=1-0.5*k; for(p=P0;p.y<P1.y;p.y++) { pDC->SetPixelV(Round(p.x),Round(p.y),clr); if(d>=0) { p.x++; d+=1-k; } else d+=1; } } if(0.0<=k && k<=1.0)//绘制0<=k<=1 { if(P0.x>P1.x) { t=P0; P0=P1; P1=t; } d=0.5-k; for(p=P0; p.x<P1.x;p.x++) { pDC->SetPixelV(Round(p.x),Round(p.y),clr); if(d<0) { p.y++; d+=1-k; } else d-=k; } } if(k>=-1.0&&k<0.0)//绘制-1<=k<0 { if(P0.x>P1.x) { t=P0; P0=P1;P1=t; } d=-0.5-k; for(p=P0; p.x<P1.x;p.x++) { pDC->SetPixelV(Round(p.x),Round(p.y),clr); if(d>0) { p.y--; d-=1+k; } else d-=k; } } if(k<-1.0)//绘制k<-1 { if(P0.y<P1.y) { t=P0;P0=P1;P1=t; } d=-1-0.5*k; for(p=P0;p.y>P1.y;p.y--) { pDC->SetPixelV(Round(p.x),Round(p.y),clr); if(d<0) { p.x++; d-=1+k; } else d-=1; } } } P0=p1;}调用直线类绘制菱形线框图:void CLineView::OnDraw(CDC* pDC){ CLineDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //设置坐标系 CRect rect; GetClientRect(&rect); pDC->SetMapMode(MM_ANISOTROPIC); pDC->SetWindowExt(rect.Width(),rect.Height()); pDC->SetViewportExt(rect.Width(),-rect.Height()); pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2); rect.OffsetRect(-rect.Width()/2,-rect.Height()/2); CLine*line= new CLine; //绘制坐标轴 line->SetLineColor(RGB(0,0,0));//黑色 line->MoveTo(CP2(-rect.Width()/2,0));//x轴 line->LineTo(CP2(rect.Width()/2,0),pDC); line->MoveTo(CP2(0,-rect.Height()/2));//y轴 line->LineTo(CP2(0,rect.Height()/2),pDC); //绘制直线 int a=200; CP2 A (0,a); CP2 B (a,0); CP2 C (0,-a); CP2 D (-a,0); //绘制AB边 line->SetLineColor(RGB(255,0,0))
关 键 词:
直线 扫描 转换
 天天文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:直线扫描转换
链接地址: https://www.wenku365.com/p-43459202.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服点击这里,给天天文库发消息,QQ:1290478887 - 联系我们

本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有【成交的100%(原创)】。本站是网络服务平台方,若您的权利被侵害,侵权客服QQ:1290478887 欢迎举报。

1290478887@qq.com 2017-2027 https://www.wenku365.com 网站版权所有

粤ICP备19057495号 

收起
展开