图形学 (一): 画线算法DDA和Bresenham

这篇博客介绍了在计算机图形学中,如何使用DDA和Bresenham算法进行画线操作。文章通过代码展示和效果对比,详细解释了两种算法的工作原理和性能差异,并探讨了中点画线算法的问题及其优化方法。总结指出,尽管Bresenham算法没有浮点运算,但其循环体内的指令数量相对较多,与DDA在效率上接近。
摘要由CSDN通过智能技术生成

前言

我们老师竟然还在用MFC,一开始我是震惊的,后来参考了很多国内的教材发现都是MFC。。(QB对不起!
该图形学系列博客的环境是VC++6.0 & MFC & OpenGL,Mac上装一个Windows XP虚拟机,适应一段时间后发现还是挺舒服的,也找到了童年的感觉。
代码地址:我的Github

API介绍

类名::draw(CPoint from, CPoint to, CDC* dc)
其中CDC* dc是一个设备上下文对象,通过调用它的

void CDC::SetPixel(int x, int y, COLORREF color);
void CDC::SetPixel(CPoint point, COLORREF color);

方法来画像素点

DDA

将直线按照长轴方向微分, 比如这条直线是 (0, 0) -> (5, 4), 那么一共画5个点, 分别是(0, 0), (1, 0.8), (2, 1,6), (3, 2.4), (4, 3.2), (5, 4). 因为像素空间的坐标值只能是整数, 所以在绘制时要四舍五入.

代码

void DDALine::draw(CPoint from, CPoint to, CDC* dc) {
   
	float x = from.x + 0.5;
	float y = from.y + 0.5;
	float stepx, stepy;
	int times = 1;
	COLORREF color = RGB(255, 0, 0);

	int dy = to.y - from.y;
	int dx = to.x - from.x;
	if (abs(dy) >= abs(dx)) {
   
		times += abs(dy);
		stepx = dx * 1.f / dy;
		stepy = 1.f;
		if (from.y > to.y) {
   
			stepx *= -1;
			stepy *= -1;
		}
	} else {
   
		times += abs(dx);
		stepx = 1.f;
		stepy = dy * 1.f / dx;
		if (from.x > to.x) {
   
			stepx *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值