一、直线中点算法(完整程序)
//绘制斜率大于0且小于1的线段
#include <GL/glut.h>
#include <iostream>
#include <cmath>
using namespace std;
void init()
{
glClearColor(1.0, 1.0, 1.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 200.0, 0.0, 150.0);
}
void display()
//算法条件:x1>x0,y1>y0,x1-x0>y1-y0,,斜率大于0小于1
{
//int x0 = 10, y0 = 10, x1 = 150, y1 = 100;
int x0, y0, x1, y1;
cout<<"please enter the positions of start point and the end point:x1,y1,x2,y2:"<<endl;
cin>>x0>>y0>>x1>>y1;
int a = y0 - y1, b = x1 - x0;
int d = 2 * a + b;
int x = x0, y = y0;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POINTS);
glVertex2i(x, y);
while (x <= x1) {
glVertex2i(x, y);
if (d < 0) {
d = d + 2 * (a + b);
y++;
}
else {
d += 2 * a;
}
x++;
}
glEnd();
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(50, 100);
glutInitWindowSize(640, 480);
glutCreateWindow("Bresenham Draw Line");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
二、Bresenham直线算法 (将display()函数替换上面完整的display()函数即可)
/*****************************************************************************************************/
//算法条件:x1>x0,y1>y0,x1-x0>y1-y0,,斜率大于0小于1
void display()
{
int x0 = 10, y0 = 10, x1 = 150, y1 = 100;
//int x0, y0, x1, y1;
//cout<<"please enter the positions of start point and the end point:x1,y1,x2,y2:"<<endl;
//cin>>x0>>y0>>x1>>y1;
int x = x0, y = y0;
int dy = y1 - y0, dx = x1 - x0;
int e = -dx;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POINTS);
glVertex2i(x, y);
while (x < x1) {
glVertex2i(x, y);
if (e >= 0) {
e = e + 2*(dy - dx);
y++;
}
else
e += 2 * dy;
x++;
}
glEnd();
glFlush();
}
三、中点算法画圆(将display()函数替换上面完整的display()函数即可)
/*****************************************************************************************/
void display()
{
int maginLeft = 60;
int marginRight = 60;
int r = 50;
int x = 0,
y = r,
d = 1 - r;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POINTS);
glVertex2i(x + maginLeft, y + marginRight);
while (x < y) {
if (d >= 0) {
d = d + 2 * (x - y) + 5;
y--;
}
else
d = d + 2 * x + 3;
x++;
glVertex2i(maginLeft, marginRight);//画圆心
glVertex2i(x + maginLeft, -y + marginRight);
glVertex2i(x + maginLeft, y + marginRight);
glVertex2i(-x + maginLeft, y + marginRight);
glVertex2i(-x + maginLeft, -y + marginRight);
glVertex2i(y + maginLeft, x + marginRight);
glVertex2i(y + maginLeft, -x + marginRight);
glVertex2i(-y + maginLeft, x + marginRight);
glVertex2i(-y + maginLeft, -x + marginRight);
}
glEnd();
glFlush();
}
四、圆的扫描转换----Bresenham算法 (将Fun函数和display()函数替换上面完整的display()函数即可)
/************************************************************************************************/
int Fun(int x, int y, int r) {
return pow(x, 2) + pow(y, 2) - pow(r, 2);
}
void display()
{
int centerX = 60;
int centerY = 60;
int r = 50;
int x = 0,
y = r,
e = 2 * (1 - r);
int d = Fun(x + 1, y, r) + Fun(x + 1, y - 1, r);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POINTS);
glVertex2i(x + centerX, y + centerY);
while (x < y) {
if (d >= 0) {
d = d + 4 * (x - y) + 10;
y--;
}
else
d = d + 4 * x + 6;
x++;
glVertex2i(centerX, centerY);//画圆心
glVertex2i(x + centerX, -y + centerY);
glVertex2i(x + centerX, y + centerY);
glVertex2i(-x + centerX, y + centerY);
glVertex2i(-x + centerX, -y + centerY);
glVertex2i(y + centerX, x + centerY);
glVertex2i(y + centerX, -x + centerY);
glVertex2i(-y + centerX, x + centerY);
glVertex2i(-y + centerX, -x + centerY);
}
glEnd();
glFlush();
}
/**************************************************************************************************/