首先设置变量用于进行鼠标交互和键盘交互:

int m = 0;
GLdouble m1 =0, m2 = 0;

1.实验入口主函数:

//主函数
int main(int argc, char** argv) {glutInit(&argc, argv);//初始化openGlglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(100, 100);//显示窗口的位置glutInitWindowSize(350, 150);//显示窗口的大小glutCreateWindow("实验1");//表示用键盘来进行交互的init();//自定义的方法glutDisplayFunc(display);//绘制函数glutKeyboardFunc(myKayBoard);//点击键盘的时候就会调用该方法glutMouseFunc(mouseMoton);//鼠标点击时会调用该方法glutMainLoop();return 0;
}

2.对窗口进行一些初始化:

void init(void) {glClearColor(1.0, 1.0, 1.0, 0.0);//申明一个刷新的颜色glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0, 500, 0, 500);//glShadeModel(GL_FLAT);
}

3.显示函数的编写:

void display(void) {glClear(GL_COLOR_BUFFER_BIT);//用颜色刷新glColor3f(0.8, 0.5, 0.6);//绘制的颜色glPointSize(1);//绘制像素的大小if (m==0)bresenham(1.08,2.00, 373.80,367.66);if (m==1)halfzd(99.09,120.08,373.80, 367.66);if (m==2)myDDA(140.7, 200.3, 373.80, 367.66);glFlush();
}

4.关于DDA算法的实现:

void myDDA(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) {x1 = x1 + m1;y1 = y1 + m2;double dx = fabs(x2 - x1);double dy = fabs(y2 - y1);double steps;if (dx > dy)steps = dx;elsesteps = dy;double stepX = dx / steps;double stepY = dy / steps;glBegin(GL_POINTS);for (int i = 0;i < (int)steps;i++) {glVertex2f(x1, y1);x1 += stepX;y1 += stepY;}glEnd();
}

5.关于中点画线算法的实现:

void halfzd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) {double a = y1+m2-y2;double b = x2-x1-m1;double d = a + a + b;double d1 = a + a;double d2 = a + b + a + b;glBegin(GL_POINTS);glVertex2f(x1+m1, y1+m2);while (x1+m1 < x2) {if (d < 0) {x1++;y1++;d += d2;}else {x1++;d += d1;}glVertex2f(x1+m1, y1+m2);}glEnd();
}

6.关于Bresenham画线算法的实现:

void bresenham(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) {double dx = x2 - x1-m1;double dy = y2 - y1-m2;double k = dy / dx;double e = 0.5;glBegin(GL_POINTS);//表示画一个点for (int i = 0;i <= dx;i++) {glVertex2f(x1+m1, y1+m2);x1 = x1 + 1;e = e + k;if (e >= 0) {y1++;e = e - 1;}}glEnd();
}

7.对于鼠标点击函数

void mouseMoton(GLint button,GLint state,GLint x,GLint y) {//鼠标左点击if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {m1 = x;m2 = y;glutPostRedisplay();}//鼠标滚轮键if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) {m1 = x;m2 = y;glutPostRedisplay();}//鼠标右点击if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) {m1 = x;m2 = y;glutPostRedisplay();}
}

8.键盘点击函数:

