画线算法 中点画线 Bresenham DDA
#include<GL/glut.h>
#include<math.h>
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
void DDA(int x1, int y1, int x2, int y2)
{
int k, i;
float x, y, dx, dy;
if (abs(x2 - x1) < abs(y2 - y1))
k = abs(y2 - y1);
else k = abs(x2 - x1);
dx = float(x2 - x1) / k;
dy = float(y2 - y1) / k;
x = float(x1);
y = float(y1);
glColor3f(1.0f, 1.0f, 0.0f);
glPointSize(5);
for (i = 0; i < k; i++)
{
glBegin(GL_POINTS);
glVertex2i((int)(x + 0.5), (int)(y + 0.5));
glEnd();
x += dx;
y += dy;
}
}
void MidPointLine(int x1, int y1, int x2, int y2)
{
int a, b, dt1, dt2, d, x, y;
a = y1 - y2;
b = x2 - x1;
d = a + a + b;
dt1 = a + b + a + b;
dt2 = a + a;
x = x1;
y = y1;
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
while (x < x2)
{
if (d < 0)
{
x++;
y++;
d += dt1;
}
else
{
x++;
d += dt2;
}
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
}
void Bresenham(int x1, int y1, int x2, int y2)
{
int x, y, dx, dy, d, d1, d2, inc, temp;
dx = x2 - x1;
dy = y2 - y1;
if (dx * dy >= 0)
inc = 1;
else
inc = -1;
glColor3f(0.0f, 1.0f, 0.0f);
if (abs(dx) > abs(dy))
{
if (dx < 0)
{
temp = x1; x1 = x2; x2 = temp;
temp = y1; y1 = y2; y2 = temp;
dx = -dx; dy = -dy;
}
d = 2 * dy - dx;
d1 = 2 * dy;
d2 = 2 * (dy - dx);
x = x1;
y = y1;
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
while (x < x2)
{
x++;
if (d < 0)
d += d1;
else
{
y += inc;
d += d2;
}
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
}
else
{
if (dy < 0)
{
temp = x1; x1 = x2; x2 = temp;
temp = y1; y1 = y2; y2 = temp;
dx = -dx; dy = -dy;
}
d = 2 * dx - dy;
d1 = 2 * dx;
d2 = 2 * (dx - dy);
x = x1;
y = y1;
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
while (y < y2)
{
y++;
if (d < 0)
d += d1;
else
{
x += inc;
d += d2;
}
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
}
}
void myDisplay(void)
{
glShadeModel(GL_FLAT);
glClearColor(0, 1, 1, 0);
glClear(GL_COLOR_BUFFER_BIT);
DDA(300, 100, 0, 0);
MidPointLine(0, 0, 400, 200);
Bresenham(0, 0, 100, 300);
glFlush();
}
void Reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, w, 0.0, h);
}
int main(int argc, char * argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(300, 100);
glutInitWindowSize(450, 450);
glutCreateWindow("DRAWLINE in different ways");
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}
图形学实验2作业
#pragma comment (lib, "opengl32.lib")
#pragma comment (lib, "glu32.lib")
#pragma comment (lib, "glut32.lib")
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#define aa (y0 - y1)
#define bb (x1 - x0)
#define cc (x0 * y1 - x1 * y0)
using namespace std;
float root2 = sqrt(2);
float PI = acos(-1.0);
void MidpointLine1(int x0, int y0, int x1, int y1, float rc, float gc, float bc)
{
int d = aa + aa + bb;
int d1 = aa + aa;
int d2 = (aa + bb) + (aa + bb);
int x = x0, y = y0;
glColor3f(rc, gc, bc);
for (int i = x0; i <= x1; i++)
{
if (d > 0) d += d1;
else
{
y++;
d += d2;
}
x++;
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
}
void MidpointLine2(int x0, int y0, int x1, int y1, float rc, float gc, float bc)
{
int d = aa + 2 * bb;
int d1 = 2 * aa + 2 * bb;
int d2 = 2 * bb;
int x = x0, y = y0;
glColor3f(rc, gc, bc);
for (int i = y0; i <= y1; i++)
{
if (d > 0)
{
x++;
d += d1;
}
else d += d2;
y++;
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
}
void MidpointLine3(int x0, int y0, int x1, int y1, float rc, float gc, float bc)
{
int d = 2 * aa - bb;
int d1 = 2 * aa - 2 * bb;
int d2 = 2 * aa;
int x = x0, y = y0;
glColor3f(rc, gc, bc);
for (int i = x0; i <= x1; i++)
{
if (d > 0)
{
y--;
d += d1;
}
else d += d2;
x++;
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
}
void MidpointLine4(int x0, int y0, int x1, int y1, float rc, float gc, float bc)
{
int d = aa - 2 * bb;
int d1 = - 2 * bb;
int d2 = 2 * aa - 2 * bb;
int x = x0, y = y0;
glColor3f(rc, gc, bc);
for (int i = y0 - 1; i >= y1; i--)
{
if (d < 0)
{
x++;
d += d2;
}
else d += d1;
y--;
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
}
void MidpointLine(int x0, int y0, int x1, int y1, float rc, float gc, float bc)
{
float dx = x1 - x0, dy = y1 - y0;
float m = 0;
if (dx != 0) m = dy / dx;
else return;
if (m >= 0 && m <= 1) {
if (x0 > x1)
{
int t = x1; x1 = x0; x0 = t;
t = y1; y1 = y0; y0 = t;
}
MidpointLine1(x0, y0, x1, y1, rc, gc, bc);
}
else if (m > 1) {
if (x0 > x1)
{
int t = x1; x1 = x0; x0 = t;
t = y1; y1 = y0; y0 = t;
}
MidpointLine2(x0, y0, x1, y1, rc, gc, bc);
}
else if (m >= -1 && m <= 0) {
if (x0 > x1)
{
int t = x1; x1 = x0; x0 = t;
t = y1; y1 = y0; y0 = t;
}
MidpointLine3(x0, y0, x1, y1, rc, gc, bc);
}
else if (m < -1) {
if (x0 > x1)
{
int t = x1; x1 = x0; x0 = t;
t = y1; y1 = y0; y0 = t;
}
MidpointLine4(x0, y0, x1, y1, rc, gc, bc);
}
}
void MidCircle(int x0, int y0, int rc, float r, float g, float b)
{
glColor3f(r, g, b);
int h = 5 - 4 * rc;
int e = 12;
int se = 20 - 8 * rc;
int x = 0, y = rc;
for (int i = -1; i <= (int)(root2 * rc / 2); i++)
{
if (h > 0)
{
h += se;
e += 8;
se += 16;
y--;
}
else
{
h += e;
e += 8;
se += 8;
}
x++;
glBegin(GL_POINTS);
glVertex2i(x0 + x, y0 + y);
glVertex2i(x0 + x, y0 - y);
glVertex2i(x0 - x, y0 + y);
glVertex2i(x0 - x, y0 - y);
glVertex2i(x0 + y, y0 + x);
glVertex2i(x0 + y, y0 - x);
glVertex2i(x0 - y, y0 + x);
glVertex2i(x0 - y, y0 - x);
glEnd();
}
}
void PloyAppCircle(int x0, int y0, int R, int r, int g, int b, int theta, int err)
{
glColor3f(r, g, b);
glBegin(GL_LINE_LOOP);
double Alp = 2 * acos((R * 1.0 - err) / R);
double nn = ceil(2 * PI / Alp);
int n = (int)(nn);
double sAlp = sin(Alp);
double cAlp = cos(Alp);
double xx = R * cos(Alp / 2);
double yy = R * sin(Alp / 2);
glVertex2i((int)xx + x0, (int)yy + y0);
for(int i = 1; i < n; i++)
{
double x = cAlp * xx - sAlp * yy;
double y = sAlp * xx + cAlp * yy;
glVertex2i((int)x + x0, (int)y + y0);
xx = x; yy = y;
}
glEnd();
}
void DDA(int x1, int y1, int x2, int y2, float r, float g, float b)
{
int k, i;
float x, y, dx, dy;
if (abs(x2 - x1) < abs(y2 - y1))
k = abs(y2 - y1);
else k = abs(x2 - x1);
dx = float(x2 - x1) / k;
dy = float(y2 - y1) / k;
x = float(x1);
y = float(y1);
glColor3f(r, g, b);
for (i = 0; i < k; i++)
{
glBegin(GL_POINTS);
glVertex2i((int)(x + 0.5), (int)(y + 0.5));
glEnd();
x += dx;
y += dy;
}
}
void draw()
{
glClear(GL_COLOR_BUFFER_BIT);
float R = 100;
MidCircle(300, 300, R, 1, 0, 0);
PloyAppCircle(300, 300, R, 1, 0, 1, 30, 1);
DDA(40, 30, 120, 60, 1, 0, 0);
MidpointLine(30, 30, 110, 60, 1, 1, 0);
MidpointLine(30, 30, 110, 160, 1, 1, 0);
MidpointLine(30, 30, 110, -30, 1, 0, 0);
MidpointLine(30, 30, 110, -160, 1, 0, 1);
MidpointLine(210, 60, 130, 30, 1, 1, 0);
MidpointLine(210, 160, 130, 30, 1, 1, 0);
MidpointLine(210, -30, 130, 30, 1, 0, 0);
MidpointLine(210, -160, 130, 30, 1, 0, 1);
glColor3f(0, 1, 0);
glBegin(GL_LINES);
glVertex2i(220, 160);
glVertex2i(140, 30);
glEnd();
glFlush();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(300, 300);
glutInitWindowSize(500, 500);
glutCreateWindow("coder352");
gluOrtho2D(0, 500, 0, 500);
glutDisplayFunc(draw);
glutMainLoop();
return 0;
}