#include <windows.h>
#include <gl/glut.h>
#include <iostream>
#include <cmath>
using namespace std;
int m_pointnumber = 0; //动画时绘制点的数目
int m_drawmode = 1; //绘制模式 1. DDA算法画直线
// 2. 中点Bresenham算法画直线
// 3. 改进Bresenham算法画直线0.f
// 4. 八分法绘制圆
// 5. 四分法绘制椭圆(选做)
//绘制坐标线
void DrawCordinateLine(void)
{
int i=0;
//坐标线为黑色
glColor3f( 0.0f, 0.0f, 0.0f );
glBegin(GL_LINES);
for( i =10;i<=250;i=i+10)
{
glVertex2f((float)(i), 0.0f);
glVertex2f((float)(i), 250.0f);
glVertex2f(0.0f,(float)(i));
glVertex2f(250.0f,(float)(i));
}
glEnd();
}
//绘制一个点,这里用一个正方形表示一个点
void PutPixel(GLsizei x ,GLsizei y )
{
glRectf(10*x,10*y,10*x+10,10*y+10);
}
/////////////////////////////////////////////////////////////////////////
//dda画线算法 //
//参数说明: x0 ,y0 起点坐标 //
// x1, y1 终点坐标 //
// num 扫描转换时从起点开始输出的点的数目,用于动画 //
/////////////////////////////////////////////////////////////////////////
void DDAcreateLine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num)
{
//设置颜色
glColor3f(1.0f, 0.0f, 0.0f);
//对画线动画进行控制
if(num==1)
cout<<"DDA画线算法:各点坐标\n";
else if(num==0)
return;
//画线算法的实现
GLsizei dx,dy,epsl,k;
GLfloat x,y,xincre,yincre;
dx=x1-x0;
dy=y1-y0;
x=x0;
y=y0;
if(abs(dx)>abs(dy)) epsl=abs(dx);
else epsl=abs(dy);
xincre=(float)dx/epsl;
yincre=(float)dy/epsl;
for(k=0;k<=epsl;k++)
{
PutPixel((int)(x+0.5),(int)(y+0.5));
if(k>=num-1)
{
cout<<"x="<<x<<",y="<<y
<<";取整后"<<"x="<<(int)(x+0.5)
<<",y="<<(int )(y+0.5)<<endl;
break;
}
x+=xincre;
y+=yincre;
if(x>=25 || y>=25) break;
}
}
//////////////////////////////////////////////////////////////////////
//中点算法画直线(0<=k<=1) //
//参数说明: x0 ,y0 起点坐标 //
// x1, y1 终点坐标 //
// num 扫描转换时从起点开始输出的点的数目,用于动画 //
//////////////////////////////////////////////////////////////////////
void BresenhamLine(GLsizei x0,GLsizei y0,GLsizei x1,GLsizei y1,GLsizei num)
{
glColor3f(1.0f,0.0f,0.0f);
if(num==1)
cout<<"中点算法画直线:各点坐标及判别式的值\n";
else if(num==0)
return;
//算法的实现
GLsizei p=0;
GLfloat upincre,downincre,x,y,d,k,dx,dy;
if(x0>x1)
{
x=x1; x1=x0; x0=x;
y=y1; y1=y0; y0=y;
}
x=x0;y=y0;
dx=x1-x0;dy=y1-y0;
k=dy/dx;
if(k>=0&&k<=1)
{
d=dx-2*dy;
upincre=2*dx-2*dy;
downincre=-2*dy;
while(x<=x1)
{
PutPixel(x,y);
if(p>=num-1)
{
cout<<"x="<<x<<",y="<<y<<endl;
break;
}
p++;
x++;
if(d<0)
{
y++;
d+=upincre;
}
else d+=downincre;
}
}
if(k>1)
{
d=dy-2*dx;
upincre=2*dy-2*dx;
downincre=-2*dx;
while(y<=y1)
{
PutPixel(x,y);
if(p>=num-1)
{
cout<<"x="<<x<<",y="<<y<<endl;
break;
}
p++;
y++;
if(d<0)
{
x++;
d+=upincre;
}
else d+=downincre;
}
}
if(k<0&&k>=-1)
{
d=dx-2*dy;
upincre=-2*dy;
downincre=-2*dx-2*dy;
while(x<=x1)
{
PutPixel(x,y);
if(p>=num-1)
{
cout<<"x="<<x<<",y="<<y<<endl;
break;
}
p++;
x++;
if(d>0)
{
y--;
d+=downincre;
}
else d+=upincre;
}
}
if(k<-1)
{
d=-dy-2*dx;
upincre=-2*dx-2*dy;
downincre=-2*dx;
while(y>=y1)
{
PutPixel(x,y);
if(p>=num-1)
{
cout<<"x="<<x<<",y="<<y<<endl;
break;
}
p++;
y--;
if(d<0)
{
x++;
d+=upincre;
}
else d+=downincre;
}
}
}
/////////////////////////////////////////////////////////////////////
//改进bresenham算法画直线(0<=k<=1) //
//参数说明: x0 ,y0 起点坐标 //
// x1, y1 终点坐标 //
// num 扫描转换时从起点开始输出的点的数目,用于动画 //
/////////////////////////////////////////////////////////////////////
void Bresenham2Line(GLsizei x0,GLsizei y0,GLsizei x1,GLsizei y1,GLsizei num)
{
glColor3f(1.0f,0.0f,0.0f);
if(num==1)
cout<<"改进Bresenham算法画直线:各点坐标及判别式的值\n";
else if(num==0)
return;
//算法的实现
GLsizei p=0;
GLsizei x,y,dx,dy,e,k;
if(x0>x1)
{
x=x1; x1=x0; x0=x;
y=y1; y1=y0; y0=y;
}
dx=x1-x0;dy=y1-y0;
k=dy/dx;
if(k>=0&&k<=1)
{
e=-dx;x=x0;y=y0;
while(x<=x1)
{
PutPixel(x,y);
if(p>=num-1)
{
cout<<"x="<<x<<",y="<<y<<endl;
break;
}
p++;
x++;
e=e+2*dy;
if(e>0)
{
y++;
e=e-2*dx;
}
}
}
if(k>1)
{
e=-dy;x=x0;y=y0;
while(y<=y1)
{
PutPixel(x,y);
if(p>=num-1)
{
cout<<"x="<<x<<",y="<<y<<endl;
break;
}
p++;
y++;
e=e+2*dx;
if(e>0)
{
x++;
e=e-2*dy;
}
}
}
if(k<0&&k>=-1)
{
e=-dx;x=x0;y=y0;
while(x<=x1)
{
PutPixel(x,y);
if(p>=num-1)
{
cout<<"x="<<x<<",y="<<y<<endl;
break;
}
p++;
x++;
e=e+2*dy;
if(e<0)
{
y--;
e=e+2*dx;
}
}
}
if(k<-1)
{
e=-dy;x=x0;y=y0;
while(y>=y1)
{
PutPixel(x,y);
if(p>=num-1)
{
cout<<"x="<<x<<",y="<<y<<endl;
break;
}
p++;
y--;
e=e-2*dx;
if(e<0)
{
x++;
e=e-2*dy;
}
}
}
}
//////////////////////////////////////////////////////////////////////
//bresenham算法画圆 //
//参数说明: x0 ,y0 圆心坐标 //
// r 圆半径 //
// num 扫描转换时从起点开始输出的点的数目,用于动画 //
//////////////////////////////////////////////////////////////////////
void BresenhamCircle(GLsizei x1,GLsizei y1,GLsizei r,GLsizei num)
{
glColor3f(1.0f,0.0f,0.0f);
if(num==1)
cout<<"Bresenham算法画圆:各点坐标及判别式的值\n";
else if(num==0)
return;
//算法的实现
GLsizei d,x,y;
x=0;y=r;d=3-2*r;
while(x<=y)
{
PutPixel(x1 + x, y1 + y);
PutPixel(x1 + y, y1 + x);
PutPixel(x1 + y, y1 - x);
PutPixel(x1 + x, y1 - y);
PutPixel(x1 - x, y1 - y);
PutPixel(x1 - y, y1 - x);
PutPixel(x1 - y, y1 + x);
PutPixel(x1 - x, y1 + y);
if(x>=num-1)
{
cout<<"x="<<x<<",y="<<y<<",d="<<d<<endl;
break;
}
if(d<0) d+=4*x++ + 6;
else
{
d+=4*(x++ - y--)+10;
}
}
}
void Initial(void)
{
//设置窗口颜色为白色
glClearColor(1.0f,1.0f,1.0f,1.0f);
}
void ChangeSize(GLsizei w,GLsizei h)
{
if(h==0)
h=1;
//设置视区尺寸
glViewport(0,0,w,h);
//重置坐标系统
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//建立修剪空间的范围
if(w<=h)
glOrtho(0.0f,250.0f,0.0f,250.0f*h/w,1.0,-1.
C++ 实验三 基本图形生成算法
需积分: 5 63 浏览量
2024-05-01
18:04:00
上传
评论
收藏 5KB RAR 举报
温柔-的-女汉子
- 粉丝: 768
- 资源: 4011