版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40755094/article/details/84074134
1. DDA算法(数值微分法)原理:
1)网上或者计算机图形学书本上有详细介绍。
2)最核心的是选定(x2-x1)和(y2-y1)中较大者为步进方向。
2. 实现工具:
1) VS2017(C++)
2) 下载插件:Easyx 。使用方法和下载见官网: [https://www.easyx.cn/]
3. 源码展示:
#include<iostream>
#include<graphics.h>
#include<math.h>
#include<conio.h>
using namespace std;
void DDA(int x1, int y1, int x2, int y2) {
int i, steps, dx, dy;
int x0 = 400, y0 = 300;
float x, y, delta_x, delta_y;
dx = x2 - x1;
dy = y2 - y1;
if (abs(dx) >= abs(dy))
steps = abs(dx);
else
steps = abs(dy);
delta_x = float(1.0*dx / steps); //让结果为浮点数
delta_y = float(1.0*dy / steps);
x = x1;
y = y1;
putpixel((x + x0), (y0 - y), RED); //画第一个点
//cout << "("<<x << ","<<y <<")"<< endl; //输出第一个点的文本信息
Sleep(50);
for (i = 1; i <= steps; i ++) {
x = x + delta_x;
y = y + delta_y;
putpixel((x + x0), (y0 - int(y + 0.5)), RED);
//cout <<"(" << x << ","<<int(y + 0.5) <<")"<< endl;//可以选择输出点来验证结果
Sleep(50); //两个点间隔50毫秒
}
}
int main() {
int x1,x2,y1,y2;
int x0=400, y0=300; //坐标轴中心(x0,y0)
cout << "请输入两个整数点的坐标(x1,y1),(x2,y2)" << endl;
cin >> x1 >> y1 >> x2 >> y2;
initgraph(x0*2,y0*2); //初始化图形窗口大小
line(0,y0,x0*2,y0); //坐标轴X
line(x0,0,x0,y0*2); //坐标轴Y
DDA(x1,y1,x2,y2); //DDA画线算法
_getch(); //等待一个任意输入结束
closegraph(); //关闭图形窗口
return 0;
}
4. 结果展示:
1)输出点坐标验证DDA算法:键盘输入13 20 -10 5(把相关图形窗口的代码注释掉然后加上输出点的代码即可)
上课时老师给的DDA练习:
程序输出截图:
2)图形化展示:(键盘输入0 0 400 300)
5. 个人感悟:
1)DDA算法上课的时候理解了,写程序还是会有很多不容易发现的错误例如小数与整数之间转换,困扰了很久。
2)刚开始下载VS的时候,运行hello world需要一分钟,系统显示一直在加载各种各样的符号。
解决办法:VS菜单栏 工具>选项> 调试>符号>取消Microsoft符号服务器
3)画图环境弄了一晚上,水平太菜,DDA算法又是一晚上,效率不行。
4)第一次写博客,代码和排版有限,请大家多多指教。