用OpenGL實現 Breseham畫圓算法

#include <GL/glut.h>
#include <math.h>
#include <iostream>

using namespace std;

int xs = 0;
int ys = 0;
int r = 0;

void BresenhamCircle(int x0, int y0, int r)
{
	int x = 0;
	int y = r;
	int d = 2 * (1 -r);
	int d1 = 0;
	int d2 = 0;
	int direction;
	while (y >= 0)
	{
		glVertex2i(x0+x, y0+y);
		glVertex2i(x0+x, y0-y);
		glVertex2i(x0-x, y0-y);
		glVertex2i(x0-x, y0+y);
		if (d < 0)
		{
			d1 = 2 *(d + y) - 1;
			if (d1 < 0)
			{
				direction = 1;
			}
			else
			{
				direction = 2;
			}
		}
		else if (d > 0)
		{
			d2 = 2 * (d - x) -1;
			if (d < 0)
			{
				direction = 2;
			}
			else
			{
				direction = 3;
			}
		}
		else
			direction = 2;
		switch (direction)
		{
		case 1:
			x++;
			d += 2 * x + 1;
			break;
		case 2:
			x++;
			y--;
			d += 2 * (x - y + 1);
			break;
		case 3:
			y--;
			d += (-2 * y + 1);
			break;
		}
	}
}

void CircleSegment()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.0, 0.0, 0.0);
	glBegin(GL_POINTS);
	BresenhamCircle(xs, ys, r);
	glEnd();
	glFlush();
}

int main(int argc, char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
	cout << "輸入圓心座標和半徑(範圍爲 0 - 500, 0-500):";
	cin >> xs >> ys >> r;
	glutInitWindowPosition(50, 100);
	glutInitWindowSize(500, 500);
	glutCreateWindow("Breseham畫圓算法");
	glClearColor(1.0, 1.0, 1.0, 1.0);
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0.0, 500, 0.0, 500.0);
	glutDisplayFunc(CircleSegment);
	glutMainLoop();

	return 0;
}

發佈了42 篇原創文章 · 獲贊 57 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章