如何使用Win32API绘制树
一、这个已经有几年时间了,刚开始学习charlie的《windows程序设计》的时候做的。
现在看来,代码很乱,虽然后来还整理过几次,现在这方面没什么兴趣了,有兴趣的可自由下载。
二、绘制二叉树的伪代码
int drawBinaryTree(BinaryTree bt){
Queue main;
Queue slave; mian.enQueue(head node of bt);
while (!empty(main)){
slave.clear(); for each node in main{
drawNode(node);
slave.enQueue(sons of node);
} main.clear();
copy all nodes in slave ==> main;
} return ;
}
三、一些数据结构
////////////////////////////////////////////////////////////////////////////////
void init(int nElem);//初始化
void push(int elem); //数据入栈auxBuffer
int StackEmpty(); //SeniorBuffer无数据则返回真值
void copy(int *src, int *dest);//copy auxBuffer to SeniorBuffer
void destroy();
//绘制哈夫曼树时存储结点序号的栈,采用双缓冲结构
typedef struct tagSTACK{
int * SeniorBuffer; //用于暂存结点序号
int sp1; //元素个数
int * auxBuffer; //缓冲区
int sp2; //缓冲区元素个数
void ( *init )(int nElem); //初始化
void ( *push )(int elem); //数据入栈auxBuffer
int ( *StackEmpty )(); //SeniorBuffer无数据则返回真值
void ( *copy )(int *src, int *dest);//copy auxBuffer to SeniorBuffer
void ( *destroy)();
} STACK;
函数指针,可以模仿C++成员函数调用语法,《面向对象软件构造》附录内也有有提到。
四、绘制森林
最开始的绘制效果结点多的时候容易碰撞,通过观察得出结论:绘制头节点时,手背要尽可能长,两背夹角应该尽可能大,越往下手背越短,夹角变小。
不过过也不能一直变短变小,到一定程度可以固定下来。
这样几百个节点也比最初效果好了。
这段代码很琐碎,我自己都不想看。
void PrepareForest(ForestDemension* _G_fd){
_G_fd->MaxNodeNO = _G_fd->ForestWidth = _G_fd->ForestHeight = ;
} void EnumForestStructMember(PHuffmantreeNode ht, int NodeNO, ForestDemension* _G_fd){
int node = NodeNO; _G_fd->rNodeNO = _G_fd->lNodeNO = ;
while( node && ht[node].lchild ) {_G_fd->lNodeNO++; node = ht[node].lchild;}
node = NodeNO;
while( node && ht[node].rchild ) {_G_fd->rNodeNO++; node = ht[node].rchild;} if (_G_fd->lNodeNO > _G_fd->MaxNodeNO) _G_fd->MaxNodeNO = _G_fd->lNodeNO;
if (_G_fd->rNodeNO > _G_fd->MaxNodeNO) _G_fd->MaxNodeNO = _G_fd->rNodeNO;
} int GetTreeOrigX( ForestDemension *_G_fd ){
double m = ; if ( _G_fd->lNodeNO > - ) m = m + EDGE;
if ( _G_fd->lNodeNO > ) m = m + ;
if ( _G_fd->lNodeNO > ) m = m + ;
if ( _G_fd->lNodeNO > ) m = m + ;
if ( _G_fd->lNodeNO > ) m = m + 13.7 * (_G_fd->lNodeNO-); return (int)(m) + _G_fd->ForestWidth ;
} void SetForestWidth( ForestDemension *_G_fd ){
double m = ; if ( _G_fd->lNodeNO > - ) m = m + EDGE;
if ( _G_fd->lNodeNO > ) m = m + ;
if ( _G_fd->lNodeNO > ) m = m + ;
if ( _G_fd->lNodeNO > ) m = m + ;
if ( _G_fd->lNodeNO > ) m = m + 13.7 * (_G_fd->lNodeNO-); if ( _G_fd->rNodeNO > - ) m = m + EDGE;
if ( _G_fd->rNodeNO > ) m = m + ;
if ( _G_fd->rNodeNO > ) m = m + ;
if ( _G_fd->rNodeNO > ) m = m + ;
if ( _G_fd->rNodeNO > ) m = m + 13.7 * (_G_fd->lNodeNO-); _G_fd->ForestWidth += (int)m;
} void SetForestHeight( ForestDemension *_G_fd ){
double m = 0.1*TREELENGTH; if ( _G_fd->MaxNodeNO < HIERARCHY ) _G_fd->MaxNodeNO = HIERARCHY;
if ( _G_fd->MaxNodeNO > - ) m = m + *EDGE;
if ( _G_fd->MaxNodeNO > ) m = m + +EDGE;
if ( _G_fd->MaxNodeNO > ) m = m + +EDGE;
if ( _G_fd->MaxNodeNO > ) m = m + +EDGE;
if ( _G_fd->MaxNodeNO > ) m = m + (+EDGE) * (_G_fd->MaxNodeNO-); if ( (int)m > _G_fd->ForestHeight ) _G_fd->ForestHeight = (int)m;
}
五,代码打包地址:
//http://ishare.iask.sina.com.cn/f/24162408.html
如何使用Win32API绘制树的更多相关文章
- python爬取股票最新数据并用excel绘制树状图
大家好,最近大A的白马股们简直 跌妈不认,作为重仓了抱团白马股基金的养鸡少年,每日那是一个以泪洗面啊. 不过从金融界最近一个交易日的大盘云图来看,其实很多中小股还是红色滴,绿的都是白马股们. 以下截图 ...
- 关于echarts绘制树图形的注意事项(文字倾斜、数据更新、缓存重绘问题等)
最近项目中使用到echarts的树操作,对其中几点注意事项进行下总结. 效果图: 1.基础配置 options的配置如下: { tooltip: { trigger: 'item', triggerO ...
- Anaconda 安装 pydot 绘制树状图
在***的前提下,控制台输入以下命令: 首先安装 graphviz,这是计算的核心 package conda install graphviz 再安装 pydot ,这是 graphviz 的 py ...
- 机器学习实战笔记(Python实现)-02-决策树
--------------------------------------------------------------------------------------- 本系列文章为<机器 ...
- 编译原理LL1文法分析树(绘图过程)算法实现
import hjzgg.analysistable.AnalysisTable; import hjzgg.first.First; import hjzgg.follow.Follow; impo ...
- view的绘制原理
转:http://blog.csdn.net/berber78/article/details/42069301 自定义UI控件,需继承 View类或View的子类,并重载View类中的一些方法,不必 ...
- Qt实现表格树控件-自绘树节点虚线
目录 一.开心一刻 二.自绘树节点? 三.效果展示 四.实现思路 1.可扩展接口 2.函数重写 3.同步左侧表头 五.相关文章 原文链接:Qt实现表格树控件-自绘树节点虚线 一.开心一刻 一程序员第一 ...
- 一篇文教你使用python Turtle库画出“精美碎花小清新风格树”快来拿代码!
Turtle库手册可以查询查询 python图形绘制库turtle中文开发文档及示例大全,手册中现有示例,不需要自己动手就可以查看演示. 使用Turtle画树,看了一下网上的代码,基本上核心的方法是使 ...
- HTML5 程序设计 - 使用HTML5 Canvas API
请你跟着本篇示例代码实现每个示例,30分钟后,你会高喊:“HTML5 Canvas?!在哥面前,那都不是事儿!” 呵呵.不要被滚动条吓到,很多都是代码和图片.我没有分开写,不过上面给大家提供了目录,方 ...
随机推荐
- Array to List
List<OisDiscountIndex> discountIndexes = Arrays.asList(new OisDiscountIndex[trades.size()]);
- IOS开发-基于WebDriverAgent代理服务,实现iOS手机app自动化测试的框架搭建
导引 iOS自动化测试一直使用的appium,iOS系统升级至10.0 Xcode8.0之后,改用WebDriverAgent代理服务作为server,编写了一套基于WebDriverAgent服务 ...
- 服务器运行两个或两个以上的tomcat
一:解决方法 转载: https://www.cnblogs.com/xiaobai1226/p/7662392.html 二:解决方法 将tocmat下 bin---->tomcat8w.e ...
- Problem01 不死神兔
题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析:兔子的规律为数列1,1,2,3,5,8,13,21 ...
- vue-踩过的坑
1)引入组件时路径一定要是./ or ../开头 import Goback from './public/goback.vue' 2)这类输入框绑定的值不是:value 不是 :value 不然数据 ...
- OfficeControl插件的用法
项目中需要用到文档在线编辑的功能,网上找到这篇文章: http://hi.baidu.com/hurtingwings/item/bf83b6343305a94e3075a19e
- 从c到cpp对static 关键字的总结 需要整理下!!!!!!!!!!!!!!!!!!!!!!
一个完整的程序,在内存中的分布情况如下: 具体分布图 自己看书去!!!!!1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区.会随着作用于退出而释放空间.3.堆区:程序员分配并 ...
- [原创]hibernate更新后jdbc读取不到数据问题
最近在做工作流插件时使用的是自己基于hibernate连接封装的orm框架,按说跟hibernate共用的一个连接,应该在同一个事务中,但在使用时hibernate saveOrUpdate后(未提交 ...
- JavaScript Date学习实例:获取3分钟前的时间“hhmmss”格式
上一篇博客分享了Date对象的理论知识,今天正好看到一段相关的代码,可以继续深化,通过实例加强复习Date 题目:获取3分钟前的时间,并且显示格式是hhmmss 以下是看到的代码 var time=n ...
- 【转】Android实现伸缩弹力分布菜单效果
本文介绍下在Android中实现伸缩弹力分布菜单效果.关于这种菜单效果在IPhone中比较常见,效果比较酷.那么在Android中实现只是一种简单的模仿. 这两天无意间看到一园友的博文实现Path2. ...