完善实验一
This commit is contained in:
+43
-45
@@ -1,54 +1,52 @@
|
||||
#include<GL/glut.h>
|
||||
using namespace std;
|
||||
#include<GL/glut.h> // 引入 GLUT/OpenGL 头文件,提供窗口和绘图函数。
|
||||
using namespace std; // 使用标准命名空间,方便后续直接使用标准库名称。
|
||||
|
||||
// 回调函数
|
||||
void myDisplay()
|
||||
// 回调函数:GLUT 在需要重绘窗口时会调用它。
|
||||
void myDisplay() // 定义绘制窗口内容的函数。
|
||||
{
|
||||
// 清除缓冲区
|
||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
// 正交模式
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
gluOrtho2D(0.0, 500.0, 0.0, 500.0);
|
||||
glColor4f(0.0, 1.0, 0.0, 0.0);
|
||||
glRectf(50.0, 50.0, 400.0, 400.0);
|
||||
// 清除缓冲区前先设置清屏颜色。
|
||||
glClearColor(0.0, 0.0, 0.0, 0.0); // 设置背景清除颜色为黑色。
|
||||
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区,刷新画布背景。
|
||||
// 设置二维正交投影模式。
|
||||
glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式。
|
||||
gluOrtho2D(0.0, 500.0, 0.0, 500.0); // 设置二维坐标范围为 x:[0,500], y:[0,500]。
|
||||
glColor4f(0.0, 1.0, 0.0, 0.0); // 设置当前绘图颜色为绿色。
|
||||
glRectf(50.0, 50.0, 400.0, 400.0); // 绘制一个左下角为(50,50)、右上角为(400,400)的矩形。
|
||||
|
||||
// 划线
|
||||
glColor3f(1.0, 1.0, 0.0);
|
||||
glBegin(GL_LINES);
|
||||
glVertex2f(50.0, 50.0);
|
||||
glVertex2f(400.0, 400.0);
|
||||
glVertex2f(400.0, 50.0);
|
||||
glVertex2f(50.0, 400.0);
|
||||
glEnd();
|
||||
// 绘制线段。
|
||||
glColor3f(1.0, 1.0, 0.0); // 设置当前绘图颜色为黄色。
|
||||
glBegin(GL_LINES); // 开始按线段方式提交顶点。
|
||||
glVertex2f(50.0, 50.0); // 指定第一条线段的起点。
|
||||
glVertex2f(400.0, 400.0); // 指定第一条线段的终点。
|
||||
glVertex2f(400.0, 50.0); // 指定第二条线段的起点。
|
||||
glVertex2f(50.0, 400.0); // 指定第二条线段的终点。
|
||||
glEnd(); // 结束线段顶点提交。
|
||||
|
||||
// 画点
|
||||
glColor3f(1.0, 0.0, 0.0);
|
||||
glPointSize(20.0);
|
||||
glBegin(GL_POINTS);
|
||||
glVertex2f(15.0, 15.0);
|
||||
glEnd();
|
||||
// 绘制点。
|
||||
glColor3f(1.0, 0.0, 0.0); // 设置当前绘图颜色为红色。
|
||||
glPointSize(20.0); // 设置点的显示大小为 20 像素。
|
||||
glBegin(GL_POINTS); // 开始按点方式提交顶点。
|
||||
glVertex2f(15.0, 15.0); // 在坐标(15,15)处绘制一个点。
|
||||
glEnd(); // 结束点顶点提交。
|
||||
|
||||
// 画三角形
|
||||
glBegin(GL_TRIANGLES);
|
||||
glColor3f(0.0, 0.0, 1.0);
|
||||
glVertex2i(200, 300);
|
||||
glVertex2i(100, 100);
|
||||
glVertex2i(300, 100);
|
||||
glEnd();
|
||||
// 绘制三角形。
|
||||
glBegin(GL_TRIANGLES); // 开始按三角形方式提交顶点。
|
||||
glColor3f(0.0, 0.0, 1.0); // 设置当前绘图颜色为蓝色。
|
||||
glVertex2i(200, 300); // 指定三角形第一个顶点。
|
||||
glVertex2i(100, 100); // 指定三角形第二个顶点。
|
||||
glVertex2i(300, 100); // 指定三角形第三个顶点。
|
||||
glEnd(); // 结束三角形顶点提交。
|
||||
|
||||
|
||||
glFlush();
|
||||
|
||||
}
|
||||
glFlush(); // 强制执行所有尚未执行的 OpenGL 绘图命令。
|
||||
}
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
glutInit(&argc, argv);
|
||||
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
|
||||
glutInitWindowPosition(100, 100);
|
||||
glutInitWindowSize(500, 500);
|
||||
glutCreateWindow("The First OpenGL Program");
|
||||
glutDisplayFunc(&myDisplay);
|
||||
glutMainLoop();
|
||||
return 0;
|
||||
glutInit(&argc, argv); // 初始化 GLUT 库。
|
||||
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); // 设置显示模式为 RGB 颜色和单缓冲。
|
||||
glutInitWindowPosition(100, 100); // 设置窗口左上角初始位置。
|
||||
glutInitWindowSize(500, 500); // 设置窗口初始大小为 500x500。
|
||||
glutCreateWindow("实验1_03毕爽爽的第一个OpenGL程序"); // 创建标题为指定字符串的窗口。
|
||||
glutDisplayFunc(&myDisplay); // 注册显示回调函数。
|
||||
glutMainLoop(); // 进入 GLUT 事件循环。
|
||||
return 0;
|
||||
}
|
||||
BIN
Binary file not shown.
+61
-61
@@ -1,80 +1,80 @@
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
#include <GL/glut.h>
|
||||
#include <cmath> // 引入数学函数库,用于 abs 和 round 等函数。
|
||||
#include <iostream> // 引入输入输出流库,用于打印坐标。
|
||||
#include <GL/glut.h> // 引入 GLUT/OpenGL 头文件,提供窗口和绘图函数。
|
||||
|
||||
// 窗口宽度和高度
|
||||
const int WIDTH = 640;
|
||||
const int HEIGHT = 480;
|
||||
// 窗口宽度和高度。
|
||||
const int WIDTH = 640; // 定义窗口宽度为 640 像素。
|
||||
const int HEIGHT = 480; // 定义窗口高度为 480 像素。
|
||||
|
||||
void drawDDALine(int x1, int y1, int x2, int y2) {
|
||||
float x = x1;
|
||||
float y = y1;
|
||||
void drawDDALine(int x1, int y1, int x2, int y2) { // 定义 DDA 直线绘制函数,参数为线段两个端点。
|
||||
float x = x1; // 用浮点变量保存当前点的 x 坐标。
|
||||
float y = y1; // 用浮点变量保存当前点的 y 坐标。
|
||||
|
||||
// 计算差值
|
||||
int dx = x2 - x1;
|
||||
int dy = y2 - y1;
|
||||
// 计算差值。
|
||||
int dx = x2 - x1; // 计算终点与起点的 x 方向差值。
|
||||
int dy = y2 - y1; // 计算终点与起点的 y 方向差值。
|
||||
|
||||
// 确定步数,取 dx 和 dy 中绝对值较大的那个
|
||||
int steps = std::abs(dx) > std::abs(dy) ? std::abs(dx) : std::abs(dy); //三元表达式
|
||||
// 确定步数,取 dx 和 dy 中绝对值较大的那个。
|
||||
int steps = std::abs(dx) > std::abs(dy) ? std::abs(dx) : std::abs(dy); // 三元表达式用于选择较大的绝对差值作为步数。
|
||||
|
||||
// 计算每一步的增量
|
||||
float xIncrement = (float)dx / steps;
|
||||
float yIncrement = (float)dy / steps;
|
||||
// 计算每一步的增量。
|
||||
float xIncrement = (float)dx / steps; // 计算每一步 x 坐标增加的值。
|
||||
float yIncrement = (float)dy / steps; // 计算每一步 y 坐标增加的值。
|
||||
|
||||
// 开始绘制点
|
||||
glBegin(GL_POINTS);
|
||||
glVertex2i((int)round(x), (int)round(y)); // 绘制起点
|
||||
// 开始绘制点。
|
||||
glBegin(GL_POINTS); // 开始按点方式提交顶点。
|
||||
glVertex2i((int)round(x), (int)round(y)); // 绘制起点,并将浮点坐标四舍五入为整数坐标。
|
||||
|
||||
for (int k = 0; k < steps; k++) {
|
||||
x += xIncrement;
|
||||
y += yIncrement;
|
||||
// 将浮点坐标四舍五入取整转换为整数像素坐标
|
||||
std::cout << (int)round(x) << ", " << (int)round(y)<<"\n";
|
||||
glVertex2i((int)round(x), (int)round(y));
|
||||
}
|
||||
glEnd();
|
||||
for (int k = 0; k < steps; k++) { // 循环 steps 次,逐步生成直线上的像素点。
|
||||
x += xIncrement; // 更新当前点的 x 坐标。
|
||||
y += yIncrement; // 更新当前点的 y 坐标。
|
||||
// 将浮点坐标四舍五入取整转换为整数像素坐标。
|
||||
std::cout << (int)round(x) << ", " << (int)round(y)<<"\n"; // 在控制台输出当前绘制点的整数坐标。
|
||||
glVertex2i((int)round(x), (int)round(y)); // 将当前点作为 OpenGL 点顶点提交。
|
||||
}
|
||||
glEnd(); // 结束点顶点提交。
|
||||
}
|
||||
|
||||
// 显示回调函数
|
||||
void display() {
|
||||
drawDDALine(0, 0, 50, 20);
|
||||
glFlush();
|
||||
}
|
||||
// 显示回调函数。
|
||||
void display() { // 定义窗口重绘时调用的显示函数。
|
||||
drawDDALine(0, 0, 50, 20); // 调用 DDA 算法绘制从(0,0)到(50,20)的直线。
|
||||
glFlush(); // 强制执行所有尚未执行的 OpenGL 绘图命令。
|
||||
}
|
||||
|
||||
// 初始化 OpenGL 设置
|
||||
// 初始化 OpenGL 设置。
|
||||
void init() {
|
||||
// 设置背景颜色为白色
|
||||
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
// 设置背景颜色为白色。
|
||||
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 设置清屏颜色为白色且完全不透明。
|
||||
// 空行:分隔背景设置和投影设置。
|
||||
// 设置投影矩阵为 2D 正交投影。
|
||||
glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式。
|
||||
glLoadIdentity(); // 将当前投影矩阵重置为单位矩阵。
|
||||
// 定义可视区域,左下角(0,0),右上角(WIDTH, HEIGHT)。
|
||||
gluOrtho2D(0.0, WIDTH, 0.0, HEIGHT); // 设置二维正交投影坐标范围。
|
||||
}
|
||||
|
||||
// 设置投影矩阵为 2D 正交投影
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
// 定义可视区域,左下角(0,0),右上角(WIDTH, HEIGHT)
|
||||
gluOrtho2D(0.0, WIDTH, 0.0, HEIGHT);
|
||||
}
|
||||
int main(int argc, char** argv) { // 程序入口函数,接收命令行参数。
|
||||
// 初始化 GLUT。
|
||||
glutInit(&argc, argv); // 初始化 GLUT 库。
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
// 初始化 GLUT
|
||||
glutInit(&argc, argv);
|
||||
// 设置显示模式:单缓冲、RGB 颜色模式。
|
||||
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置单缓冲和 RGB 颜色模式。
|
||||
|
||||
// 设置显示模式:单缓冲、RGB 颜色模式
|
||||
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
|
||||
// 设置窗口大小和位置。
|
||||
glutInitWindowSize(WIDTH, HEIGHT); // 设置窗口大小为 WIDTH x HEIGHT。
|
||||
glutInitWindowPosition(100, 100); // 设置窗口初始显示位置。
|
||||
|
||||
// 设置窗口大小和位置
|
||||
glutInitWindowSize(WIDTH, HEIGHT);
|
||||
glutInitWindowPosition(100, 100);
|
||||
// 创建窗口。
|
||||
glutCreateWindow("DDA算法"); // 创建标题为“DDA算法”的窗口。
|
||||
|
||||
// 创建窗口
|
||||
glutCreateWindow("DDA算法");
|
||||
// 注册回调函数。
|
||||
glutDisplayFunc(display); // 注册显示回调函数。
|
||||
|
||||
// 注册回调函数
|
||||
glutDisplayFunc(display);
|
||||
// 初始化设置。
|
||||
init(); // 执行 OpenGL 初始化设置。
|
||||
|
||||
// 初始化设置
|
||||
init();
|
||||
// 进入主循环。
|
||||
glutMainLoop(); // 进入 GLUT 事件循环,等待并处理窗口事件。
|
||||
|
||||
// 进入主循环
|
||||
glutMainLoop();
|
||||
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+69
-77
@@ -1,86 +1,78 @@
|
||||
#include <GL/glut.h> // 引入 GLUT 库,用于创建窗口和处理事件
|
||||
#include <iostream>
|
||||
#include <GL/glut.h> // 引入 GLUT/OpenGL 头文件,用于创建窗口和绘图。
|
||||
#include <iostream> // 引入输入输出流库,用于在控制台输出点坐标。
|
||||
#include <cstdlib> // 引入通用工具库,用于 abs 函数。
|
||||
|
||||
using namespace std;
|
||||
const int WIDTH = 640; // 定义窗口宽度。
|
||||
const int HEIGHT = 480; // 定义窗口高度。
|
||||
|
||||
// 辅助函数:根据八分对称性,绘制8个对称点
|
||||
void plotCirclePoints(int xc, int yc, int x, int y) {
|
||||
glBegin(GL_POINTS);
|
||||
// 第1象限
|
||||
glVertex2i(xc + x, yc + y);
|
||||
glVertex2i(xc + y, yc + x);
|
||||
// 第2象限
|
||||
glVertex2i(xc - y, yc + x);
|
||||
glVertex2i(xc - x, yc + y);
|
||||
// 第3象限
|
||||
glVertex2i(xc - x, yc - y);
|
||||
glVertex2i(xc - y, yc - x);
|
||||
// 第4象限
|
||||
glVertex2i(xc + y, yc - x);
|
||||
glVertex2i(xc + x, yc - y);
|
||||
glEnd();
|
||||
}
|
||||
void drawPoint(int x, int y) { // 定义绘制单个像素点的辅助函数。
|
||||
glVertex2i(x, y); // 向 OpenGL 提交一个二维整数坐标点。
|
||||
std::cout << x << ", " << y << std::endl; // 在控制台输出当前点坐标。
|
||||
} // 绘制点函数结束。
|
||||
|
||||
// 中点画圆算法主函数
|
||||
// 参数: (xc, yc) 为圆心坐标, r 为半径
|
||||
void midpointCircle(int xc, int yc, int r) {
|
||||
int x = 0;
|
||||
int y = r;
|
||||
// 初始决策参数 d = 3 - 2r
|
||||
int d = 3 - 2 * r;
|
||||
void drawMidpointLine(int x1, int y1, int x2, int y2) { // 定义中点画线算法函数。
|
||||
int dx = std::abs(x2 - x1); // 计算 x 方向距离的绝对值。
|
||||
int dy = std::abs(y2 - y1); // 计算 y 方向距离的绝对值。
|
||||
int sx = (x1 < x2) ? 1 : -1; // 判断 x 坐标每次应该增加还是减少。
|
||||
int sy = (y1 < y2) ? 1 : -1; // 判断 y 坐标每次应该增加还是减少。
|
||||
int x = x1; // 初始化当前点的 x 坐标。
|
||||
int y = y1; // 初始化当前点的 y 坐标。
|
||||
|
||||
// 绘制初始点
|
||||
plotCirclePoints(xc, yc, x, y);
|
||||
glBegin(GL_POINTS); // 开始按点方式绘制直线。
|
||||
drawPoint(x, y); // 绘制起点。
|
||||
|
||||
// 循环计算并绘制第一个八分之一圆弧,直到 x <= y
|
||||
while (x <= y) {
|
||||
x++;
|
||||
if (d < 0) {
|
||||
// 中点在圆内,选择正右方的点 (x+1, y)
|
||||
d = d + 4 * x + 6;
|
||||
} else {
|
||||
// 中点在圆外或圆上,选择右下方的点 (x+1, y-1)
|
||||
d = d + 4 * (x - y) + 10;
|
||||
y--;
|
||||
}
|
||||
std::cout<< xc + x << ", " << yc + y << std::endl;
|
||||
// 绘制由当前(x, y)决定的8个对称点
|
||||
plotCirclePoints(xc, yc, x, y);
|
||||
}
|
||||
glFlush(); // 强制执行所有OpenGL命令
|
||||
}
|
||||
if (dx >= dy) { // 当直线斜率绝对值小于等于 1 时,以 x 为主方向递增。
|
||||
int d = 2 * dy - dx; // 初始化中点判别式。
|
||||
while (x != x2) { // 当 x 坐标尚未到达终点时继续循环。
|
||||
x += sx; // 沿 x 主方向前进一步。
|
||||
if (d > 0) { // 如果中点位置对应需要选择斜向像素。
|
||||
y += sy; // y 方向也前进一步。
|
||||
d += 2 * (dy - dx); // 更新选择斜向像素后的判别式。
|
||||
} else { // 如果中点位置对应选择水平方向像素。
|
||||
d += 2 * dy; // 更新选择水平像素后的判别式。
|
||||
} // 判别式判断结束。
|
||||
drawPoint(x, y); // 绘制当前计算出的像素点。
|
||||
} // x 主方向循环结束。
|
||||
} else { // 当直线斜率绝对值大于 1 时,以 y 为主方向递增。
|
||||
int d = 2 * dx - dy; // 初始化中点判别式。
|
||||
while (y != y2) { // 当 y 坐标尚未到达终点时继续循环。
|
||||
y += sy; // 沿 y 主方向前进一步。
|
||||
if (d > 0) { // 如果中点位置对应需要选择斜向像素。
|
||||
x += sx; // x 方向也前进一步。
|
||||
d += 2 * (dx - dy); // 更新选择斜向像素后的判别式。
|
||||
} else { // 如果中点位置对应选择竖直方向像素。
|
||||
d += 2 * dx; // 更新选择竖直像素后的判别式。
|
||||
} // 判别式判断结束。
|
||||
drawPoint(x, y); // 绘制当前计算出的像素点。
|
||||
} // y 主方向循环结束。
|
||||
} // 斜率情况判断结束。
|
||||
|
||||
// --- OpenGL 设置与回调函数 ---
|
||||
glEnd(); // 结束点绘制。
|
||||
} // 中点画线算法函数结束。
|
||||
|
||||
// 显示回调函数
|
||||
void display() {
|
||||
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区
|
||||
void display() { // 定义显示回调函数。
|
||||
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区。
|
||||
glColor3f(1.0f, 0.0f, 0.0f); // 设置绘图颜色为红色。
|
||||
glPointSize(3.0f); // 设置点的大小。
|
||||
drawMidpointLine(50, 50, 500, 300); // 调用中点画线算法绘制一条直线。
|
||||
glFlush(); // 强制执行所有 OpenGL 绘图命令。
|
||||
} // 显示函数结束。
|
||||
|
||||
glColor3f(1.0, 0.0, 0.0); // 设置绘制颜色为红色
|
||||
glPointSize(2.0f); // 设置点的大小
|
||||
void init() { // 定义 OpenGL 初始化函数。
|
||||
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 设置背景颜色为白色。
|
||||
glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式。
|
||||
glLoadIdentity(); // 将当前投影矩阵重置为单位矩阵。
|
||||
gluOrtho2D(0.0, WIDTH, 0.0, HEIGHT); // 设置二维正交投影范围。
|
||||
} // 初始化函数结束。
|
||||
|
||||
// 调用中点画圆算法
|
||||
midpointCircle(50, 50, 30);
|
||||
}
|
||||
|
||||
// 初始化函数
|
||||
void init() {
|
||||
glClearColor(0.0, 0.0, 0.0, 1.0); // 设置背景颜色为黑色
|
||||
glMatrixMode(GL_PROJECTION); // 设置投影矩阵
|
||||
gluOrtho2D(0.0, 500.0, 0.0, 500.0); // 定义二维正交投影,窗口坐标范围 (0,0) 到 (500,500)
|
||||
}
|
||||
|
||||
// --- 主函数 ---
|
||||
int main(int argc, char** argv) {
|
||||
glutInit(&argc, argv); // 初始化 GLUT
|
||||
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 使用单缓冲和RGB颜色模型
|
||||
glutInitWindowSize(500, 500); // 设置窗口大小
|
||||
glutInitWindowPosition(100, 100); // 设置窗口位置
|
||||
glutCreateWindow("Midpoint Circle Algorithm"); // 创建窗口并设置标题
|
||||
|
||||
init(); // 调用初始化函数
|
||||
glutDisplayFunc(display); // 注册显示回调函数
|
||||
glutMainLoop(); // 进入 GLUT 事件处理主循环
|
||||
|
||||
return 0;
|
||||
}
|
||||
int main(int argc, char** argv) { // 程序入口函数。
|
||||
glutInit(&argc, argv); // 初始化 GLUT。
|
||||
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式为单缓冲和 RGB。
|
||||
glutInitWindowSize(WIDTH, HEIGHT); // 设置窗口大小。
|
||||
glutInitWindowPosition(100, 100); // 设置窗口初始位置。
|
||||
glutCreateWindow("中点画线算法"); // 创建窗口并设置标题。
|
||||
init(); // 调用初始化函数。
|
||||
glutDisplayFunc(display); // 注册显示回调函数。
|
||||
glutMainLoop(); // 进入 GLUT 事件循环。
|
||||
return 0; // 程序正常结束。
|
||||
} // 主函数结束。
|
||||
BIN
Binary file not shown.
+67
@@ -0,0 +1,67 @@
|
||||
#include <GL/glut.h> // 引入 GLUT/OpenGL 头文件,用于创建窗口和绘图。
|
||||
#include <iostream> // 引入输入输出流库,用于在控制台输出点坐标。
|
||||
#include <cstdlib> // 引入通用工具库,用于 abs 函数。
|
||||
|
||||
const int WIDTH = 640; // 定义窗口宽度。
|
||||
const int HEIGHT = 480; // 定义窗口高度。
|
||||
|
||||
void drawPoint(int x, int y) { // 定义绘制单个像素点的辅助函数。
|
||||
glVertex2i(x, y); // 向 OpenGL 提交一个二维整数坐标点。
|
||||
std::cout << x << ", " << y << std::endl; // 在控制台输出当前点坐标。
|
||||
} // 绘制点函数结束。
|
||||
|
||||
void drawBresenhamLine(int x1, int y1, int x2, int y2) { // 定义 Bresenham 直线算法函数。
|
||||
int dx = std::abs(x2 - x1); // 计算 x 方向距离的绝对值。
|
||||
int dy = std::abs(y2 - y1); // 计算 y 方向距离的绝对值。
|
||||
int sx = (x1 < x2) ? 1 : -1; // 判断 x 坐标每一步应该增加还是减少。
|
||||
int sy = (y1 < y2) ? 1 : -1; // 判断 y 坐标每一步应该增加还是减少。
|
||||
int err = dx - dy; // 初始化误差项。
|
||||
int x = x1; // 初始化当前点的 x 坐标。
|
||||
int y = y1; // 初始化当前点的 y 坐标。
|
||||
|
||||
glBegin(GL_POINTS); // 开始按点方式绘制直线。
|
||||
while (true) { // 不断生成直线上的像素点,直到到达终点。
|
||||
drawPoint(x, y); // 绘制当前点。
|
||||
if (x == x2 && y == y2) { // 判断当前点是否已经到达终点。
|
||||
break; // 到达终点后结束循环。
|
||||
} // 终点判断结束。
|
||||
|
||||
int e2 = 2 * err; // 将误差项扩大 2 倍,便于和 dx、dy 比较。
|
||||
if (e2 > -dy) { // 如果误差允许在 x 方向前进一步。
|
||||
err -= dy; // 更新 x 方向移动后的误差项。
|
||||
x += sx; // x 坐标向终点方向移动一步。
|
||||
} // x 方向判断结束。
|
||||
if (e2 < dx) { // 如果误差允许在 y 方向前进一步。
|
||||
err += dx; // 更新 y 方向移动后的误差项。
|
||||
y += sy; // y 坐标向终点方向移动一步。
|
||||
} // y 方向判断结束。
|
||||
} // 像素点生成循环结束。
|
||||
glEnd(); // 结束点绘制。
|
||||
} // Bresenham 直线算法函数结束。
|
||||
|
||||
void display() { // 定义显示回调函数。
|
||||
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区。
|
||||
glColor3f(0.0f, 0.0f, 1.0f); // 设置绘图颜色为蓝色。
|
||||
glPointSize(3.0f); // 设置点的大小。
|
||||
drawBresenhamLine(50, 50, 500, 300); // 调用 Bresenham 算法绘制一条直线。
|
||||
glFlush(); // 强制执行所有 OpenGL 绘图命令。
|
||||
} // 显示函数结束。
|
||||
|
||||
void init() { // 定义 OpenGL 初始化函数。
|
||||
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 设置背景颜色为白色。
|
||||
glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式。
|
||||
glLoadIdentity(); // 将当前投影矩阵重置为单位矩阵。
|
||||
gluOrtho2D(0.0, WIDTH, 0.0, HEIGHT); // 设置二维正交投影范围。
|
||||
} // 初始化函数结束。
|
||||
|
||||
int main(int argc, char** argv) { // 程序入口函数。
|
||||
glutInit(&argc, argv); // 初始化 GLUT。
|
||||
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式为单缓冲和 RGB。
|
||||
glutInitWindowSize(WIDTH, HEIGHT); // 设置窗口大小。
|
||||
glutInitWindowPosition(100, 100); // 设置窗口初始位置。
|
||||
glutCreateWindow("Bresenham"); // 创建窗口并设置标题。
|
||||
init(); // 调用初始化函数。
|
||||
glutDisplayFunc(display); // 注册显示回调函数。
|
||||
glutMainLoop(); // 进入 GLUT 事件循环。
|
||||
return 0; // 程序正常结束。
|
||||
} // 主函数结束。
|
||||
BIN
Binary file not shown.
+84
@@ -0,0 +1,84 @@
|
||||
#include <GL/glut.h> // 引入 GLUT/OpenGL 头文件,提供窗口和绘图函数。
|
||||
#include <iostream> // 引入输入输出流库,用于输出圆上点坐标。
|
||||
|
||||
using namespace std; // 使用标准命名空间,方便直接使用标准库名称。
|
||||
|
||||
// 辅助函数:根据圆的八分对称性绘制 8 个对称点。
|
||||
void plotCirclePoints(int xc, int yc, int x, int y) { // 定义绘制圆对称点的函数。
|
||||
glBegin(GL_POINTS); // 开始按点方式提交顶点。
|
||||
// 第一象限相关对称点。
|
||||
glVertex2i(xc + x, yc + y); // 绘制相对圆心偏移为(+x,+y)的点。
|
||||
glVertex2i(xc + y, yc + x); // 绘制相对圆心偏移为(+y,+x)的点。
|
||||
// 第二象限相关对称点。
|
||||
glVertex2i(xc - y, yc + x); // 绘制相对圆心偏移为(-y,+x)的点。
|
||||
glVertex2i(xc - x, yc + y); // 绘制相对圆心偏移为(-x,+y)的点。
|
||||
// 第三象限相关对称点。
|
||||
glVertex2i(xc - x, yc - y); // 绘制相对圆心偏移为(-x,-y)的点。
|
||||
glVertex2i(xc - y, yc - x); // 绘制相对圆心偏移为(-y,-x)的点。
|
||||
// 第四象限相关对称点。
|
||||
glVertex2i(xc + y, yc - x); // 绘制相对圆心偏移为(+y,-x)的点。
|
||||
glVertex2i(xc + x, yc - y); // 绘制相对圆心偏移为(+x,-y)的点。
|
||||
glEnd(); // 结束点顶点提交。
|
||||
} // 对称点绘制函数结束。
|
||||
|
||||
// 中点画圆算法主函数。
|
||||
// 参数:(xc, yc) 为圆心坐标,r 为半径。
|
||||
void midpointCircle(int xc, int yc, int r) { // 定义中点画圆算法函数。
|
||||
int x = 0; // 初始化当前点的 x 坐标为 0。
|
||||
int y = r; // 初始化当前点的 y 坐标为半径。
|
||||
// 初始决策参数 d = 3 - 2r。
|
||||
int d = 3 - 2 * r; // 根据中点画圆算法计算初始判别式。
|
||||
|
||||
// 绘制初始点。
|
||||
plotCirclePoints(xc, yc, x, y); // 利用八分对称绘制初始的 8 个点。
|
||||
|
||||
// 循环计算并绘制第一个八分之一圆弧,直到 x <= y 不再成立。
|
||||
while (x <= y) { // 当 x 未超过 y 时继续生成圆弧点。
|
||||
x++; // x 坐标向右移动一步。
|
||||
if (d < 0) { // 判断中点在圆内时的情况。
|
||||
// 中点在圆内,选择正右方的点 (x+1, y)。
|
||||
d = d + 4 * x + 6; // 按中点画圆递推公式更新判别式。
|
||||
} else { // 处理中点在圆外或圆上的情况。
|
||||
// 中点在圆外或圆上,选择右下方的点 (x+1, y-1)。
|
||||
d = d + 4 * (x - y) + 10; // 按右下方向选择时的递推公式更新判别式。
|
||||
y--; // y 坐标向下移动一步。
|
||||
}
|
||||
std::cout<< xc + x << ", " << yc + y << std::endl; // 输出当前计算得到的圆弧点坐标。
|
||||
// 绘制由当前 (x, y) 决定的 8 个对称点。
|
||||
plotCirclePoints(xc, yc, x, y); // 利用八分对称绘制当前点对应的所有对称点。
|
||||
}
|
||||
glFlush(); // 强制执行所有尚未执行的 OpenGL 绘图命令。
|
||||
}
|
||||
|
||||
// 显示回调函数。
|
||||
void display() { // 定义窗口重绘时调用的显示函数。
|
||||
glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区。
|
||||
|
||||
glColor3f(1.0, 0.0, 0.0); // 设置绘制颜色为红色。
|
||||
glPointSize(2.0f); // 设置绘制点的大小。
|
||||
|
||||
// 调用中点画圆算法。
|
||||
midpointCircle(0, 0, 30); // 以(0,0)为圆心、30为半径绘制圆。
|
||||
}
|
||||
|
||||
// 初始化函数。
|
||||
void init() { // 定义 OpenGL 初始化函数。
|
||||
glClearColor(0.0, 0.0, 0.0, 1.0); // 设置背景颜色为黑色。
|
||||
glMatrixMode(GL_PROJECTION); // 切换到投影矩阵模式。
|
||||
gluOrtho2D(-250.0, 250.0, -250.0, 250.0); // 定义二维正交投影坐标范围为(-250,-250)到(250,250)。
|
||||
} // 初始化函数结束。
|
||||
|
||||
|
||||
int main(int argc, char** argv) { // 程序入口函数,接收命令行参数。
|
||||
glutInit(&argc, argv); // 初始化 GLUT。
|
||||
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 使用单缓冲和 RGB 颜色模式。
|
||||
glutInitWindowSize(500, 500); // 设置窗口大小为 500x500。
|
||||
glutInitWindowPosition(100, 100); // 设置窗口初始位置。
|
||||
glutCreateWindow("中点画圆算法"); // 创建窗口并设置标题。
|
||||
|
||||
init(); // 调用初始化函数。
|
||||
glutDisplayFunc(display); // 注册显示回调函数。
|
||||
glutMainLoop(); // 进入 GLUT 事件处理主循环。
|
||||
|
||||
return 0;
|
||||
}
|
||||
BIN
Binary file not shown.
Reference in New Issue
Block a user