void myKayBoard(unsigned char key, int x, int y) {//key对应键盘上面的一个键switch (key){case'z':m = 0;break;case'x':m = 1;break;case'c':m = 2;break;}//改变值后我们要使图形重新显示一遍glutPostRedisplay();}

完整版代码如下:

#include <iostream>
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>  int m = 0;
GLdouble m1 =0, m2 = 0;void bresenham(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) {double dx = x2 - x1-m1;double dy = y2 - y1-m2;double k = dy / dx;double e = 0.5;glBegin(GL_POINTS);//表示画一个点for (int i = 0;i <= dx;i++) {glVertex2f(x1+m1, y1+m2);x1 = x1 + 1;e = e + k;if (e >= 0) {y1++;e = e - 1;}}glEnd();
}void halfzd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) {double a = y1+m2-y2;double b = x2-x1-m1;double d = a + a + b;double d1 = a + a;double d2 = a + b + a + b;glBegin(GL_POINTS);glVertex2f(x1+m1, y1+m2);while (x1+m1 < x2) {if (d < 0) {x1++;y1++;d += d2;}else {x1++;d += d1;}glVertex2f(x1+m1, y1+m2);}glEnd();
}void myDDA(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) {x1 = x1 + m1;y1 = y1 + m2;double dx = fabs(x2 - x1);double dy = fabs(y2 - y1);double steps;if (dx > dy)steps = dx;elsesteps = dy;double stepX = dx / steps;double stepY = dy / steps;glBegin(GL_POINTS);for (int i = 0;i < (int)steps;i++) {glVertex2f(x1, y1);x1 += stepX;y1 += stepY;}glEnd();
}//键盘点击函数
void myKayBoard(unsigned char key, int x, int y) {//key对应键盘上面的一个键switch (key){case'z':m = 0;break;case'x':m = 1;break;case'c':m = 2;break;}//改变值后我们要使图形重新显示一遍glutPostRedisplay();}//鼠标点击函数
void mouseMoton(GLint button,GLint state,GLint x,GLint y) {//鼠标左点击if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {m1 = x;m2 = y;glutPostRedisplay();}//鼠标滚轮键if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) {m1 = x;m2 = y;glutPostRedisplay();}//鼠标右点击if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) {m1 = x;m2 = y;glutPostRedisplay();}
}void display(void) {glClear(GL_COLOR_BUFFER_BIT);//用颜色刷新glColor3f(0.8, 0.5, 0.6);//绘制的颜色glPointSize(1);//绘制像素的大小if (m==0)bresenham(1.08,2.00, 373.80,367.66);if (m==1)halfzd(99.09,120.08,373.80, 367.66);if (m==2)myDDA(140.7, 200.3, 373.80, 367.66);glFlush();
}void init(void) {glClearColor(1.0, 1.0, 1.0, 0.0);//申明一个刷新的颜色glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0, 500, 0, 500);//glShadeModel(GL_FLAT);
}//主函数
int main(int argc, char** argv) {glutInit(&argc, argv);//初始化openGlglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(100, 100);//显示窗口的位置glutInitWindowSize(350, 150);//显示窗口的大小glutCreateWindow("实验1");//表示用键盘来进行交互的init();//自定义的方法glutDisplayFunc(display);//绘制函数glutKeyboardFunc(myKayBoard);//点击键盘的时候就会调用该方法glutMouseFunc(mouseMoton);//鼠标点击时会调用该方法glutMainLoop();return 0;
}

实验结果:

在实验中我同时写入了ADD划线算法,中点画线算法、Bresenham画线算法可以通过键盘的输入来控制不同算法的显示窗口的显示,跟人进行交互:

运行后的窗口图形如下,为默认的Bresenham画线算法

当我们键盘输入x时,该窗口的显示切换到中点画线算法会出现下图所示:

当我们从键盘键入c时,该窗口的显示切换到中点画线算法会出现如下所示:

在我们的每一个图形窗口可以通过鼠标左键,或者鼠标右键,或者滚动鼠标轮,我们可以自由切换任意的线段方向。也就是可以处理任意方向和任意斜率的直线端,也对非整数坐标进行了处理。比如如下:

openGL实现中点画线算法、DDA画线算法,Bresenham画线算法,并进行鼠标键盘的交互相关推荐

  1. [XJTUSE]计算机图形学第二章作业,使用OpenGL编程实现DDA、中点画线和Bresenham算法和中点画圆法

    首先是Windows10 + Visual Studio 2019 搭建OpenGL环境可以查看如下链接: 萌新向!!!Windows10 + Visual Studio 2019 搭建OpenGL环 ...

  2. 【计算机图形学】扫面转换算法(DDA算法 中点画线算法 Bresenham画线算法)

    模块1 扫描转换算法 一 实验目的 编写直线.弧线的光栅扫描转换算法,并对线宽与线形的算法加以探讨 用DDA算法.中点画线算法.Bresenham画线算法绘制直线(如果键盘输入数据,给出数据值:如果绘 ...

  3. 画毛毛虫代码计算机图形学,计算机图形学 实验 数值微分(DDA)法、中点画线法、Bresenham算法.doc...

    文档介绍: 实验名称数值微分(DDA)法.中点画线法.Bresenham算法实验时间年月日专业姓名学号预****操作座位号教师签名总评一.实验目的:1.了解数值微分(DDA)法.中点画线法.Brese ...

  4. 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法

    前言 本笔记基于 http://www.icourse163.org/learn/CAU-45006?tid=1001746004#/learn/announce 感谢中国农大 赵明老师的分享~ 现在 ...

  5. 图形学--(中点画线法+Bresenham画线算法)

    编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color)  用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我 ...

  6. 【OpenGL C++】画一个空心汉字和一个圆,并填充汉字(中点画线法,中点画圆法,种子填充法)

    内容:画一个空心汉字和一个圆 设计一个画任意直线和圆的算法,可选所学的任一图形扫描转换算法(中点或bresenham算法),不能使用任何画线/画圆的API: 使用画线算法实现空心汉字的绘制,汉字必须为 ...

  7. 图形学---中点画线法---opengl中实现

    目的: 为了优化DDA算法中的浮点数运算(DDA中每次+k运算,|k|<1,所以存在浮点数运算),达到整数运算,提高效率. 基本思想: 当前像素点为(xp,yp),下一像素点为P1或P2.设P1 ...

  8. JAVA实现中点画线_实验1-中点画线和Bresenham画线算法的实现

    <实验1-中点画线和Bresenham画线算法的实现>由会员分享,可在线阅读,更多相关<实验1-中点画线和Bresenham画线算法的实现(9页珍藏版)>请在人人文库网上搜索. ...

  9. java实现计算机图形学中点画线算法

    代码:DrawLine.java: import javax.swing.*; import java.awt.*;public class DrawLine extends JPanel {publ ...

最新文章

  1. 关于不能成为专业软件测试人员的10大理由的一些阐述
  2. Nginx从基本原理到开发实践
  3. 自己动手开发jQuery插件
  4. 图解Win7下安装Borland C++ 3.1失败记
  5. 1.1 基础-取近似值
  6. lcd背光节能matlab代码,【技术分享】LCD背光驱动节电技术-LABC/CABC
  7. 程序员难以攻克的十大难题
  8. linux常用指令 查看端口占用情况
  9. python日期时间_Python日期时间
  10. 一文详解自然语言处理任务之共指消解
  11. 去除右键菜单中图形属性、图形选项
  12. Drools规则引擎的基本使用
  13. c语言链表详解(超详细)
  14. android 设置iptv vlan tag的命令,关于VLAN TAG的命令行设置
  15. 物联网、大数据和云计算的基本关系和应用
  16. 西门子S7200plc通信不上实际问题和解决方法
  17. SAP客户主数据相关表
  18. 2020搞一个副业项目需要什么技能?
  19. 第十八次CCF计算机软件能力认证
  20. Velocity模板语言(VTL):说明

热门文章

  1. android采集的视频进行旋转
  2. 技术劳模男B哥的DTCC2017三天,认真你就输了。。。
  3. 最网最全bug定位套路,遇见bug再也不慌了
  4. 验证码绕过、密码找回漏洞简介
  5. 【Rails】TDD-测试驱动开发
  6. HR必看!设置员工生日提醒
  7. python中randrange函数_python 函数中的内置函数及用法详解
  8. NODE.JS短信接口示例demo
  9. 网络ip地址划分-子网划分
  10. win10系统word2019给标题设置添加设置自定义自动编号的方法