#include <GL/glut.h>
#include <stdio.h>
#include <cstdlib>
#include <windows.h>
void dda_line(int x1, int y1, int x2, int y2) {
glPointSize(1.0);
glBegin(GL_POINTS);
glVertex2i(x1, y1);
glVertex2i(x2, y2);
// x,y的增量
int dx = x2 - x1;
int dy = y2 - y1;
double dert_x;
double dert_y;
double x, y;
int steps;
// 步长,看x和y哪个大
if (abs(dx) > abs(dy))
steps = abs(dx);
else
steps = abs(dy);
// 根据步长,算x和y的增量
dert_x = (GLdouble)dx / (GLdouble)steps;
dert_y = (GLdouble)dy / (GLdouble)steps;
x = x1;
y = y1;
for (int i = 1; i <= steps; i++) {
x += dert_x;
y += dert_y;
glVertex2f(x, y);
}
glEnd();
}
void bresenhamLine(int x1, int y1, int x2, int y2) {
glPointSize(1.0);
glBegin(GL_POINTS);
glVertex2i(x1, y1);
glVertex2i(x2, y2);
// 判断
int tmp;
int flag = 0; // slope
if (x1 > x2) {
tmp = x1; x1 = x2; x2 = tmp;
tmp = y1; y1 = y2; y2 = tmp;
}
if (y2 - y1 > x2 - x1) // slope > 1
{
tmp = y1; y1 = x1; x1 = tmp;
tmp = y2; y2 = x2; x2 = tmp;
flag = 1;
printf("slope > 1\n");
}
else if (y2 - y1 < 0) //-1 < slope < 0
{
if (y1 - y2 > x2 - x1) {
tmp = y1; y1 = y2; y2 = tmp;
tmp = y1; y1 = x1; x1 = tmp;
tmp = y2; y2 = x2; x2 = tmp;
flag = 3;
printf(" slope < -1 \n");
}
else {
tmp = y1; y1 = y2; y2 = tmp;
flag = 2;
printf("-1 < slope < 0 \n");
}
}
//printf("x1: %d\n", x1);
//printf("y1: %d\n", y1);
//printf("x2: %d\n", x2);
//printf("y2: %d\n", y2);
int y = y1;
int dX = x2 - x1;
int dY = y2 - y1;
int d = 2 * dY - dX; // 核心
int incrE = 2 * dY; // 东边走
int increNE = 2 * (dY - dX); // 东北走
for (int i = x1; i < x2; i++) {
if (d <= 0) {
d += incrE;
}
else {
d += increNE;
y += 1;
}
int d_x = i;
int d_y = y;
if (flag == 1)
{
d_x = y;
d_y = i;
}
else if (flag == 2)
{
d_y = y2 - y + y1;
d_x = i;
}
else if (flag == 3) {
d_y = i;
d_x = y2 - y + y1;
}
glVertex2i(d_x, d_y);
}
glEnd();
glFlush();
}
void myDisplay(void) {
int x0 = 250;
int y0 = 250;
int x1 = 500;
int y1 = 250;
while (true)
{
glClear(GL_COLOR_BUFFER_BIT);
bresenhamLine(x0, y0, x1, y1);
if (x1 > 250 && y1 <= 250) {
x1 -= 1;
y1 -= 1;
}
else if (x1 <= 250 && y1 < 250)
{
x1 -= 1;
y1 += 1;
}
else if (x1 < 250 && y1 >= 250)
{
x1 += 1;
y1 += 1;
}
else if (x1 >= 250 && y1 > 250)
{
x1 += 1;
y1 -= 1;
}
else
printf("error!!!, %d, %d", x1, y1);
Sleep(50);
glFlush();
}
glClear(GL_COLOR_BUFFER_BIT);
dda_line(x0, y0, x1, y1);
glFlush();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(500, 200);
glutInitWindowSize(500, 500);
glutCreateWindow("DDA");
gluOrtho2D(0.0, 500.0, 0.0, 500.0);
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
图形学四象限bre算法画直线
最新推荐文章于 2024-10-20 16:31:25 发布