中点画线#
#include <GL/glut.h>
#include<math.h>
#include<iostream>
using namespace std;
void Midpoint(float x0, float y0, float x1, float y1)
{
int flag = 0;
float a, b, d, x, y;
if (abs(x1 - x0) < abs(y1 - y0)) {
swap(x0, y0);
swap(x1, y1);
flag = 1;
}
if (x0 > x1) {
swap(x0, x1);
swap(y0, y1);
}
glClear(GL_COLOR_BUFFER_BIT);
a = y0 - y1;
b = x1 - x0;
d = 2 * a + b;
if (y0 < y1) {
x = x0;
y = y0;
glBegin(GL_POINTS);
GLfloat n = x1 - x;
GLfloat cnt = 0;
GLfloat colorChange = cnt / n;
glColor3f(1.0, 0, 0);
glVertex2f(x0 / 1000, y0 / 1000);
glEnd();
while (x < x1) {
x++;
cnt++;
colorChange = cnt / n;
if (d < 0) {
y++;
d += 2 * (a + b);
}
else {
d += 2 * a;
}
if (flag == 1) {
glBegin(GL_POINTS);
glColor3f(1.0* colorChange, 0, 0);
glVertex2f(y / 1000, x / 1000);
glEnd();
}
else {
glBegin(GL_POINTS);
glColor3f(1.0 * colorChange, 0, 0);
glVertex2f(x / 1000, y / 1000);
glEnd();
}
}
glFlush();
}
else {
x = x1;
y = y1;
GLfloat n = x-x0;
GLfloat cnt = 0;
GLfloat colorChange = cnt / n;
glBegin(GL_POINTS);
glColor3f(1.0 * colorChange, 0, 0);
glVertex2f(x0 / 1000, y0 / 1000);
glEnd();
while (x > x0) {
x--;
cnt++;
colorChange = cnt / n;
if (d < 0) {
y++;
d = d - 2 * a + 2 * b;
}
else {
d = d - 2 * a;
}
if (flag == 1) {
glBegin(GL_POINTS);
glColor3f(1.0 * colorChange, 0, 0);
glVertex2f(y / 1000, x / 1000);
glEnd();
}
else {
glBegin(GL_POINTS);
glColor3f(1.0 * colorChange, 0, 0);
glVertex2f(x / 1000, y / 1000);
glEnd();
}
}
glFlush();
}
}
void display(void) {
float x0, y0, x1, y1;
cout << "请输入起始点和终点坐标" << endl;
cin >> x0 >> y0 >> x1 >> y1;
Midpoint(x0, y0, x1, y1);
}
void main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(200, 200);
glutInitWindowSize(400, 400);
glutCreateWindow("Line");
glutDisplayFunc(display);
glutMainLoop();
}

DDA算法#
void DDA(float x0, float y0, float x1, float y1) {
float dm = 0;
if (abs(x1-x0) < abs(y1 - y0)) {
dm = abs(y1 - y0);
}
else dm = abs(x1 - x0);
float dx = (float)(x1 - x0) / dm;
float dy = (float ) (y1 - y0) / dm;
float x = x0, y = y0;
glPointSize(6.0f);
GLfloat precise = 0.25;
glBegin(GL_POINTS);
for (float i = 0; i < dm; i+=precise) {
glColor3f(i/dm, 0, 0);
x += dx * precise;
y += dy * precise;
glVertex2f(x , y );
}
glEnd();
}
添加一些细节结果如下#

Quote#
图形学---中点画线法---opengl中实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)