案例4--直线中点Bresenham算法


typora-root-url: ./

案例3–直线中点Bresenham算法

张朝阳编辑:联系方式18191334533

QQ/Wechat:35811235

说明:使用Microsoft visual studio 2017平台的MFC开发。

一、案例描述

通过确定圆心,在一个以坐标原点为圆心的假想圆的圆周上绘制一定数量的点,并在这些点和圆心之间做直线,同时为每条直线圆心处的点和圆周上的点设定一种颜色,使得颜色渐变,最终让其旋转起来。

知识点:

  • CLine类

    设计直线类CLine,成员函数为MoveTo和LineTo绘制自定义直线。

  • CRGB类

    设计颜色类CRGB类,成员变量包括浮点型的red,green和blue。

二、实现步骤

  1. 添加DoubleBuffer()双缓冲函数。
  2. 添加CLine类,在类中定义绘制直线函数、颜色线性插值函数。
  3. 添加CRGB类,在类中对运算符进行重载。
  4. 在CTestView.h中添加一个DrawObject函数将假想圆以及各个顶点到圆心的连线。
  5. 在DoubleBuffer()中对DrawObject()调用。
  6. 状态栏的修改以及对bPlay进行设置。
  7. 在CTestView.cpp的构造函数中对参数进行初始化。
  8. 在OnDraw()中对SetTimer()和DoubleBuffer()进行调用。

三、主要算法

CTestView类

void CTestView::DoubleBuffer(CDC* pDC)//双缓冲
{
	CRect rect;//定义客户区矩形
	GetClientRect(&rect);//获得客户区的大小
	pDC->SetMapMode(MM_ANISOTROPIC);//pDC自定义坐标系
	pDC->SetWindowExt(rect.Width(), rect.Height());//设置窗口范围
	pDC->SetViewportExt(rect.Width(), -rect.Height());
//设置视区范围,x轴水平向右,y轴垂直向上
	pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);//客户区中心为原点
	CDC memDC;//内存DC
	CBitmap NewBitmap, *pOldBitmap;//内存中承载的临时位图
	memDC.CreateCompatibleDC(pDC);//创建一个与显示pDC兼容的内存memDC 
	NewBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
//创建兼容位图 
	pOldBitmap = memDC.SelectObject(&NewBitmap);//将兼容位图选入memDC 
	memDC.SetMapMode(MM_ANISOTROPIC);//memDC自定义坐标系
	memDC.SetWindowExt(rect.Width(), rect.Height());
	memDC.SetViewportExt(rect.Width(), -rect.Height());
	memDC.SetViewportOrg(rect.Width() / 2, rect.Height() / 2);
	rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);
	Object->DrawObject(&memDC);//向memDC绘制图形
	pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 					-rect.Width() / 2, -rect.Height() / 2, SRCCOPY);
//将内存memDC中的位图拷贝到显示pDC中
	memDC.SelectObject(pOldBitmap);//恢复位图
	NewBitmap.DeleteObject();//删除位图
}
void CTestView::DrawObject(CDC * pDC)
{
	for (int i = 0; i < nCount; i++)
	{
        p[i].x = ROUND(nRadius * cos(i * 10 * PI / 180 + angle));
		p[i].y = ROUND(nRadius * sin(i * 10 * PI / 180 + angle));
	}
	for (int i = 0; i < nCount; i++)
	{
		line->MoveTo(pDC, 0, 0, CRGB(1.0, 0.0, 0.0));
		line->LineTo(pDC, p[i].x, p[i].y, CRGB(0.0, 0.0, 1.0));
	}
}

四、实现效果

动画效果:直线中点Bresenham算法双色效果图与四色效果图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HqHsvqiH-1626397996166)(/案例4-直线中点Bresenham算法(双色).gif)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tx2xIhsS-1626397996167)(/案例4-直线中点Bresenham算法(四色).gif)]

五、遇到的问题及解决方案

1、添加启动图标按钮

解决方法:通过设置菜单命令和Commond命令来控制。

2、改变旋转角度

解决方法:在类向导中添加WM_TIMER消息映射函数。

六、案例心得

1、添加启动图标按钮

解决方法:通过设置菜单命令和Commond命令来控制。

2、改变旋转角度

解决方法:在类向导中添加WM_TIMER消息映射函数。

六、案例心得

理解了Bresenham算法,观察四色图和双色图,理解了算法的实现过程。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值