码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-03-21 06:24:24      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:opengl   算法   

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(数字微分分析仪)绘制线条

标签:opengl   算法   

原文地址:http://blog.csdn.net/zgljl2012/article/details/44500761

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!