原算法在计算机图形学基础教程第二版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;
}