直线的中点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 ...
随机推荐
- Bash,Vim,gdb&git常用命令
Bash 目录 pwd //查看当前目录 mkdir dir1 dir2 //创建目录 tree dir1 mv test1.cpp test2.cpp dir1 dir //移动文件/目录到目 ...
- C++运算符重载(友元函数方式)
我们知道,C++中的运算符重载有两种形式:①重载为类的成员函数(见C++运算符重载(成员函数方式)),②重载为类的友元函数. 当重载友元函数时,将没有隐含的参数this指针.这样,对双目运算符,友元函 ...
- 【POJ】【3525】Most Distant Point from the Sea
二分+计算几何/半平面交 半平面交的学习戳这里:http://blog.csdn.net/accry/article/details/6070621 然而这题是要二分长度r……用每条直线的距离为r的平 ...
- Cesium随笔(3)随鼠标实时显示经纬度坐标以及高度【转】
在网页三维地球上进行可视化开发与经纬度坐标以及高度是分不开的,能够实时获取鼠标位置的经纬度对可视化效果有很好的帮助,Cesium当然能做到: (1)首先在里创建显示坐标的容器 样式自己调整的合适即可 ...
- Android中样式及主题
Android应用程序中不可避免的需要使用的样式和主题,样式指定一般指定View的高度.字体.字体颜色.背景,Android里的样荐定义在Style.xml文件里.主题也是一种样式,只不过它是应用在整 ...
- 彻底解决 intellij IDEA 卡顿 优化笔记
由于工作中经常出现分支各种切换,使用Eclipse便不再像以前那么舒服了,不停的修改工作空间,每次修改完工作空间又是一堆一堆的个性化设置,来回的切换,真的很累.我们做软件的,怎么能不去尝试新鲜的呢,毕 ...
- (回溯法)和为n的所有不增正整数和式分解算法
题目: 利用递归算法输出正整数和为n的所有不增的正整数和式.例如当n=5时,不增的和式如下: 5=5 5=4+1 5=3+2 5=3+1+1 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 ...
- QR分解与最小二乘
主要内容: 1.QR分解定义 2.QR分解求法 3.QR分解与最小二乘 4.Matlab实现 一.QR分解 R分解法是三种将矩阵分解的方式之一.这种方式,把矩阵分解成一个正交矩阵与一个上三角矩阵的 ...
- Python编程-Office操作-操作Excel(中)
例子文件如下: 一些复杂的读取操作getCells.py import openpyxl wb = openpyxl.load_workbook('example.xlsx') sheet = wb. ...
- C语言变量的声明位置
标准C里面必须放在代码前面,否则出错: C++里面不一定要放在最前面,用的时候声明也不迟: 所以要看具体的编译环境,如果是C的话必须放在最前,C++就不用:一般.c后缀的是C文件,按C来编译:.cpp ...






