找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3042|回复: 2

排序过程的图形模拟

[复制链接]

307

主题

228

回帖

7345

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5595 个
贡献
253 次
宅之契约
0 份
在线时间
949 小时
注册时间
2014-1-25
发表于 2014-7-25 01:15:53 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
    几个月前aa55发了一个视频模拟排序,效果很不错,我现在也在学算法这些东西,少不了要搞这个,今天一试才发现冒泡排序都不会写了,错了3次才写对。那么如何实现动画展示排序过程呢?下面是效果和MFC源码。MFC虽然很多“高手”都不屑于用,不过如果真正懂的话,是可以写写出很好的东西的,工具总是次要的。
QQ图片20140725011052.jpg

关键代码:

  1.                 CDialog::OnPaint();

  2.                 if(toDraw.empty())
  3.                         return;

  4.                 DrawData& curdata=toDraw.front();
  5.                 RECT drawrt;
  6.                 m_draw.GetClientRect(&drawrt);
  7.                 CClientDC dc(&m_draw);
  8.                 CDC MemDC;
  9.                 CBitmap MemBitmap;
  10.                 MemDC.CreateCompatibleDC(&dc);
  11.                 MemBitmap.CreateCompatibleBitmap(&dc,drawrt.right,drawrt.bottom);
  12.                 MemDC.SelectObject(&MemBitmap);

  13.                 CBrush clearbrush(RGB(255,255,255));
  14.                 MemDC.FillRect(&drawrt,&clearbrush);
  15.                
  16.                 CBrush normal(RGB(0,0,255)),stress(RGB(255,0,0));

  17.                 int size=curdata.data.size();
  18.                 for(int i=0;i<size;i++)
  19.                 {
  20.                         int num=curdata.data.at(i);
  21.                        
  22.                         if(curdata.stress.count(i))
  23.                         {
  24.                                 MemDC.SelectObject(&stress);
  25.                                 curdata.stress.erase(num);
  26.                         }
  27.                         else
  28.                         {
  29.                                 MemDC.SelectObject(&normal);
  30.                         }
  31.                         MemDC.Rectangle(i*BARSIZE,drawrt.bottom-num,i*BARSIZE+BARSIZE,drawrt.bottom);
  32.                 }

  33.                 dc.BitBlt(0,0,drawrt.right,drawrt.bottom,&MemDC,0,0,SRCCOPY);

  34.                 if(toDraw.size() > 1)
  35.                         toDraw.pop();

  36.                 MemDC.DeleteDC();
  37.                 MemBitmap.DeleteObject();
  38. 。。。

  39.         data.clear();
  40.         RECT drawrect;
  41.         m_draw.GetClientRect(&drawrect);
  42.         for(int i=0;i<drawrect.right/BARSIZE;i++)
  43.         {
  44.                 data.push_back(rand()%drawrect.bottom);
  45.                 TRACE("%d ",data.back());
  46.         }
  47.         TRACE("\n");

  48.         toDraw.push(DrawData(data,set<int>()));

  49.         switch(m_typelist.GetCurSel())
  50.         {
  51.                 case TYPE_MAOPAO:
  52.                         MAOPAO();
  53.                         break;

  54.                 default:
  55.                         break;
  56.         }
  57. 。。。。
  58. void CDrawsortDlg::MAOPAO()
  59. {
  60.         int size=data.size();
  61.         for(int i=size-1;i > 0;i--)
  62.         {
  63.                 for(int j=0;j < i;j++)
  64.                 {
  65.                         set<int> curset;
  66.                         curset.insert(size-j-1);
  67.                         curset.insert(size-j-2);
  68.                         toDraw.push(DrawData(data,curset));
  69.                         if(data[size-j-1] < data[size-j-2])
  70.                         {
  71.                                 int tmp=data[size-j-1];
  72.                                 data[size-j-1]=data[size-j-2];
  73.                                 data[size-j-2]=tmp;
  74.                         }
  75.                 }
  76.         }

  77.         toDraw.push(DrawData(data,set<int>()));
  78. }


  79. 。。。。
  80. #include <vector>
  81. #include <queue>
  82. #include <set>
  83. using namespace std;

  84. class DrawData
  85. {
  86. public:
  87.         vector<int> data;//当前数组
  88.         set<int> stress;//提示要进行操作的数
  89.         DrawData(vector<int>& _data,set<int>& _stress):data(_data),stress(_stress)
  90.         {

  91.         }
  92. };

  93. class CDrawsortDlg : public CDialog
  94. {
  95. // Construction
  96. public:
  97.         CDrawsortDlg(CWnd* pParent = NULL);        // standard constructor
  98.         vector<int> data;
  99.         queue<DrawData> toDraw;

  100.         enum {BARSIZE=10,TYPE_MAOPAO=0};

  101.         void MAOPAO();
复制代码


工程:
drawsort.rar (1014.65 KB, 下载次数: 6)
回复

使用道具 举报

307

主题

228

回帖

7345

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5595 个
贡献
253 次
宅之契约
0 份
在线时间
949 小时
注册时间
2014-1-25
 楼主| 发表于 2014-7-25 01:16:30 | 显示全部楼层
后面还会陆陆续续加算法,今天一个冒泡就把我搞晕了
回复 赞! 靠!

使用道具 举报

1112

主题

1653

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24257 个
贡献
46222 次
宅之契约
0 份
在线时间
2298 小时
注册时间
2014-1-26
发表于 2014-7-25 08:48:40 | 显示全部楼层
高手打了双引号。意味深长
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-29 10:40 , Processed in 0.043445 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表