我的图形布局 组织结构图布局

server/2025/1/23 15:33:42/

组织结构图布局,有的人也叫它树状布局,在图形中是经常用到的布局算法.形成类似如下图的图形布局方式
在这里插入图片描述
首先创建一个类,

public class TreeLayouter
{private int m_space = 40;/// <summary>/// 空间间隔/// </summary>public int Space{get { return m_space; }set { m_space = value; }}
}

要找出每个面和面之间的关系,不妨形成一个矩阵

/// <summary>
/// 形成关系矩阵
/// </summary>
/// <param name="shapes"></param>
/// <returns></returns>
private int[,] FormMatrixRelation(List<IShape> shapes)
{int n = shapes.Count;int[,] array = new int[n, n];for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (i != j){//找出i和j之间是否有连线,要考虑线的起始端和终止端if (IsRelation(shapes[i], shapes[j]))array[i, j] = 1;}}}return array;
}

根据矩阵找出根节点来

        /// <summary>/// 查找根节点,返回根节点的所有,有几个返回几个/// </summary>/// <param name="shapes"></param>/// <param name="array"></param>private int[] FindRootNode(List<IShape> shapes, int[,] array){List<int> trees = new List<int>();//矩阵中列上全部为0的点则是顶点for (int colIndex = 0, n = array.GetLength(0); colIndex < n; colIndex++){bool isNull = true;for (int rowIndex = 0; rowIndex < n; rowIndex++){if (array[rowIndex, colIndex] != 0){isNull = false;break;}}if (isNull)//找到树上的一个根节点{trees.Add(colIndex);}}return trees.ToArray();}//查找入向的行节点private int[] FindInputRowIndex(int[,] array, int colIdx){//查找列中为1的数量List<int> list = new List<int>();for (int rowIdx = 0, n = array.GetLength(0); rowIdx < n; rowIdx++){if (array[rowIdx, colIdx] == 1){list.Add(rowIdx);}}return list.ToArray();}

找出最长的路径

//计算最长路径
private int CalcuNodeLevel(int[,] array, int rowIdx, int levelCount, List<int> existIdxs, int childIdx)
{if (existIdxs.Contains(rowIdx)){array[rowIdx, childIdx] = 0;return 0;}else{existIdxs.Insert(0, rowIdx);levelCount++;//找出最长路径int[] rowIdxs = FindInputRowIndex(array, rowIdx);if (rowIdxs.Length == 0)return levelCount;else{int level = 0;foreach (int ridx in rowIdxs){int c = CalcuNodeLevel(array, ridx, levelCount, existIdxs, rowIdx);if (level < c){level = c;}}return level;}}
}

应用最长路径

//应用最长路径
private void ReviseArray(int[,] array)
{for (int colIdx = 0, n = array.GetLength(0); colIdx < n; colIdx++){//查找列中为1的数量int[] rowIdxs = FindInputRowIndex(array, colIdx);if (rowIdxs.Length > 1){//找出最长的,其它的赋值为0int level = 0;int ridx = -1;foreach (int rowIdx in rowIdxs){List<int> existIdxs = new List<int>();existIdxs.Add(colIdx);int c = CalcuNodeLevel(array, rowIdx, 0, existIdxs, colIdx);if (level == 0){level = c;ridx = rowIdx;}else{if (level <= c){level = c;//先赋值为0;array[ridx, colIdx] = 0;ridx = rowIdx;}else{array[rowIdx, colIdx] = 0;}}}}}
}

增加验证,是否有循环

/// <summary>
/// 验证树是否正确
/// </summary>
private void Verify(int[,] array, int[] rootIdxes)
{if (rootIdxes.Length == 0)throw new Exception("无法找到根节点");//是否存在闭环,导致死循环foreach (int rootIdx in rootIdxes){List<int> list = new List<int>();list.Add(rootIdx);VerifyLoop(array, rootIdx, list);}
}private void VerifyLoop(int[,] array, int rootIdx, List<int> list)
{list.Add(rootIdx);List<int> currList = new List<int>();for (int colIdx = 0, n = array.GetLength(0); colIdx < n; colIdx++){if (array[rootIdx, colIdx] == 1){if (list.Contains(colIdx))throw new Exception("出现了循环");elselist.Add(colIdx);currList.Add(colIdx);}}foreach (int idx in currList){VerifyLoop(array, idx, list);}
}

到这里其实核心思想已经完成了,整个代码就是应用矩阵来处理.


http://www.ppmy.cn/server/160774.html

相关文章

【18】编写shell-定期删除elastic索引

说明: 1)elastic索引是按日期生成的,所以执行shell脚本每天定时删除索引 2)只保留25天的索引,超过25天的elastic索引被删除,可以根据个人修改 3)日志elastic索引如下图所示: #! /bin/bashset -e# 定义变量 baol_num=25 ELASTIC_USER="elastic" ELASTIC_PASSW…

计算机网络ENSP课设--三层架构企业网络

本课程设计搭建一个小型互联网&#xff0c;并模拟Internet的典型Web服务过程。通过此次课程设计&#xff0c;可以进一步理解Internet的工作原理和协议过程&#xff0c;并提高综合知识的运用能力和分析能力。具体目标包括&#xff1a; &#xff08;1&#xff09;掌握网络拓扑的…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证6)

重新创建WebApi项目&#xff0c;安装Microsoft.AspNetCore.Authentication.JwtBearer包&#xff0c;将之前JwtBearer测试项目中的初始化函数&#xff0c;jwt配置类、token生成类全部挪到项目中。   重新编写login函数&#xff0c;之前测试Cookie和Session认证时用的函数适合m…

Go项目实战-让自定义Error支持Go的errors.Is判定以及原型模式的应用

经过前面三节高代码强度的学习&#xff0c;相信大家都已经有点累了&#xff0c;本节我们不着急继续“赶路”&#xff0c;休息片刻&#xff01;我们换个轻松点的话题&#xff0c;聊一聊咱们项目定制化Error--AppError 怎么支持Go语言的 errors.Is 判定&#xff0c;以及项目预定义…

论文+AI赋能教育:探索变革路径与创新实践。包括word和pdf格式。

下载地址链接&#xff1a; https://download.csdn.net/download/wanggang130532/90292129https://download.csdn.net/download/wanggang130532/90292129

2024年踩坑经验备份【总结】

与业务方需求方沟通 1、开发进度同步&#xff0c;主动反馈、沟通进展&#xff0c;让需求方心里有数。 开发前 主动沟通需求&#xff0c;不是等别人来找你沟通需求的确认澄清得到结论之后&#xff0c;也用文字描述清楚&#xff0c;在群里cc相关业务方&#xff0c;保证各方信息…

HarmonyOS开发中模拟器TextInput表单类的无法输入中文字符问题

近期在做HarmonyOS的Demo时&#xff0c;发现DevEco Studio中Previewer预览模拟器&#xff0c;或者是设备管理中的模拟器&#xff0c;在使用TextInput时UI界面上都无法输入中文字符&#xff0c;经过反复研究发现网上并未给出相应好的解决方案。 在鸿蒙官网问答论谈上&#xff0c…

NPC与AI深度融合结合雷鸟X3Pro AR智能眼镜:引领游戏行业沉浸式与增强现实新纪元的畅想

if… NPC&#xff08;非玩家角色&#xff09;与AI&#xff08;人工智能&#xff09;的深度融合&#xff0c;正引领游戏行业迈向一个全新的沉浸式与增强现实&#xff08;AR&#xff09;相结合的新时代。这一创新不仅预示着游戏体验的质变&#xff0c;更可能全面革新游戏设计与叙…