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

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

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.rhkb.cn/news/5873.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络介质访问控制全攻略:从信道划分到协议详解!!!

一、信道划分介质访问控制 介质访问控制&#xff1a;多个节点共享同一个“总线型”广播信道时&#xff0c;可能发生“信号冲突” 应该怎么控制各节点对传输介质的访问&#xff0c;才能减少冲突&#xff0c;甚至避免冲突? 时分复用(TDM) 时分复用&#xff1a;将时间分为等长的“…

sql主从同步

今天给大家介绍两种mysql的主从同步方式&#xff1a;第一种是基于binlogzhu主从同步&#xff1b;第二种就是基于gtid的主从同步方式。 首先给大家介绍一下什么是sql的主从复制。 主从复制&#xff1a; 通过将MySQL的某一台主机&#xff08;master&#xff09;的数据复制到其…

计算机组成原理——数据表示(二)

当生活的压力和困惑缠绕在身边&#xff0c;我们往往需要振奋精神&#xff0c;勇往直前。无论在何种困境中&#xff0c;我们都要保持积极的态度和坚定的信念。将悲观的情绪抛之脑后&#xff0c;展现出坚强的意志力和无尽的活力。振奋精神意味着我们要战胜自己内心的负面情绪&…

Spring Boot整合Thymeleaf、JDBC Template与MyBatis配置详解

本文将详细介绍如何在Spring Boot项目中整合Thymeleaf模板引擎、JDBC Template和MyBatis&#xff0c;涵盖YAML配置、依赖版本匹配、项目结构设计及代码示例。 一、版本兼容性说明 Spring Boot版本与Java版本对应关系 Spring Boot 2.x&#xff1a;支持Java 8、11&#xff08;推…

概率论里的特征函数,如何用卷积定理去理解

概率论里的特征函数&#xff0c;如何用卷积定理去理解_哔哩哔哩_bilibili

论文笔记(六十二)Diffusion Reward Learning Rewards via Conditional Video Diffusion

Diffusion Reward Learning Rewards via Conditional Video Diffusion 文章概括摘要1 引言2 相关工作3 前言4 方法4.1 基于扩散模型的专家视频建模4.2 条件熵作为奖励4.3 训练细节 5 实验5.1 实验设置5.2 主要结果5.3 零样本奖励泛化5.4 真实机器人评估5.5 消融研究 6 结论 文章…

HashMap用法

一、构造方法 构造方法有4个。 1、手动声明初始容量及负载因子的构造函数。初容容量的最大值不能超过MAXIMUM_CAPACITY 2、手动声明初始容量的构造函数&#xff0c;负载因子是默认大小。 默认的负载因子是0.75 3、无参的构造函数&#xff0c;会指定默认的负载因子。容量是默…

Java基础 (一)

基础概念及运算符、判断、循环 基础概念 关键字 数据类型 分为两种 基本数据类型 标识符 运算符 运算符 算术运算符 隐式转换 小 ------>>> 大 强制转换 字符串 拼接符号 字符 运算 自增自减运算符 ii赋值运算符 赋值运算符 包括 强制转换 关系运算符 逻辑运算符 …

无人机在城市执法监管中的应用:技术革新与监管挑战

随着科技的不断进步&#xff0c;无人机技术在城市管理中的应用越来越广泛。无人机以其灵活性、高效性和低成本的优势&#xff0c;正在逐渐成为城市执法监管的得力助手。本文将探讨无人机在城市执法监管中的应用现状、技术优势以及面临的挑战。 无人机技术在城市执法监管中的应用…

AI模型提示词(prompt)优化-实战(一)

一、prompt作用 用户与AI模型沟通的核心工具&#xff0c;用于引导模型生成特定内容、控制输出质量、调整行为模式&#xff0c;并优化任务执行效果&#xff0c;从而提升用户体验和应用效果 二、prompt结构 基本结构 角色&#xff1a;设定一个角色&#xff0c;给AI模型确定一个基…

