DDA(数值微分法)绘制直线(C++,VS2019)

1、DDA(Digital Differential Analyzer)算法

DDA算法是计算机图形学中最简单的绘制直线算法。
已知直线段两个端点P0(x0,y0),P1(x1,y1)
则可求得直线的斜率:

  k = (y2 - y1) / (x2 - x1)

在k,b均求出的条件下,只要知道一个x值,我们就能计算出一个y值。

  y = kx + b

如果横坐标x每次增加1(我们称其为步进为1,即x = x +1),那么y的步进就为k+b。

  x = x + 1
  y = y + (k + b)

同样知道一个y值也能计算出x值,此时y的步进为1,x的步进为(1-b)/k。

   y = y + 1
   x = x +(1 - b) / k

根据计算出的x值和y值,向下取整,得到坐标(x’,y’),并在(x’,y’)处绘制直线段上的一点。

为进一步简化计算,通常可令b取0,将起点看作(0,0)。
设当前点的坐标为(xi ,yi),下一个像素点的坐标为(xi+1,yi+1)
则用DDA算法求解(xi+1,yi+1)的计算公式可以概括为:

xi+1 = xi + xStep (1)
yi+1 = yi + yStep (2)

我们一般通过计算 Δx 和 Δy 来确定xStep和yStep:

如果 Δx > Δy ,说明x轴的最大差值大于y轴的最大差值,x轴方向为步进的主方向,

xStep = 1,yStep = k;

如果 Δy> Δx,说明y轴的最大差值大于x轴的最大差值,y轴方向为步进的主方向,

yStep = 1,xStep = 1 / k。

根据这个公式,就能通过(xi,yi)迭代计算出(xi+1、yi+1),然后在坐标系中绘制计算出的(x,y)坐标点。

实现工具:
1) VS2019(C++)

新建项目:
在这里插入图片描述
2) 下载插件:Easyx 。使用方法和下载见官网: https://www.easyx.cn/
点击下载后安装在这里插入图片描述
在VC2019处点击安装

在这里插入图片描述
源代码如下:

#include <iostream>
#include <graphics.h>
#include <math.h>
#include <conio.h>
using namespace std;

void DDALine(int x1, int y1, int x2, int y2)
{
    
    
    int x0 = 400;
    int y0 = 300;                  //记录原点坐标
    int steps;                     //记录步长
    int dx, dy;                    //记录起点和终点的坐标差值
    float x, y;                    //记录即时坐标
    float delta_x, delta_y;        //记录划线过程中的坐标增量
    dx = x2 - x1;
    dy = y2 - y1;
    if (abs(dx) > abs(dy))         //比较横纵坐标增量的大小
        steps = dx;
    else
        steps = dy;                //确保每次的增量不超过一个单位长度
    x = x1;
    y = y1;                        //记录画线起点
    delta_x = float(dx) / steps;
    delta_y = float(dy) / steps;   //计算相邻两个点的增量
    putpixel(x, y, RED);
    for (int i = 0; i < steps; i++)
    {
    
    
        x = x + delta_x;
        y = y + delta_y;
        putpixel(x +int( x0 + 0.5), y0 - int(y + 0.5), RED);
    }
}

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
    DDALine(x1, y1, x2, y2);                               //DDA画线算法
    _getch();                                              //等待一个任意输入结束
    closegraph();                                          //关闭图形窗口
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_46659057/article/details/115360398