直线的中点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)>) return; int x,y; for(x=p0.x,y=p0.y;x<=p1.x;x++){ if(d>=){ pDC->SetPixel(x,y,0xff0000); d+=-k; } else{ y++; pDC->SetPixel(x,y,0xff0000); d+=-k; } } //*/ }
4.执行结果
![]() |
(二) 当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) { ///* //2.fabs(k)>=1 double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=-0.5*k; if(fabs(k)>&&fabs(k)<) return; int x,y; for(x=p0.x,y=p0.y;x<=p1.x;y++){ if(d>=){ x++; pDC->SetPixel(x,y,0x00ff00); d+=-k; } else{ pDC->SetPixel(x,y,0x00ff00); d+=; } } }
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.执行结果
![]() |
(四) 当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)>) return; int x,y; for(x=p0.x,y=p0.y;x<=p1.x;x++){ if(d>=){ pDC->SetPixel(x,y,0xff0000); d+=-k; } else{ y++; pDC->SetPixel(x,y,0xff0000); d+=-k; } } //*/ }
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
直线的中点Bresenham算法的实现的更多相关文章
- Bresenham算法的实现思路
条件已知两个点的坐标p1(x0,y0),p2(x1,y1)要求画出这条直线 之后的e代表每次的误差积累,初始值为0,可以计算出斜率为k=dy/dx=(y0-y1)/(x0-x1) 1.x为阶跃步长(直 ...
- 《图形学》实验四:中点Bresenham算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h& ...
- Python使用DDA算法和中点Bresenham算法画直线
title: "Python使用DDA算法和中点Bresenham算法画直线" date: 2018-06-11T19:28:02+08:00 tags: ["图形学&q ...
- Bug2算法的实现(RobotBASIC环境中仿真)
移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...
- 利用canvas实现的中点Bresenham算法
Bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别,具体的实现过程大家可以去问度娘.我主要是利用canvas画布技术实现了这个 ...
- Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。
Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...
- 图像数据到网格数据-2——改进的SMC算法的实现
概要 本篇接上一篇继续介绍网格生成算法,同时不少内容继承自上篇.上篇介绍了经典的三维图像网格生成算法MarchingCubes,并且基于其思想和三角形表实现了对样例数据的网格构建.本篇继续探讨网格生成 ...
- 《图形学》实验七:中点Bresenham算法画椭圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画椭圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 50 ...
- 《图形学》实验六:中点Bresenham算法画圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 500 ...
随机推荐
- C# 模拟网站登陆
实现此功能首先需要借助一些抓包工具,对相应的网站登陆过程进行分析,此过程根据网站的不同,可能复杂,也可能很简单.常用的抓包工具FF下FireBug和IE下的HttpWatch.这两个工具很强大,以此工 ...
- 关于SpringCloud微服务架构概念的一点理解
目前微服务是非常火的架构或者说概念,也是在构建大型互联网项目时采用的架构方式. 1.单体架构单体架构,是指将开发好的项目打成war包,然后发布到tomcat等容器中的应用. 假设你正准备开发一款与Ub ...
- Objective-C:MRC手动释放对象内存举例(引用计数器)
手机内存下的类的设计练习: 设计Book类, 1.三个成员变量: title(书名)author(作者).price(价格) 2.不使用@property,自己完成存取方法(set方法,get方 ...
- vue项目ide(vue项目环境搭建)
一.先介绍一下我接下来要做的项目 项目:ide可视化工具 技术应用: Vue2.0(js框架):https://cn.vuejs.org/ ElementUi(饿了吗ui框架基于vue的):http: ...
- Best Time to Buy and Sell Stock leetcode java
题目: Say you have an array for which the ith element is the price of a given stock on day i. If you w ...
- scala里的模式匹配和Case Class
模式匹配的简介 scala语言里的模式匹配可以看作是java语言中switch语句的改进. 模式匹配的类型 包括:常量模式.变量模式.构造器模式.序列模式.元组模式以及变量绑定模式等. 常量模式匹配 ...
- Linq-分页查询
var list = from s in db.t_address select s; & userid != null) { list = list.Where(v => v.user ...
- PHP 解决版本问题:"Assigning the return value of new by reference is deprecated"
问题描述: 在最近使用ECSHOP v273帮客户建立了一个商城系统,商城搭建一切ok但在使用中后台发现了一个500错误 在服务器上访问该地址发现了错误信息:"Assigni ...
- C++数据结构面试题
原文:http://1527zhaobin.iteye.com/blog/1537110 一.判断链表是否存在环型链表问题: 说明:判断一个链表是否存在环,例如下面这个链表就存在环,n1--> ...
- 【nodejs】使用put方式向后端提交数据
页面代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Ty ...