直线的中点Bresenham算法的实现
2016-03-29 19:49
477 查看
一、实验目的
1.掌握在MFC中搭建图形绘制的基本框架的方法;
2.将直线的中点Bresenham算法转化成可执行代码。
二、实验内容
1. 通过分析具体数据在中点Bresenham算法上的执行过程,绘制算法执行流程图或N-S图,在MFC中实现该算法,要求编写函数实现任意给定两点绘制线段。
三、实验步骤
任意给定的两点所绘制的线段斜率k可能有四种情况,分别是:0<k<1,k>=1,-1<k<0,
k<=-1。下面对这四种情况分别进行分析。
(一) 当0<k<1时
1.算法原理的推导
(1)构造中点误差项为:
(2)中点误差的初始值是:
(3)推导di+1
2.算法执行的N-S图
3.算法执行的主要代码
4.执行结果
(二) 当k>=1时
1.算法原理的推导
(1)构造中点误差项为:
(2)中点误差的初始值是:
(3)推导di+1
2.算法执行的N-S图
3.算法执行的主要代码
4.执行结果
(三) 当-1<k<0时
1.算法原理的推导
(1)构造中点误差项为:
(2)中点误差的初始值是:
(3)推导di+1
2.算法执行的N-S图
3.算法执行的主要代码
4.执行结果
(四) 当k<=-1时
1.算法原理的推导
(1)构造中点误差项为:
(2)中点误差的初始值是:
(3)推导di+1
2.算法执行的N-S图
3.算法执行的主要代码
4.执行结果
四、实验结果与讨论
根据任意给定的两点所绘制的线段斜率k可能有的四种情况,实验结果如下:
(一) 当0<k<1时:
(二) 当k>=1时:
(三) 当-1<k<0时:
(四) 当k<=-1时:
五、总结
(一)本次实验按时按量完成。
(二)通过本次实验,我掌握了在MFC中搭建图形绘制的基本框架的方法;掌握了如何将直线的中点Bresenham算法转化成可执行代码。
(三)在本次实验中,我通过分析具体数据在中点Bresenham算法上的执行过程,分四种情况绘制算法执行N-S图,并且在MFC中实现了该算法。
参见源码:https://github.com/shenxiaolinZERO/Resources/tree/master/Resources/Computer-Graphics/Bresenham
1.掌握在MFC中搭建图形绘制的基本框架的方法;
2.将直线的中点Bresenham算法转化成可执行代码。
二、实验内容
1. 通过分析具体数据在中点Bresenham算法上的执行过程,绘制算法执行流程图或N-S图,在MFC中实现该算法,要求编写函数实现任意给定两点绘制线段。
三、实验步骤
任意给定的两点所绘制的线段斜率k可能有四种情况,分别是:0<k<1,k>=1,-1<k<0,
k<=-1。下面对这四种情况分别进行分析。
(一) 当0<k<1时
1.算法原理的推导
(1)构造中点误差项为:
(2)中点误差的初始值是:
(3)推导di+1
2.算法执行的N-S图
3.算法执行的主要代码
void CExp2View::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default p1=point; CDC *pDC=this->GetDC(); COLORREF c; DrawLine(pDC,p0,p1,c); CView::OnLButtonUp(nFlags, point); } void CExp2View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default p0=point; CView::OnLButtonDown(nFlags, point); } void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c) { ///* //1.fabs(k)>0&&fabs(k)<1 double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=0.5-k; if(fabs(k)>1) return; int x,y; for(x=p0.x,y=p0.y;x<=p1.x;x++){ if(d>=0){ pDC->SetPixel(x,y,0xff0000); d+=-k; } else{ y++; pDC->SetPixel(x,y,0xff0000); d+=1-k; } } //*/ }
4.执行结果
1.算法原理的推导
(1)构造中点误差项为:
(2)中点误差的初始值是:
(3)推导di+1
2.算法执行的N-S图
3.算法执行的主要代码
void CExp2View::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default p1=point; CDC *pDC=this->GetDC(); COLORREF c; DrawLine(pDC,p0,p1,c); CView::OnLButtonUp(nFlags, point); } void CExp2View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default p0=point; CView::OnLButtonDown(nFlags, point); } void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c) { ///* //2.fabs(k)>=1 double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=1-0.5*k; if(fabs(k)>0&&fabs(k)<1) return; int x,y; for(x=p0.x,y=p0.y;x<=p1.x;y++){ if(d>=0){ x++; pDC->SetPixel(x,y,0x00ff00); d+=1-k; } else{ pDC->SetPixel(x,y,0x00ff00); d+=1; } } }
4.执行结果
(三) 当-1<k<0时
1.算法原理的推导
(1)构造中点误差项为:
(2)中点误差的初始值是:
(3)推导di+1
2.算法执行的N-S图
3.算法执行的主要代码
void CExp2View::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default p1=point; CDC *pDC=this->GetDC(); COLORREF c; DrawLine(pDC,p0,p1,c); CView::OnLButtonUp(nFlags, point); } void CExp2View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default p0=point; CView::OnLButtonDown(nFlags, point); } void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c) { ///* /* //3.fabs(k)>-1&&fabs(k)<0 double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=-0.5-k; //if(fabs(k)>1||fabs(k)<-1||(fabs(k)>0&&fabs(k)<1)) return; int x,y; for(x=p0.x,y=p0.y;x<=p1.x;x++){ if(d>=0){ y=y-1; pDC->SetPixel(x,y,0x0000ff); d+=-1-k; } else{ pDC->SetPixel(x,y,0x0000ff); d+=-k; } } */}
4.执行结果
1.算法原理的推导
(1)构造中点误差项为:
(2)中点误差的初始值是:
(3)推导di+1
2.算法执行的N-S图
3.算法执行的主要代码
void CExp2View::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default p1=point; CDC *pDC=this->GetDC(); COLORREF c; DrawLine(pDC,p0,p1,c); CView::OnLButtonUp(nFlags, point); } void CExp2View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default p0=point; CView::OnLButtonDown(nFlags, point); } void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c) { ///* //1.fabs(k)>0&&fabs(k)<1 double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=0.5-k; if(fabs(k)>1) return; int x,y; for(x=p0.x,y=p0.y;x<=p1.x;x++){ if(d>=0){ pDC->SetPixel(x,y,0xff0000); d+=-k; } else{ y++; pDC->SetPixel(x,y,0xff0000); d+=1-k; } } //*/ }
4.执行结果
根据任意给定的两点所绘制的线段斜率k可能有的四种情况,实验结果如下:
(一) 当0<k<1时:
(一)本次实验按时按量完成。
(二)通过本次实验,我掌握了在MFC中搭建图形绘制的基本框架的方法;掌握了如何将直线的中点Bresenham算法转化成可执行代码。
(三)在本次实验中,我通过分析具体数据在中点Bresenham算法上的执行过程,分四种情况绘制算法执行N-S图,并且在MFC中实现了该算法。
参见源码:https://github.com/shenxiaolinZERO/Resources/tree/master/Resources/Computer-Graphics/Bresenham
相关文章推荐
- linux高级编程基础系列:线程间通信
- App工程结构搭建:几种常见Android代码架构分析
- 开源搜索引擎abelkhan
- 对于多编程的两种方法
- 大话设计模式—适配器模式
- Java中java.util.Date与java.sql.Date等之间的转换
- 代码注释
- 第5周项目1:三角形类雏形(3)
- hdoj 2407 Knots
- 把一个无符号整数对应的十六进制的前八位和末八位交换,中间的十六位也同理互换
- Spring-理解AOP
- leetcode——189——Rotate Array
- 【Algorithm】插入排序法
- N
- Trick(十六)—— 随机数的生成
- uestc1135邱老师看电影【概率dp】
- 多线程同步的开发
- java面试狂魔之hibernate悲观锁和乐观锁
- 自学
- CUDA编程-(3)图形流水线时代