三种画直线:

DDA:

void lineDDA (int x0, int y0, int xEnd, int yEnd){int dx=xEnd-x0,dy=yEnd-y0,steps,k;float xIncrement,yIncrement,x=x0,y=y0;if(fabs(dx)> fabs(dy)){steps = fabs(dx);}else {steps = fabs(dy);}xIncrement = float(dx)/float(steps);yIncrement = float(dy)/ float(steps);setPixel(round(x),round(y));for(k = 0;k< steps;k++){x += xIncrement;y += yIncrement;setPixel(round(x),round(y));}return ;
}

中点画线法:

这里就是只取当前点右上方或右方的像素点, 看下头的例子会更清楚一点

后头这部分就是对程序的优化了

void lineMiddle(int x0, int y0, int x1, int y1){int a,b,d1,d2,d,x,y;a=y0-y1,b=x1-x0,d=2*a+b;d1=2*a,d2=2*(a+b);x=x0,y=y0;setPixel (x,y);while (x<x1){if (d<0){x++;y++;d+=d2;}else{x++;d+=d1;}setPixel(x,y);}return ;
}

Bresenham画线法:

基本思想就这么简单, 后头都是对程序的优化

void lineBres(int x0,int y0,int xEnd,int yEnd){int dx=fabs(xEnd-x0),dy=fabs(yEnd-y0);int p=2*dy-dx;int twoDy=2*dy,twoDyMinusDx=2*(dy-dx);int x,y;if(x0>xEnd){x=xEnd;y=yEnd;xEnd=x0;}else{x=x0;y=y0;}setPixel(x,y);while(x<xEnd){x++;if(p<0)p+=twoDy;else{y++;p+=twoDyMinusDx;}setPixel(x,y);}
}

Bresenham 画圆:

class screenPt {private:GLint x, y;public:screenPt() { x = y = 0; }void setCoords(GLint xCoordValue, GLint yCoordValue) {x = xCoordValue;y = yCoordValue;}GLint getx() const { return x; }GLint gety() const { return y; }void incremetx() { x++; }void decrementy() { y--; }
};void circleMidp(GLint xc, GLint yc, GLint radius) {screenPt circPt;GLint p = 1 - radius;circPt.setCoords(0, radius);void circlePlotPoints(GLint, GLint, screenPt);circlePlotPoints(xc, yc, circPt);while (circPt.getx() < circPt.gety()) {circPt.incremetx();if (p < 0)p += 2 * circPt.getx() + 1;else {circPt.decrementy();p += 2 * (circPt.getx() - circPt.gety()) + 1;}circlePlotPoints(xc, yc, circPt);}
}
void circlePlotPoints(GLint xc, GLint yc, screenPt circPt) {setPixel(xc + circPt.getx(), yc + circPt.gety());setPixel(xc - circPt.getx(), yc + circPt.gety());setPixel(xc + circPt.getx(), yc - circPt.gety());setPixel(xc - circPt.getx(), yc - circPt.gety());setPixel(xc + circPt.gety(), yc + circPt.getx());setPixel(xc - circPt.gety(), yc + circPt.getx());setPixel(xc + circPt.gety(), yc - circPt.getx());setPixel(xc - circPt.gety(), yc - circPt.getx());
}

完整程序:

运行环境: Qt

main.cpp

