DDA(数字微分分析仪)绘制线条

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;}//*/

可偏偏。多么温柔,一出口便是相互指责和嘲讽。

DDA(数字微分分析仪)绘制线条

相关文章:

你感兴趣的文章:

标签云: