1、程序实现图元直线的bresenham(斜率绝对值小于1)算法。
2、用中点算法实现圆和抛物线的光栅化。圆的方程:x2+y2=r2(r=20),抛物线方程x=y2-5,在区间=<x<=10。
1、画直线代码如下:
#include <windows.h>
#include <GL/glut.h>
#include <math.h>
#define PI 3.14159265359
int width, height;
void SetPixel(int x, int y) // 填充一个像素
{
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
// Bresenham line algorithm
void MyLine(int xs, int ys, int xe, int ye)
{
int x = xs;
int y = ys;
int dx = abs(xe - xs);
int dy = abs(ye - ys);
int s1 = xe > xs ? 1 : -1;
int s2 = ye > ys ? 1 : -1;
bool interchange = false; // 默认不互换 dx、dy
if (dy > dx) // 当斜率大于 1 时,dx、dy 互换
{
int temp = dx;
dx = dy;
dy = temp;
interchange = true;
}
int e = 2 * dy - dx;
for (int i = 0; i <= dx; i++)
{
SetPixel(x, y); // SetPixel
if (e >= 0)
{
if (!interchange) // 当斜率 < 1 时,选取上下象素点
y += s2;
else // 当斜率 > 1 时,选取左右象素点
x += s1;
e -= 2 * dx;
}
if (!interchange)
x += s1; // 当斜率 < 1 时,选取 x 为步长
else
y += s2; // 当斜率 > 1 时,选取 y 为步长
e += 2 * dy;
}
}
// Initialization function
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
}
// Display callback function
void display(void)
{
int i, x0, y0, x, y;
double a;
glClear(GL_COLOR_BUFFER_BIT);
x0 = width / 2;
y0 = height / 2;
glColor3f(1.0, 1.0, 1.0);
// Draw lines
for (i = -45; i <= 45; i += 15)
{
a = (