如何使用Win32API绘制树
2024-09-04 17:55:13
一、这个已经有几年时间了,刚开始学习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
最新文章
- Django基础之wsgi
- Spring Boot 添加Shiro支持
- 集合List内容
- What is the PPA and How to do with it ?
- 学习WCF之——wcf程序的创建
- hdu2923 最短路floyd
- [转]ubuntu错误解决E: Sub-process /usr/bin/dpkg returned an error code (1)
- 函数mem_area_alloc
- LXNetwork – 基于AF3.0封装的iOS网络请求库
- 查询Linux系统最后重启时间的三个方法
- c# 使用Codosys.dll(CDO)发送邮件
- Linux 最简单的驱动程序hello world
- HDU [1529] || POJ [P1275] Cashier Employment
- Dom属性方法
- H5学习之旅-H5的超链接以及图片链接(6)
- 剑指Offer_编程题_25
- docker部署Javaweb环境数据库连接问题
- 赵丽颖固然漂亮,可这份Hadoop核心教程也不差呀
- win10下安装GLPK
- ELK学习笔记之F5利用ELK进行应用数据挖掘系列(1)-HTTP
热门文章
- Photoshop在网页设计中的应用与方法
- yii2 basic VER
- java线程类图
- my06_sysbench install for mysql 并初始化表数据
- django-filter version 2.0 改动
- windows下修改了系统变量里java_home所引用的jdk,但是查询jdk的版本并没有发生改变
- RestTemplate中几种常见的请求方式
- AUTO Uninstaller 下载 (maya/3dsmax/cad/Inventor/Revit uninstall tool 卸载修复工具)
- IPM的修炼之路
- 【client】与【offset】