数值微分法DDA画直线(C++实现)计算机图形学

//经过适配处理的数值微分算法,可以绘制斜率为零、斜率不存在、斜率绝对值大于一等情况下的直线,只需输入两个点的横纵坐标即可
void DDA(const unsigned& x1, const unsigned& y1, const unsigned& x2, const unsigned& y2)
{
	int dx(x2 - x1), dy(y2 - y1);//定义两个变量分别记录x和y的变化量
	enum MainDirection { x, y };//定义一个枚举变量记录直线的主要变化方向(x方向或者y方向)(此处使用枚举变量更能体现取值约束)
	MainDirection Direction;
	if (abs(dx) >= abs(dy))//通过x变化量的绝对值和y变化量的绝对值进行比较确定主要变化方向
		Direction = x;
	else Direction = y;

	//如果主要变化方向在x(y)上,但是两点的横(纵)坐标不满足递增排序,则递归调用自身
	//(该操作相当于交换两个点的坐标)
	if ((Direction == x && x1 > x2) || (Direction == y && y1 > y2))
	{
		DDA(x2, y2, x1, y1);
		return;
	}

	initgraph(800, 640);//首先初始化绘图窗口备用

	if (Direction == x)
	{
		double k = double(dy) / dx;//此处需要将dy转换成浮点型进行运算,否则得到的结果很可能是零(在此处出过错误,调试了很久)
		double y = y1;
		for (unsigned x = x1; x <= x2; ++x)
		{
			putpixel(x, int(y + 0.5), RED);
			y += k;
		}
		_getch();
		closegraph();
		return;
	}
	else if (Direction == y)
	{
		double k = double(dx) / dy;//与上面一种情况同理需要转换成浮点型
		double x = x1;
		for (unsigned y = y1; y <= y2; ++y)
		{
			putpixel(int(x + 0.5), y, RED);
			x += k;
		}
		_getch();
		closegraph();
		return;
	}
}

注:运行该函数需要使用头文件<graphics.h>和<conio.h>,其中第一个头文件非系统库,可以到网上免费下载。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值