OpenGL中点Bresenham绘制直线算法

时间:2021-05-20

本文实例为大家分享了OpenGL中点Bresenham绘制直线算法,供大家参考,具体内容如下

环境

macos xcode编译器

代码

#include <GLUT/GLUT.h>#include <iostream>#include<iostream>#include<cstdlib>#include<ctime>using namespace std;float wid = 400; //设置窗口的大小,约定窗口必须为正方形float height = wid; //设置窗口的大小int numbers = 20; //设置划分的网格的个数float t = wid/numbers; //模拟像素下的单位1/* 参数设置说明: 输入直线的两点A(x1,y1);B(x2,y2) 您应当确保参数范围在-400~400.且为整数。 *支持不同斜率 *支持两点位置颠倒 */int x1 = -300,y1=-400,x2 =400,y2 = 100;void draw_point(float x, float y,int k_kind,int d_kind);float translater(int x);void swap(int &a, int &b){ int tmp = 0; tmp = b; b = a; a = tmp; }void bresenham(int x1, int y1,int x2, int y2){ int k_kind = 0; //k_kind用来表示斜率的类型。0是0~1;1是1~无穷;2是0~-1;3是负无穷~-1 int d_kind =0; //d_kind用来表示dy正负的类型。 if (x1 > x2) { swap(x1,x2); swap(y1,y2); } int dx = abs(x2-x1), dy = abs(y2-y1); if (y1 > y2) {//如果是向下的 y1 = -y1; y2 = -y2; d_kind = 1; } if (dy > dx) { //斜率介于1~无穷的,将看作坐标系变换(这里将坐标变换)。 swap(x1, y1); swap(x2,y2); swap(dx,dy); k_kind = 1; } float d = (dy +dy -dx)*t; //令d为决策量(这里利用d = dx*w*2避免浮点运算) float x = x1+0.0,y = y1+0.0; draw_point(translater(x),translater(y),k_kind,d_kind); //绘制下一个点 while( x < x2){ //以x为步长 if (d < 0){ d += 2*dy*t; } else{ d += 2*(dy-dx)*t; y += t; //说明应该画在上面那个位置 } x= x + t; draw_point(translater(x),translater(y),k_kind,d_kind); //绘制下一个点 }}float translater(int x){ return x/wid;}void draw_point(float x , float y, int k_kind,int d_kind){ glPointSize(7); glColor3f(0.0,0.0,1.0); glBegin(GL_POINTS); cout <<"k:"<<k_kind<<"d:" << d_kind << endl; if(k_kind==0&&d_kind==1){ y = -y; }else if (k_kind ==1 &&d_kind==1){ x= -x; swap(x,y); }else if (k_kind==1&&d_kind ==0){ swap(x,y); } glVertex3f(x,y,0.0); glEnd(); glFlush();}void grid(){ glClearColor(0, 0, 0, 0);//这是设置背景色,必须要在glclear之前调用 glClear(GL_COLOR_BUFFER_BIT); //画直线 int wid_number = numbers; int hei_number = numbers; float delta_wid = wid / wid_number; float delta_hei = height / hei_number; glColor3f(1.0,1.0,0); for (int i = 1; i < 40 ; i ++ ) { glBegin(GL_LINES); glVertex2f(-1+i*delta_hei/height, -1); glVertex2f(-1+i*delta_hei/height, 1); glVertex2f(-1,-1+i*delta_hei/height); glVertex2f(1,-1+i*delta_hei/height); glEnd(); glFlush(); } glColor3f(1.0,0,0); glBegin(GL_LINES); //绘制坐标系,便于观察 glVertex2f(-1,0); glVertex2f(1,0); glVertex2f(0,-1); glVertex2f(0,1); glEnd(); glFlush(); glBegin(GL_LINES); glColor3f(1.0,0.0,0.0); glVertex2f(translater(x1),translater(y1)); //定点坐标范围 glVertex2f(translater(x2),translater(y2)); glEnd(); glFlush(); //刷新缓冲,保证绘图命令能被执行 bresenham(x1, y1,x2,y2);}int main(int argc, char *argv[]) { //初始化GLUT library glutInit(&argc, argv); //对窗口的大小进行初始化 glutInitWindowSize(700,700); glutInitWindowPosition(300,200); // 设置窗口出现的位置 //glutInitWindowPosition(int x, int y); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow("class16_hw1"); glutDisplayFunc(&grid); glutMainLoop(); return 0;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章