使用openGL,用Bresenham算法画椭圆

运行结果

在这里插入图片描述

源代码


//用Bresenham算法画椭圆
#include<iostream>
#include<stdlib.h>
#include <GL/glut.h>
void putpixel(int xc, int yc, int x, int y) {
	glBegin(GL_POINTS);
	glVertex3f(xc + x, yc + y, 0);
	glEnd();
}
void drawElipse(int xc, int yc, int a, int b) {
	int x, y; 
	float d1, d2; 
	x = 0; y = b;
	d1 = b * b + a * a * (-b + 0.25);
	putpixel(xc, yc, x, y); putpixel(xc, yc, -x, -y); putpixel(xc, yc, -x, y); putpixel(xc, yc, x, -y);
	while (b * b * (x + 1) < a * a * (y - 0.5)) {
		if (d1 < 0) {
			d1 += b * b * (2 * x + 3);
			x++;
		}
		else {
			d1 += b * b * (2 * x + 3) + a * a * (-2 * y + 2);
			x++; y--;
		}
		putpixel(xc, yc, x, y); putpixel(xc, yc, -x, -y); putpixel(xc, yc, -x, y); putpixel(xc, yc, x, -y);
	}
	d2 = b * b * (x + 0.5) * (x + 0.5) + a * a * (y - 1) * (y - 1) - a * a * b * b; 
	while (y > 0) {
		if (d2 <= 0) {
			d2 += b * b * (2 * x + 2) + a * a * (-2 * y + 3);
			x++; y--;
		}
		else {
			d2 += a * a * (-2 * y + 3); 
			y--;
		}
		putpixel(xc, yc, x, y); putpixel(xc, yc, -x, -y); putpixel(xc, yc, -x, y); putpixel(xc, yc, x, -y);
	}
}
void display() {
	glClear(GL_COLOR_BUFFER_BIT);
	glViewport(0, 0, 500, 500);
	drawElipse(250, 250, 60, 40);
	glFlush();
}
void myinit(void) {
	//白色背景,红色画线
	glClearColor(1.0, 1.0, 1.0, 0.0);
	glColor3f(1.0, 0.0, 0.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0.0, 500.0, 0.0, 500.0);
	glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RED);
	glutInitWindowSize(500, 500);
	glutInitWindowPosition(0, 0);
	//画椭圆
	glutCreateWindow("用Bresenham算法画椭圆");
	glutDisplayFunc(display);
	myinit();
	glutMainLoop();
	return 0;
}

posted @ 2021-03-10 20:06  AC_沫离  阅读(347)  评论(0)    收藏  举报