圆生成算法
公式太多,转为图片格式
【代码】
#include<GL/glut.h>
#include<math.h>
#include<Windows.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
GLsizei winWidth = 500, winHeight = 500;
GLuint regHex;//显示表标识
GLint xc,yc;
GLint radius;
class screenPt
{
private:
GLint x, y;
public:
screenPt()
{
x = y = 0;
}
void setCoords(GLint xcord, GLint ycord)
{
x = xcord;
y = ycord;
}
GLint getXcord()
{
return x;
}
GLint getYcord()
{
return y;
}
void incrementx()
{
x++;
}
void decrementy()
{
y--;
}
};
void setPixel(GLint x, GLint y)
{
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
void circlePoints(GLint xc, GLint yc, screenPt circPt)
{
setPixel(xc + circPt.getXcord(), yc + circPt.getYcord());
setPixel(xc - circPt.getXcord(), yc + circPt.getYcord());
setPixel(xc + circPt.getXcord(), yc - circPt.getYcord());
setPixel(xc - circPt.getXcord(), yc - circPt.getYcord());
setPixel(xc + circPt.getYcord(), yc + circPt.getXcord());
setPixel(xc - circPt.getYcord(), yc + circPt.getXcord());
setPixel(xc + circPt.getYcord(), yc - circPt.getXcord());
setPixel(xc - circPt.getYcord(), yc - circPt.getXcord());
}
void circMidPoint(GLint xc, GLint yc, GLint radius)
{
screenPt cirPt;
cout << "radius" << radius << endl;
cirPt.setCoords(0, radius);//初始点
GLint p = 1 - radius;//初始p
circlePoints(xc, yc, cirPt);
cout << cirPt.getXcord() << "," << cirPt.getYcord() << endl;
while (cirPt.getXcord() < cirPt.getYcord())
{
cout << "进入while" << endl;
cirPt.incrementx();
if (p < 0)
{
p += 2 * cirPt.getXcord() + 1;
}
else
{
cirPt.decrementy();
p += 2 * (cirPt.getXcord() - cirPt.getYcord()) + 1;
}
circlePoints(xc, yc, cirPt);
cout << "当前像素点为" << cirPt.getXcord() << "," << cirPt.getYcord() << endl;
}
}
static void init(void)
{
//初始化函数,并加入表
glClearColor(1.0, 1.0, 1.0, 0.0);//设置为白色背景
regHex = glGenLists(1);//获得一个标识
glNewList(regHex, GL_COMPILE);
glColor3f(1.0, 0.0,0.0);
glPointSize(5);
circMidPoint(xc, yc, radius);
glEndList();
}
void circlePlot(void)
{
//画圆
glClear(GL_COLOR_BUFFER_BIT);
glCallList(regHex);//显示表
glFlush();
}
void winReshapeFcn(int newWidth, int newHeight)
{
//窗口重定形函数
glMatrixMode(GL_PROJECTION);
glLoadIdentity();//将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作
gluOrtho2D(0.0, (GLdouble)newWidth, 0.0, (GLdouble)newWidth);
glClear(GL_COLOR_BUFFER_BIT);
} int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(100, 100);
glutInitWindowSize(winWidth, winHeight);
glutCreateWindow("Example");
cout << "输入圆心坐标(范围为0-500,0-500):" << endl;
cin >> xc >> yc;
cout << "输入半径" << endl;
cin >> radius;
init();
glutDisplayFunc(circlePlot);
glutReshapeFunc(winReshapeFcn);
glutMainLoop();
return 0;
}
【结果】
圆心坐标(200,200)半径100