typora-root-url: ./
案例3–直线中点Bresenham算法
张朝阳编辑:联系方式18191334533
QQ/Wechat:35811235
说明:使用Microsoft visual studio 2017平台的MFC开发。
文章目录
一、案例描述
通过确定圆心,在一个以坐标原点为圆心的假想圆的圆周上绘制一定数量的点,并在这些点和圆心之间做直线,同时为每条直线圆心处的点和圆周上的点设定一种颜色,使得颜色渐变,最终让其旋转起来。
知识点:
-
CLine类
设计直线类CLine,成员函数为MoveTo和LineTo绘制自定义直线。
-
CRGB类
设计颜色类CRGB类,成员变量包括浮点型的red,green和blue。
二、实现步骤
- 添加DoubleBuffer()双缓冲函数。
- 添加CLine类,在类中定义绘制直线函数、颜色线性插值函数。
- 添加CRGB类,在类中对运算符进行重载。
- 在CTestView.h中添加一个DrawObject函数将假想圆以及各个顶点到圆心的连线。
- 在DoubleBuffer()中对DrawObject()调用。
- 状态栏的修改以及对bPlay进行设置。
- 在CTestView.cpp的构造函数中对参数进行初始化。
- 在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算法,观察四色图和双色图,理解了算法的实现过程。