图形学基本算法:Bresenham算法

这篇博客展示了如何使用Bresenham算法和OpenGL的内置函数在C#环境下分别绘制直线。通过两个示例,作者详细解释了Bresenham算法的实现过程,并对比了直接使用OpenGL函数的画线方法。代码中包含了初始化设置、直线绘制函数及主程序,适合学习计算机图形学和OpenGL的读者参考。

直接上代码VS2015 C#编写

#include"stdafx.h"
#include <GL/glut.h>
#include <iostream>
#include <cmath>
//LML SPQ写于2021
void init()
{
 glClearColor(1.0, 1.0, 1.0, 1.0);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluOrtho2D(0.0, 200.0, 0.0, 150.0);
}
void midbr(int x0,int y0,int x1,int y1)
//算法条件:x1>x0,y1>y0,x1-x0>y1-y0,,斜率大于0小于1
//算法缺点:只能绘制斜率为正的直线
{
 int a = y0 - y1, b = x1 - x0;
 int d = 2 * a + b;
 int x = x0, y = y0;

 
 
 glVertex2i(x, y);
 while (x <= x1) {
  glVertex2i(x, y);
  if (d < 0) {
   d = d + 2 * (a + b);
   y++;
  }
  else {
   d += 2 * a;
  }
  x++;
 }


 
}
void display()
{
 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(0.0, 0.0, 0.0);
 glBegin(GL_POINTS);

 midbr(90, 100, 100, 110);
 midbr(90, 110, 100, 110);
 midbr(80, 100, 90, 100);
 midbr(80, 100, 90, 110);
 glEnd();

 glFlush();

}

int main(int argc, char** argv)
{
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
 glutInitWindowPosition(50, 100);
 glutInitWindowSize(640, 480);
 glutCreateWindow("Bresenham Draw Line");
 init();
 glutDisplayFunc(display);
 glutMainLoop();
 return 0;
}

Bresenham算法结果图:
在这里插入图片描述

直接用Opengl函数画直线:

//以下为函数画直线

#include"stdafx.h"
#include <GL/glut.h>
#include <iostream>
#include <cmath>
//测绘1803,李明路631801110312
void init()
{
 glClearColor(1.0, 1.0, 1.0, 1.0);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluOrtho2D(0.0, 200.0, 0.0, 150.0);

}
void display()
{
 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(1.0, 0.0, 0.0);
 glBegin(GL_LINES);
 glVertex2i(100, 40);
 glVertex2i(100, 90);
 glVertex2i(100, 90);
 glVertex2i(60, 90);
 glVertex2i(60, 90);
 glVertex2i(60, 40);

 
 glVertex2i(60, 40);
 glVertex2i(100, 40);
 glEnd();

 glFlush();

}

int main(int argc, char** argv)
{
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
 glutInitWindowPosition(50, 100);
 glutInitWindowSize(640, 480);
 glutCreateWindow("LINE DARW");
 init();
 glutDisplayFunc(display);
 glutMainLoop();
 return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值