mac 电脑上安装adb命令

在Mac下配置android adb命令环境&#xff0c;配置方式如下&#xff1a; 1、下载并安装IDE &#xff08;android studio&#xff09; Android Studio官网下载链接 详细的安装连接请参考 Mac 安装Android studio 2、配置环境 在安装完成之后&#xff0c;将android的adb工具所在…

电子应用设计方案101:智能家庭AI喝水杯系统设计

智能家庭 AI 喝水杯系统设计 一、引言 智能家庭 AI 喝水杯系统旨在为用户提供个性化的饮水提醒和健康管理服务&#xff0c;帮助用户养成良好的饮水习惯。 二、系统概述 1. 系统目标 - 精确监测饮水量和饮水频率。 - 根据用户的身体状况和活动量&#xff0c;智能制定饮水计划。…

5G网络下移动机器人的图像和指令传输用于远程操作

论文标题 **英文标题&#xff1a;**Image and Command Transmission Over the 5G Network for Teleoperation of Mobile Robots **中文标题&#xff1a;**5G网络下移动机器人的图像和指令传输用于远程操作 作者信息 Thiago B. Levin,, Joo Miguel Oliveira,, Ricardo B. Sou…

AIGC视频生成国产之光:ByteDance的PixelDance模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍ByteDance的视频生成模型PixelDance&#xff0c;论文于2023年11月发布&#xff0c;模型上线于2024年9月&#xff0c;同时期上线的模型还有Seaweed&…

软件安全性测试报告如何编写?

在当今数字化时代&#xff0c;软件安全性问题愈发显得重要&#xff0c;软件产品的安全性已经成为企业竞争力的重要组成部分。而软件安全性测试报告是通过对软件系统进行全面的安全性测试后&#xff0c;整理出的关于其安全性状况、潜在风险及改进建议的专业文档。此报告旨在帮助…

从密码学原理与应用新方向到移动身份认证与实践

相关学习资料放下面啦&#xff01; 记得关注❤️&#xff5e;后续分享更多资料 通过百度网盘分享的文件&#xff1a;从密码学原理与应... 链接https://pan.baidu.com/s/1mHpHkvPuf8DUwReQkoYQlw?pwdGza7 提取码&#xff1a;Gza7 复制这段内容打开「百度网盘APP 即可获取」 记…

【玩转全栈】---基于YOLO8的图片、视频目标检测

本篇主要讲YOLO8的具体操作&#xff0c;想要了解YOLO的具体原理&#xff0c;可以去官网查询 目录 下载ultralytics库 开始检测 介绍 YOLOv8&#xff08;You Only Look Once Version 8&#xff09;是 YOLO 系列的最新版本&#xff0c;由 Ultralytics 开发并发布&#xff0c;是一…

生成对抗网络(GAN)入门与编程实现

生成对抗网络&#xff08;Generative Adversarial Networks, 简称 GAN&#xff09;自 2014 年由 Ian Goodfellow 等人提出以来&#xff0c;迅速成为机器学习和深度学习领域的重要工具之一。GAN 以其在图像生成、风格转换、数据增强等领域的出色表现&#xff0c;吸引了广泛的研究…

【若依】添加数据字典

接下来&#xff0c;在生成代码的页面将“学科”字段改为下拉框&#xff0c;然后选择数据字典 然后&#xff0c;将生成的代码中的index文件复制到vue3的index中&#xff0c;替换掉之前的index文件 修改数据库中的subject的值&#xff0c;这样就可以通过数据字典来查询 以上操作成…

ngrok同时配置多个内网穿透方法

一、概要 ngrok可以用来配置免费的内网穿透&#xff0c;启动后就可以用外网ip:端口访问到自己计算机的某个端口了。 可以用来从外网访问自己的测试页面&#xff08;80、8080&#xff09;、ftp文件传输&#xff08;21&#xff09;、远程桌面&#xff08;3389&#xff09;等。 …