#define NDEBUG
#ifndef GLUT_DISABLE_ATEXIT_HACK
#define GLUT_DISABLE_ATEXIT_HACK
#endif
#include <windows.h>
#include <gl/glut.h>
#include <cmath>inline int round (const float a){return int(a+0.5) ;
}void setPixel(int xCoord, int yCoord){glBegin (GL_POINTS);glVertex2i (xCoord, yCoord);glEnd();
}void lineDDA (int x0, int y0, int xEnd, int yEnd){int dx=xEnd-x0,dy=yEnd-y0,steps,k;float xIncrement,yIncrement,x=x0,y=y0;if(fabs(dx)> fabs(dy)){steps = fabs(dx);}else {steps = fabs(dy);}xIncrement = float(dx)/float(steps);yIncrement = float(dy)/ float(steps);setPixel(round(x),round(y));for(k = 0;k< steps;k++){x += xIncrement;y += yIncrement;setPixel(round(x),round(y));}return ;
}void lineMiddle(int x0, int y0, int x1, int y1){int a,b,d1,d2,d,x,y;a=y0-y1,b=x1-x0,d=2*a+b;d1=2*a,d2=2*(a+b);x=x0,y=y0;setPixel (x,y);while (x<x1){if (d<0){x++;y++;d+=d2;}else{x++;d+=d1;}setPixel(x,y);}return ;
}void lineBres(int x0,int y0,int xEnd,int yEnd){int dx=fabs(xEnd-x0),dy=fabs(yEnd-y0);int p=2*dy-dx;int twoDy=2*dy,twoDyMinusDx=2*(dy-dx);int x,y;if(x0>xEnd){x=xEnd;y=yEnd;xEnd=x0;}else{x=x0;y=y0;}setPixel(x,y);while(x<xEnd){x++;if(p<0)p+=twoDy;else{y++;p+=twoDyMinusDx;}setPixel(x,y);}
}class screenPt {private:GLint x, y;public:screenPt() { x = y = 0; }void setCoords(GLint xCoordValue, GLint yCoordValue) {x = xCoordValue;y = yCoordValue;}GLint getx() const { return x; }GLint gety() const { return y; }void incremetx() { x++; }void decrementy() { y--; }
};void circleMidp(GLint xc, GLint yc, GLint radius) {screenPt circPt;GLint p = 1 - radius;circPt.setCoords(0, radius);void circlePlotPoints(GLint, GLint, screenPt);circlePlotPoints(xc, yc, circPt);while (circPt.getx() < circPt.gety()) {circPt.incremetx();if (p < 0)p += 2 * circPt.getx() + 1;else {circPt.decrementy();p += 2 * (circPt.getx() - circPt.gety()) + 1;}circlePlotPoints(xc, yc, circPt);}
}
void circlePlotPoints(GLint xc, GLint yc, screenPt circPt) {setPixel(xc + circPt.getx(), yc + circPt.gety());setPixel(xc - circPt.getx(), yc + circPt.gety());setPixel(xc + circPt.getx(), yc - circPt.gety());setPixel(xc - circPt.getx(), yc - circPt.gety());setPixel(xc + circPt.gety(), yc + circPt.getx());setPixel(xc - circPt.gety(), yc + circPt.getx());setPixel(xc + circPt.gety(), yc - circPt.getx());setPixel(xc - circPt.gety(), yc - circPt.getx());
}//绘制程序
void display(){glClear(GL_COLOR_BUFFER_BIT);//将屏幕设置为黑色glColor3f(0.0,0.4,0.2);//设置当前颜色状态为白色lineDDA (0,400,200,300);lineMiddle (0,300,350, 400);lineBres (0,0,150,400);circleMidp(200,200,100);glFlush();//发送缓冲区return ;
}//初始化绘制
void init(){glClearColor(1.0,1.0,1.0,0.0);//清除颜色设置glMatrixMode(GL_PROJECTION);//设置投影方式gluOrtho2D (0.0,400.0,0.0,400.0);return ;
}int main(int argc, char** argv){glutInit(&argc, argv);//初始化glutglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置显示模式为单缓冲,RGB模式glutInitWindowPosition(0,0);//设置窗口位置glutInitWindowSize(400,400);//设置窗口大小glutCreateWindow("GLUT_Project_1");//设置窗口标题init();glutDisplayFunc(display);glutMainLoop();return 0;
}

运行截图:

