数值微分法划DDA

原算法在计算机图形学基础教程第二版p19

已知过端点P0(X0,Y0) P1(X1,Y1) 的直线L 直线斜率为k
	
过程
从X0开始 步长为1 根据Y=kX+b计算相应Y 取得整数Y为当前点坐标
因为每次X的步长为1 所以每次Y加了K 所以每次Y加K既可以 不需要做乘法

代码
#include <iostream>
#include <windows.h>


void DDA(int x1, int y1, int x2, int y2, COLORREF color)//画线算法
{

	float dx, dy, k;						
	dx = x2 - x1;						//计算dx
	dy = y2 - y1;						//dy
	k = dy / dx;						//求斜率
	if (k <= 1.0f)						//如果斜率大于1
	{	
		int x;				
		float y;
		y = y1;
		for (x = x1; x < x2; x++)		//从x开始画 每次x+1 y对应+k
		{
			SetPixel(GetWindowDC(GetDesktopWindow()), x, (int)(y + 0.5), color);
			y += k;
		}
	}
	else								//若k>1 则每次y都加了1以上的数  所以应该反过来算 从y0开始画 每次x+1/k
	{
		int y;
		float x;
		k = 1.0 / k;
		x = x1;
		for (y = y1; y < y2; y++)		//从y0开始 每次增1 x每次增1/k
		{
			SetPixel(GetWindowDC(GetDesktopWindow()), (int)(x + 0.5), y, color);
			x += k;
		}
	}
}

DWORD WINAPI Thd(LPVOID pa)				//为了验证而写的获取鼠标坐标的进程
{
	while (true)
	{
		POINT pt;
		GetCursorPos(&pt);
		std::cout << "x:" << pt.x << "y:" << pt.y << std::endl;
		Sleep(100);
	}

}

int main()
{
	CreateThread(NULL, NULL, Thd, NULL, NULL, NULL);		//获取鼠标坐标线程

	while (true)
	{
		Sleep(5000);										//画在屏幕上容易消失 则每5秒画一次
		DDA(0, 0, 800, 1600, RGB(255, 0, 0));
	}
	return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值