#include "stdio.h"
#include "iostream.h"
#include <GL/glut.h>
#include <math.h>
float a, b, c, d;
int flag;
int xStart=0, yStart=0, xEnd=0, yEnd=0;
int pointSize=2;
void dda(float x1,float y1,float x2,float y2)
{
float x,y,k;
int d=1;
int i;
k=abs(x2-x1);
if(abs(y2-y1)>k)
{
k=abs(y2-y1);
d=-1;
}
x=x1;
y=y1;
for(i=0;i<=k;i++)
{
glPointSize(10.0);
glBegin(GL_POINTS);
if(d==1)
glVertex2f(x,int(y+0.5));
else
glVertex2f(int(x+0.5),y);
glEnd();
x=x+(x2-x1)/k;
y=y+(y2-y1)/k;
}
}
void bres(float x1,float y1,float x2,float y2)
{
float x,y,dx,dy,f,temp;
int s1,s2,interchange,i;
x=x1;
y=y1;
dx=abs(x2-x1);
dy=abs(y2-y1);
if(x2-x1>=0)
s1=1;
else
s1=-1;
if(y2-y1>=0)
s2=1;
else
s2=-1;
if(dy>dx)
{
temp=dx;
dx=dy;
dy=temp;
interchange=1;
}
else
interchange=0;
f=2*dy-dx;
for(i=0;i<=dx;i++)
{
glPointSize(10.0);
glBegin(GL_POINTS);
if(f>0)
{
if(interchange==1)
x=x+s1;
else
y=y+s2;
glVertex2f(x,y);
glEnd();
f=f-2*dx;
}
if(interchange=1)
y=y+s2;
else x=x+s1;
glVertex2f(x,y);
glEnd();
f=f+2*dy;
}
}
//鼠标响应函数
void mouse(int button, int state, int x, int y)
{
if(state==GLUT_DOWN)
{
switch(button)
{
case GLUT_LEFT_BUTTON:
xStart = x;
yStart = 300-y;
cout<<"L("<<xStart<<","<<yStart<<")"<<endl;
break;
case GLUT_RIGHT_BUTTON:
xEnd = x;
yEnd = 300-y;
cout<<"R("<<xEnd<<","<<yEnd<<")"<<endl;
break;
case GLUT_MIDDLE_BUTTON:
break;
}
}
glClear(GL_COLOR_BUFFER_BIT);
}
//点击鼠标时水平直线(dy=0)的响应函数
void lineBresPlane(void)
{
int x, y, xx, yy;
if( xStart>xEnd )
{
x = xEnd;
y = yEnd;
xx = xStart;
yy = yStart;
}
else
{
x = xStart;
y = yStart;
xx = xEnd;
yy = yEnd;
}
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
while(x<xx)
{
x += (pointSize/2);
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
}
//点击鼠标时竖直直线(dx=0)的响应函数
void lineBresApeak(void)
{
int x, y, xx, yy;
if( yStart>yEnd )
{
y = yEnd;
x = xEnd;
yy = yStart;
xx = xStart;
}
else
{
y = yStart;
x = xStart;
yy = yEnd;
xx = xEnd;
}
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
while(y<yy)
{
y += (pointSize/2);
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
}
//点击鼠标时dx=dy时的响应函数
void lineBresDiagonal(void)
{
int x, y, xx, yy;
if( xStart>xEnd )
{
x = xEnd;
y = yEnd;
xx = xStart;
yy = yStart;
}
else
{
x = xStart;
y = yStart;
xx = xEnd;
yy = yEnd;
}
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
bool flag = false;
if(yy>y) flag = true;
while(x<xx)
{
x += (pointSize/2);
if(flag)
y += (pointSize/2);
else
y -= (pointSize/2);
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
}
//点击鼠标时dx>dy时的响应函数
void lineBresXbig(void)
{
int dx = fabs(xEnd - xStart), dy = fabs(yEnd - yStart);
int p = 2*dy - dx;
int twoDy = 2*dy, twoDyMinusDx = 2*(dy-dx);
int x, y, xx, yy;
if( xStart>xEnd )
{
x = xEnd;
y = yEnd;
xx = xStart;
yy = yStart;
}
else
{
x = xStart;
y = yStart;
xx = xEnd;
yy = yEnd;
}
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
bool flag = false;
if(yy>y) flag = true;
while(x<xx)
{
x += (pointSize/2);
if(p<0)
p += twoDy;
else
{
if(flag)
y += (pointSize/2);
else
y -= (pointSize/2);
p += twoDyMinusDx;
}
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
}
//点击鼠标时dx<dy时的响应函数
void lineBresYbig(void)
{
int dx = fabs(xEnd - xStart), dy = fabs(yEnd - yStart);
int p = 2*dx - dy;
int twoDx = 2*dx, twoDxMinusDy = 2*(dx-dy);
int x, y, xx, yy;
if( yStart>yEnd )
{
y = yEnd;
x = xEnd;
yy = yStart;
xx = xStart;
}
else
{
y = yStart;
x = xStart;
yy = yEnd;
xx = xEnd;
}
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
bool flag = false;
if(xx>x) flag = true;
while(y<yy)
{
y += (pointSize/2);
if(p<0)
p += twoDx;
else
{
if(flag)
x += (pointSize/2);
else
x -= (pointSize/2);
p += twoDxMinusDy;
}
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
}
//鼠标取点时Bresenham算法实现
void Bresenham(void)
{
int dx = fabs(xEnd - xStart), dy = fabs(yEnd - yStart);
if(dx==0) lineBresApeak();
else if(dy==0) lineBresPlane();
else if(dx==dy) lineBresDiagonal();
else if(dx>dy) lineBresXbig();
else lineBresYbig();
}
void renderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT); //刷新背景
glLoadIdentity(); //两坐标系重合或者说坐标原点移到窗口中心
glClearColor(0.0f,1.0f,0.0f,0.0f);
int i,j;
for(i=-20;i<=20;i++)
for(j=-20;j<=20;j++)
{
glBegin(GL_LINES);
glColor3f(0.75,0.75,0.75);
glVertex2f(i,-20.0);
glVertex2f(i,20.0);
glVertex2f(-20,j);
glVertex2f(20,j);
glEnd();
}
glBegin(GL_LINES);
glColor3f(0.0,0.0,0.0);
glVertex2f(0.0,-20.0);
glVertex2f(0.0,20.0);
glVertex2f(-20.0,0.0);
glVertex2f(20.0,0.0);
// glColor3f(1.0,0.0,0.0);
// glEvalCoord2f(0.0,0.0);
glEnd();
/*draw points*/
glPointSize(10.0);
glBegin(GL_POINTS);
if(flag==2)
{
glColor3f(1.0f, 1.0f, 1.0f);
bres(a,b,c,d);
}
else if(flag==1)
{
glColor3f(1.0f, 0.0f, 0.0f);
dda(a,b,c,d);
}
else
{
glColor3f(0.25f, 0.25f, 0.25f);
Bresenham();
}
// glEvalPoint2(0.0,0.0);
// glVertex3f(0.0,0.0,0.0);
// glVertex3f(0.0,0.0,0.0);
glEnd();
glFlush();
}
//使用鼠标时屏幕初始化
void init(void)
{
glClearColor(0.0, 1.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
glPointSize(pointSize);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 400.0, 0.0, 300.0);
}
//使用鼠标时刷新窗口
void reshape(int w, int h)
{
glutPostRedisplay();
glViewport(0, 0, w, h);
}
void ChangeSize(GLsizei w, GLsizei h)//设置窗口
{
// Prevent a divide by zero
GLfloat nRange = 20.0f;
if(h == 0)
h = 1;
glViewport(0, 0, w, h);/*定义了视口和视口坐标。第一、二个参数是视口左下角的像素坐标,
第三、四个参数是视口的宽度和高度。*/
glMatrixMode(GL_PROJECTION);//从人眼坐标系转到剪裁坐标系
glLoadIdentity();
// 平行投影 (left, right, bottom, top, near, far)
if (w <= h)
glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange*2.0f, nRange*2.0f);
else
glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange*2.0f, nRange*2.0f);
glMatrixMode(GL_MODELVIEW);//从实体坐标系转到人眼坐标系
glLoadIdentity();
}
int main(int argc, char* argv[])
{
printf("请选择算法 1--add 2-bresenham 3-鼠标取点\n");
scanf("%d",&flag);
if (flag==3)
{
cout<<"输入显示的方格大小(2的倍数): "; cin>>pointSize;
cout<<"单击鼠标左键确定第一个端点,单击右键确定第二个端点。"<<endl;
cout<<"\n\n";
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(20, 20);
glutInitWindowSize(400, 300);
glutCreateWindow("Bresenham");
init();
glutMouseFunc(mouse);
glutReshapeFunc(reshape);
glutDisplayFunc(Bresenham);
glutIdleFunc(Bresenham);
glutMainLoop();
}
else
{
printf("请输入点的坐标:x[-20,20],y[-20,20]\n");
scanf("%f %f %f %f",&a,&b,&c,&d);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
glutInitWindowSize(600, 600);
glutInitWi
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
drawlines.rar (13个子文件)
drawlines
drawlines.opt 53KB
drawlines.ncb 49KB
drawlines.dsw 526B
drawlines.plg 1KB
drawlines.cpp 8KB
drawlines.dsp 3KB
Debug
drawlines.pdb 593KB
drawlines.obj 28KB
drawlines.ilk 314KB
drawlines.pch 397KB
vc60.idb 49KB
vc60.pdb 60KB
drawlines.exe 248KB
共 13 条
- 1
资源评论
- Zeus7644793692012-11-11运行效果不尽人意
- xiatianzt002013-03-19缺少一个库文件不能运行,所以看着下载吧。
- Mkluas2014-11-10代码不够清晰
- Hewie_D2014-03-17运行效果。。。无语
tongjiocean
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功