本博客基于課程"計算機圖形學",教材使用為計算機圖形學(第4版) [Computer Graphics with OpenGL, Fourth Edition],部分代碼模板便來自于此教材,并且有所改動,大部分內容來自本人實驗報告,有錯誤是難以避免的,若有表述錯誤或bug歡迎指出,
實驗思路
此代碼通過一些判斷將會出現的需要進行判斷的八種情況進行合并成兩種,大大減少了代碼量
實作代碼
核心代碼及關鍵步驟注釋
void MyLine(int xs, int ys, int xe, int ye) {//起點坐標為(xs,ys),終點坐標(xe,ye)
int dx = xe - xs, dy = ye - ys;//x和y方向上,起點終點的距離
int x = xs, y = ys, p = 0;//p就是教材上的重點,決策引數
int addX = dx < 0 ? -1 : 1;//對于x軸每次是增加單位長度還是減少單位長度進行判斷
int addY = dy < 0 ? -1 : 1;//同上條
dx = fabs(dx);//計算出x軸距離的絕對值,用于下面判斷斜率與1的大小關系
dy = fabs(dy);//同上一條
glBegin(GL_POINTS);
//不能單獨定義變數作為斜率
//例如: m=dy/dx;
//因為會出現dx==0的情況,這樣會出現例外
if (dx>dy) {
for (int i = 0; i < dx; i++) {
glVertex2i(x, y);//放置像素點
x += addX;
if (p < 0) {
p += 2 * dy;
} else {
y += addY;
p += 2 * dy - 2 * dx;//根據斜率情況計算決策引數
}
}
} else {
for (int i = 0; i < fabs(dy); i++) {
glVertex2i(x, y);
y += addY;
if (p < 0)
p += 2 * dx;
else {
x += addX;
p += 2 * dx - 2 * dy;
}
}
}
glEnd();
}
全部代碼
#include <GL/glut.h>
#include <cmath>
#include <windows.h>
const float PI = 3.14159;
int width, height;
// Bresenham line algorithm
void MyLine(int xs, int ys, int xe, int ye) {
int dx = xe - xs, dy = ye - ys;
int x = xs, y = ys, p = 0;
int addX = dx < 0 ? -1 : 1;
int addY = dy < 0 ? -1 : 1;
dx = fabs(dx);
dy = fabs(dy);
glBegin(GL_POINTS);
if (dx>dy) {
for (int i = 0; i < dx; i++) {
glVertex2i(x, y);
x += addX;
if (p < 0) {
p += 2 * dy;
} else {
y += addY;
p += 2 * dy - 2 * dx;
}
}
} else {
for (int i = 0; i < fabs(dy); i++) {
glVertex2i(x, y);
y += addY;
if (p < 0)
p += 2 * dx;
else {
x += addX;
p += 2 * dx - 2 * dy;
}
}
}
glEnd();
}
// 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 = 0; i < 360; i += 15) {
a = (double)i / 180.0 * PI;
x = 0.45 * width * cos(a);
y = 0.45 * height * sin(a);
if (i == 0 || i == 180)
y = 0;
if (i == 90 || i == 270)
x = 0;
MyLine(x0, y0, x0 + x, y0 + y);
}
glFlush();
}
// Reshape callback function
void reshape(int w, int h) {
// Record width and height of program window
width = w;
height = h;
// Set clipping window and viewport equal to
// view area of program window
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, w, 0.0, h);
}
// Keyboard callback function
void keyboard(unsigned char key, int x, int y) {
switch (key) {
case 27:
exit(0);
}
}
// Main program entrance
int main(int argc, char* argv[]) {
// Create window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(800, 800);
glutCreateWindow("Lines");
// Initialization
init();
// Define callback functions
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
// Main program loop. (Event loop)
glutMainLoop();
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/412951.html
標籤:其他
上一篇:影像處理技術(二)濾波去噪(上)
