计算机图形学(1)——直线生成算法的实现

网上可以找到很多关于直线生成算法的原理的讲解,这里就不赘述了。参考书籍如下:


书上实验二的示例程序:
#include "stdafx.h"
#include<gl/glut.h>
void LineDDA(int x0,int y0,int x1, int y1/*,int color*/)
{
int x,dy,dx,y;
float m;
dx=x1-x0;
dy=y1-y0;
m=dy/dx;
y=y0;
 
glColor3f(1.0f,1.0f,1.0f);
glPointSize(1);
for(x=x0;x<=x1;x++)
{
glBegin (GL_POINTS);
glVertex2i (x,(int)(y+0.5));
glEnd();
y+=m;
}
}
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glRectf(25.0,25.0,75.0,75.0);
 
glPointSize(5);
glBegin (GL_POINTS);
glColor3f(0.0f,1.0f,0.0f);    glVertex2f(0.0f,0.0f);
glEnd();
LineDDA(0,0,200,300);

glBegin(GL_LINES);
glColor3f(1.0f,0.0f,0.0f);    glVertex2f(100.0f,0.0f);
glColor3f(0.0f,1.0f,0.0f);    glVertex2f(180.0f,240.0f);
glEnd();
 
glFlush();
}
 
void Init()
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
}
 
void Reshape(int w,int h)
{
glViewport(0,0,(GLsizei) w,(GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,(GLdouble) w,0.0,(GLdouble) h);
}
 
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow("Hello World!");
Init();
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}
 
(2)用Bresenham算法实验代码:
#include "stdafx.h"
#include <GL/glut.h>
#include <math.h>
//#include <WinGDI.h>
 
void swap_value (int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
 
void Bres_Line(int x1,int y1,int x2,int y2,int color) //Bresenham画线法
{
//setpixel(x1,y1,color); //将指定坐标处的像素设为指定的颜色
glColor3f(0.0, 0.0, 1.0);       // 蓝色
glPointSize(2.0f);
int dx=abs(x2-x1);
int dy=abs(y2-y1);
 
if(dx==0&&dy==0)
{
glBegin(GL_POINTS);
glVertex2f(x1, y1);
glEnd();
glFlush();
return;
}
 
int flag=0;
if(dx<dy) //下面将斜率变换至0<=|k|<=1之间
{
flag=1;
swap_value(&x1,&y1);
swap_value(&x2,&y2);
swap_value(&dx,&dy);
}
 
int tx=(x2-x1)>0?1:-1;
int ty=(y2-y1)>0?1:-1;
int curx=x1;
int cury=y1;
int dS=2*dy;
int dT=2*(dy-dx);
int d=dS-dx;
 
while(curx!=x2)
{
if(d<0)
d+=dS;
else
{
cury+=ty;
d+=dT;
}
 
if(flag)
//setpixel(cury,curx,color);
{
glBegin(GL_POINTS);
glVertex2f(cury, curx);
glEnd();
glFlush();
}
else
//setpixel(curx,cury,color);
{
glBegin(GL_POINTS);
glVertex2f(curx, cury);
glEnd();
glFlush();
}
curx+=tx;
}
}
 
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f (1.0f, 0.0f, 0.0f);
glRectf(25.0, 25.0, 75.0, 75.0); //画一个矩形
 
glPointSize(5);
glBegin (GL_POINTS);
glColor3f (0.0f, 1.0f, 0.0f);   glVertex2f (0.0f, 0.0f);
glEnd (); 
 
Bres_Line(0, 0, 200, 300,1.0f); //LineDDA不接受四个参数(修改处)
 
glBegin (GL_LINES); //画直线
glColor3f (1.0f, 0.0f, 0.0f);   glVertex2f (100.0f, 0.0f);
glColor3f (0.0f, 1.0f, 0.0f);   glVertex2f (180.0f, 240.0f);
glEnd (); 
glFlush();
} 
 
void Init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT); //平坦渐变模式
} 
 
void Reshape(int w, int h) //定义绘制物体时使用的坐标系
{
glViewport(0, 0, (GLsizei) w,  (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);
}
 
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("直线生成算法实现");
 
Init();
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}

实验结果:

 

实验提高

1)修改示例程序中的错误(修改LineDDA()函数),实现DDA算法

// CG_2_DDA算法.cpp : 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

#include <GL/glut.h>

#include <math.h>

 

void LineDDA(int x0,int y0,int x1,int y1/*,int color*/)

{

    int x, dy, dx, y;

    float m;

dx=x1-x0;

    dy=y1-y0;

if(abs(dx)>=abs(dy))

m=abs(dx);          //x为计长方向

else

m=abs(dy);          //y为计长方向

    y=y0;

    glColor3f (1.0f, 1.0f, 0.0f);

    glPointSize(1);

    for(x=x0;x<=x1; x++)

    {

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值