- UID
- 2
- 精华
- 积分
- 7736
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
几个月前aa55发了一个视频模拟排序,效果很不错,我现在也在学算法这些东西,少不了要搞这个,今天一试才发现冒泡排序都不会写了,错了3次才写对。那么如何实现动画展示排序过程呢?下面是效果和MFC源码。MFC虽然很多“高手”都不屑于用,不过如果真正懂的话,是可以写写出很好的东西的,工具总是次要的。
关键代码:
- CDialog::OnPaint();
- if(toDraw.empty())
- return;
- DrawData& curdata=toDraw.front();
- RECT drawrt;
- m_draw.GetClientRect(&drawrt);
- CClientDC dc(&m_draw);
- CDC MemDC;
- CBitmap MemBitmap;
- MemDC.CreateCompatibleDC(&dc);
- MemBitmap.CreateCompatibleBitmap(&dc,drawrt.right,drawrt.bottom);
- MemDC.SelectObject(&MemBitmap);
- CBrush clearbrush(RGB(255,255,255));
- MemDC.FillRect(&drawrt,&clearbrush);
-
- CBrush normal(RGB(0,0,255)),stress(RGB(255,0,0));
- int size=curdata.data.size();
- for(int i=0;i<size;i++)
- {
- int num=curdata.data.at(i);
-
- if(curdata.stress.count(i))
- {
- MemDC.SelectObject(&stress);
- curdata.stress.erase(num);
- }
- else
- {
- MemDC.SelectObject(&normal);
- }
- MemDC.Rectangle(i*BARSIZE,drawrt.bottom-num,i*BARSIZE+BARSIZE,drawrt.bottom);
- }
- dc.BitBlt(0,0,drawrt.right,drawrt.bottom,&MemDC,0,0,SRCCOPY);
- if(toDraw.size() > 1)
- toDraw.pop();
- MemDC.DeleteDC();
- MemBitmap.DeleteObject();
- 。。。
- data.clear();
- RECT drawrect;
- m_draw.GetClientRect(&drawrect);
- for(int i=0;i<drawrect.right/BARSIZE;i++)
- {
- data.push_back(rand()%drawrect.bottom);
- TRACE("%d ",data.back());
- }
- TRACE("\n");
- toDraw.push(DrawData(data,set<int>()));
- switch(m_typelist.GetCurSel())
- {
- case TYPE_MAOPAO:
- MAOPAO();
- break;
- default:
- break;
- }
- 。。。。
- void CDrawsortDlg::MAOPAO()
- {
- int size=data.size();
- for(int i=size-1;i > 0;i--)
- {
- for(int j=0;j < i;j++)
- {
- set<int> curset;
- curset.insert(size-j-1);
- curset.insert(size-j-2);
- toDraw.push(DrawData(data,curset));
- if(data[size-j-1] < data[size-j-2])
- {
- int tmp=data[size-j-1];
- data[size-j-1]=data[size-j-2];
- data[size-j-2]=tmp;
- }
- }
- }
- toDraw.push(DrawData(data,set<int>()));
- }
- 。。。。
- #include <vector>
- #include <queue>
- #include <set>
- using namespace std;
- class DrawData
- {
- public:
- vector<int> data;//当前数组
- set<int> stress;//提示要进行操作的数
- DrawData(vector<int>& _data,set<int>& _stress):data(_data),stress(_stress)
- {
- }
- };
- class CDrawsortDlg : public CDialog
- {
- // Construction
- public:
- CDrawsortDlg(CWnd* pParent = NULL); // standard constructor
- vector<int> data;
- queue<DrawData> toDraw;
- enum {BARSIZE=10,TYPE_MAOPAO=0};
- void MAOPAO();
复制代码
工程:
drawsort.rar
(1014.65 KB, 下载次数: 6)
|
|