计算机图形学实验(一)--直线DDA算法的实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 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)第一次写博客,代码和排版有限,请大家多多指教。

猜你喜欢

转载自blog.csdn.net/qq_40755094/article/details/84074134