计算机图形学の三种经典画直线算法相关推荐

  1. 计算机图形学画圆和直线代码,计算机图形学作业(中点法画直线和八分画圆法).doc...

    中点法画直线: void MidBresenhamLine(CDC *pDC,int x0,int y0,int x1,int y1,int color){ int dx,dy,d,up,down,x ...

  2. 用计算机画中点和角平分线,计算机图形学作业(中点法画直线和八分画圆法)

    1.中点法画直线: void MidBresenhamLine(CDC *pDC,int x0,int y0,int x1,int y1,int color){ int dx,dy,d,up,down ...

  3. 图形学画直线c语言,计算机图形学:3种画直线算法(转)

    //--------------------------------------------------------------------- //绘制直线的DDA算法基本函数 //--------- ...

  4. line划线计算机图像学,【计算机图形学】根本图形元素:直线的生成算法

    [计算机图形学]基本图形元素:直线的生成算法 08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net ...

  5. 【计算机图形学】小白谈计算机图形学(二)画圆篇之中点画圆法,Bresenham画圆算法,椭圆实操,线型处理详解

    小白谈计算机图形学(二)画圆篇之中点画圆法,Bresenham画圆算法,椭圆实操,线型处理详解 引言 如何画圆 基本思想 中点画圆法 中点画圆基本思路 中点画圆改进 Bresenham画圆算法 Bre ...

  6. 计算机网络二分法划分网络,三种经典复杂网络社区结构划分算法研究_GN算法

    论文导读::复杂网络是复杂系统的高度抽象.即社区结构特性[3].算法是一种试探优化法[4].算法. 关键词:复杂网络,社区结构,Laplace图谱,Kernighan-Lin算法,GN算法 1引言 现 ...

  7. 计算机图形学三(补充):重心坐标(barycentric coordinates)详解及其作用

    重心坐标(Barycentric Coordinates) 1 重心坐标的定义及求解 1.1 基础定义 1.2 几何面积角度求解 1.3 坐标系角度求解 2 重心坐标的运用 Reference (本篇 ...

  8. Bresenham快速画直线算法

    现在的计算机的图像的都是用像素表示的,无论是点.直线.圆或其他图形最终都会以点的形式显示.人们看到屏幕的直线只不过是模拟出来的,人眼不能分辨出来而已.那么计算机是如何画直线的呢,其实有比较多的算法,这 ...

  9. 文本处理算法_基于 Python 的 11 种经典数据降维算法

    网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA.MDS.LLE. ...

  10. c语言编程非线性方程求解,c语言计算机编程三种方法求解非线性方程

    c语言计算机编程三种方法求解非线性方程 本 科 专 业 学 年 论 文题 目:非线性方程求解比较姓 名: 何 娟 专 业: 计算机科学技术系 班 级: 08 级本科(2)班 指 导 老 师: 刘 晓 ...

最新文章

  1. 3 年经验的 Java 后端妹子,横扫阿里、滴滴、美团,整理出这份厚厚的 8000 字面经!...
  2. DOS系统里,分屏显示目录的命令是什么??
  3. 201571030310/201571030329《小学四则运算训练软件》结对项目报告
  4. 怎样能用计算机打出表白数字,怎么用数字表白?盘点数字表白暗语
  5. 关于软件组织培训的几个值得提倡的建议
  6. JVM实用参数(五)新生代垃圾回收
  7. redmine 无法登录 mysql 服务器_Redmine 数据库连接错误
  8. Logistic回归——二分类 —— matlab
  9. 续Gulp使用入门三步压缩CSS
  10. python必备神器_Python 必备神器
  11. 为什么单线程的Redis却能支撑高并发? ---------- I/O 多路复用
  12. 解决libstdc++.so.6: version `GLIBCXX_3.4.22' not found
  13. mysql 7 for windows_Mysql 5.7 for windows 免安装版(解压版)安装和配置
  14. abap object-oriented–使用事件
  15. 微信Emoji工具-EmojiUtil
  16. Win10卸载edge浏览器与后悔重装
  17. 小程序定位苹果手机可以,但是安装手机获取不到定位
  18. StarUML3.0的破解方法
  19. 仿牛客网项目第二章:开发社区登录模块(详细步骤和思路)
  20. idea设置了默认换行符,ctl + s 保存文件时换行符没有变成默认换行符 解决方法

热门文章

  1. x9此计算机上没有hasp_中琅条码打印软件安装后弹出HASP错误代码处理方法
  2. 反编译获取任何微信小程序源码
  3. windows7 android 驱动,Windows7安卓刷机驱动安装教程图文详解
  4. c语言的编译器vs2019的安装及简单实用
  5. PDF怎么翻译成中文?这些方法值得收藏
  6. Windows 重装系统后 开发环境配置 软件安装列表
  7. python 控制雕刻机_GitHub - cdhigh/PrinterCnc: 废打印机改装的大行程“雕刻机”,可以制作PCB。...
  8. 短视频新媒体运营策划推广工作计划表模板
  9. 捷联惯导算法 matlab,捷联惯导算法与组合导航原理资料及更正
  10. 索引(挑战程序设计竞赛——经验篇)