实验四
多边形
一、实验目的
1、了解中点画圆的算法;
2、掌握 OpenGL 的多边形的绘图以及填充。
二、实验内容
1、利用圆的八对称性,以下面图中的八分之一圆弧(x>y)为主导,请设计一个中
点画圆法,画圆。
2、任意画出一个封闭的二维图形,自定义一个图案对其进行填充。
3、编程画出下面图形, 要求用两个循环语句实现.点的表示为:
int x[5]={180,120,140,220,240};
int y[5]={180,140,60,60,140};
4、(提高题)利用圆的正多边形逼近算法画出上面图形,由用户输入圆心、半径,
多边形的边数。
三、实验代码
实验一:
#include
#include
#include
void Init()
glClearColor(0.0f, 0.0f, 0.0f, 0.8f);
//设置背景为黑色
{
}
void Reshape(int w, int h)
{
}
glViewport(2, 2, w, h);
//设置屏幕尺寸
glMatrixMode(GL_PROJECTION);
//指定当前操作投影矩阵堆栈
glLoadIdentity();
//重置投影矩阵
gluOrtho2D(0, (double)w, 0, (double)h);
//设置二维图大小
void point(int x, int y)
{
}
glColor3f(1.0f, 1.0f, 1.0f);
glPointSize(2);
//设置点的大小
glBegin(GL_POINTS);
glVertex2f(150 + x, 150 + y);
//Sleep(100);
glEnd();
glFlush();
void cirport( int x, int y)
{
}
point(x, y);
point(y, x);
point(-y, x);
point(-x, y);
point(-x, -y);
point(-y, -x);
point(y, -x);
point(x, -y);
void MidBresenhamCircle(int r)
{
int x, y, d;
y = 0;
x = r;
d = 1 - r;
while (y <= x)
{
cirport(y, x);
if (d<0)
d += 2 * y + 3;
else
{
}
y++;
d += 2 * (y - x) + 5;
x--;
}
}
void myDisplay()
MidBresenhamCircle(80);
{
}
//glBegin()的参数如果是 GL_LINE,则只能画一条线,glBegin 和 glEnd 之间的两句话用于指定直线
的起点和终点。glBegin()的参数如果是 GL_LINEs,则能画多条线
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100,100);
glutInitWindowSize(640, 480);
glutCreateWindow("FirstDemo");
Init();
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}
实验二:
#include
#include
#include
void Init()
glClearColor(1.0f,1.0f,1.0f,0.5f);
//设置背景颜色
{
}
void Reshape(int w, int h)
{
}
glViewport(2, 2, w, h);
//设置屏幕尺寸
glMatrixMode(GL_PROJECTION);
//指定当前操作投影矩阵堆栈
glLoadIdentity();
//重置投影矩阵
gluOrtho2D(0, (double)w, 0, (double)h);
//设置二维图大小
void myDisplay()
glClear(GL_COLOR_BUFFER_BIT);
glPolygonMode(GL_FRONT,GL_FILL);
glColor3f(0.98, 0.625, 0.12);
glBegin(GL_POLYGON);
glVertex2i(150, 100);
glVertex2i(150, 200);
glVertex2f(300, 300);
glVertex2f(250, 250);
glVertex2f(250, 200);
glEnd();
glFlush();
{
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(640, 480);
glutCreateWindow("FirstDemo");
Init();
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}
实验三:
#include
#include
#include
void Init()
glClearColor(1.0f, 1.0f, 1.0f, 0.8f);
//设置背景
{
}
void Reshape(int w, int h)
{
}
glViewport(2, 2, w, h);
//设置屏幕尺寸
glMatrixMode(GL_PROJECTION);
//指定当前操作投影矩阵堆栈
glLoadIdentity();
//重置投影矩阵
gluOrtho2D(0, (double)w, 0, (double)h);
//设置二维图大小
void mydisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
int x[5] = { 180,120,140,220,240 };
int y[5] = { 180,140,60,60,140 };
////*****五边形
glColor3f(1, 0, 0);
glBegin(GL_LINE_LOOP);
for (int i = 0;i < 5;i++)
{
glVertex2i(x[i], y[i]);
}
glEnd();
glColor3f(0, 1, 0);
glBegin(GL_LINES);
for (int i = 0;i < 5;i++)
{
}
glVertex2i(x[i], y[i]);
if (i + 2 > 4)
int j = (i + 2) % 5;
glVertex2i(x[j], y[j]);
{
}
else
glVertex2i(x[i + 2], y[i + 2]);
glEnd();
glFlush();
}
int main(int argc, char* argv[])
{
}
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(680, 480);
glutInitWindowPosition(100, 100);
glutCreateWindow("FirstDemo");
Init();
glutDisplayFunc(mydisplay); //显示
glutReshapeFunc(Reshape); //重绘
glutMainLoop();
return 0;
四、实验结果截图
五、实验体会
实验一:这次用了中点画圆法,有两种情况,一种是x>y,一种是x