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;
}
//*/
原文:http://blog.csdn.net/zgljl2012/article/details/44500761