DDA(digital differential analyzer,数字微分分析法)是一种线段扫描转换算法。它的主要算法原理是:
在一个坐标轴上以单位间隔对线段取样,从而在另一坐标轴上确定最靠近线条路径的对应坐标值。
下面是DDA算法的C++代码(里面的Window、Application等对象,是我自己用OpenGL封装的类库,仅仅是为了简便与学习,可以直接使用OpenGL代替)
#include <iostream> #include <conio.h> using namespace std; #include "Application.h" int handle(const float a) { return int(a+0.5); } void drawPoint(Window& window, int x, int y){ Point *point = new Point(x, y,Color(255,255,255)); window.add((Object*)point); } /* window是用于绘图的窗口 (x0,y0)是起始坐标,(x1,y1)是终点坐标 */ void lineDDA(Window& window, int x0, int y0, int x1, int y1) { int dx = x1 - x0, dy = y1 - y0; //dx为两点横坐标之差,dy为两点纵坐标之差 float xIncrement, yIncrement; // float x = x0, y = y0; //将坐标的类型转换为浮点类型 int length = 0; //记录选定坐标轴对应边的长度(dx或dy) //判断斜率大小 if (fabs(float(dx)) > fabs(float(dy))){ //dx>dy,即斜率小于1时 xIncrement = 1; //以X轴为单位间隔 yIncrement = float(dy) / float(dx); //每在X轴递增1个单位,Y轴的递增量大小 length = dx; //记录此时的选定单位间隔的坐标轴的线条X轴对应边长度 } else{ yIncrement = 1; //同上 xIncrement = float(dx) / float(dx); length = dy; } //绘制出起始点,handle函数浮点数转换为整数(同时会累积误差) drawPoint(window, handle(x), handle(y)); for (int i = 0; i < length; i++){ //依次给坐标以给定量递增 x += xIncrement; y += yIncrement; //绘制点 drawPoint(window, handle(x), handle(y)); } } int main(int argc, char *argv[]) { Window window("Hello",100,100,400,300); window.create(); //使用算法 lineDDA(window, 10, 10, 250, 250); Application app; app.init(argc, argv); app.add(window); app.show(); _getch(); return 0; } //*/