1.一种配电网单线图自动生成方法,包括自动成图算法,其特征在于:所述自动成图算法的步骤如下:
1.初始化图模型:创建一个简单无向图G,把节点对象和边对象加入到图中;
2.找出主干线mainLine:具体方法为,以源点为起点,以叶子结点为终点,找出一条最长的支线,此线即主干线,又称1级支线,把主干线上的所有节点标记为已访问,然后把主干线放入链表mainLines>中;
3.构建其他各级支线:找到主干线中含有分叉的节点node,即邻居个数大于2的节点,把节点node放入branchNodeList>中,以此类推,找出所有3级支线、4级支线及后续支线,并放入allLines
>中;
4.建立父支线与子支线之间一对多的映射关系;
5.为支线上的节点设置坐标:奇数级支线水平放置,偶数级支线竖直放置,同一级别支线按上下或者左右方向交替放置,之后,按照支线布局方向,依次为支线上的节点设置坐标;
6.处理交叉或者重叠;
在布局过程中,如果一个节点的邻居节点数量>4,则采用九宫格布局算法,所述九宫格布局算法的步骤如下:
1.绘制一条支线L时,取L的根节点RootNode;
2.假设已经绘制的支线中,有N条支线的根节点是RootNode;
3.如果N>2,则采用九宫格布局;
4.依次尝试各个方向,直至找出还未被其他支线占据的方向;
5.按此方向为支线上的各个节点设置坐标;
6.处理九宫格布局引起的交叉或者重叠;
处理交叉或者重叠的算法的步骤为:
1.初始化,设存放支线的栈为stack={Line};
2.如果stack为空,则结束,如果stack不为空,则取L1=stack栈顶元素;
3.判断L1是否和已经布局过的支线产生交叉或者重叠;
4.如果没有交叉或者重叠,则移除stack栈顶元素,继续处理交叉或者重叠的算法的步骤2;
5.如果有交叉或者重叠,则找到第一条和L1交叉或者重叠的支线L2,分两种情况处理:
5.1 L1是按九宫格布局的支线;
5.2 L1不是按九宫格布局的支线;
6.如果是“无法解决的交叉或重叠”,则直接移除stack栈顶元素,继续处理交叉或者重叠的算法的步骤2;
7.如果是通过拉伸平移的方法处理的交叉或者重叠,则把拉伸平移的所有支线加入栈stack;
8.继续处理交叉或者重叠的算法的步骤2;
当L1不是按九宫格布局的支线时,处理交叉或者重叠的算法的步骤为:
1.[重布] 如果L1是L2的父线,即由于拉伸L1引起交叉或者重叠,则重布L2,结束;
2.[重布] 如果L1的父线为九宫格布局,则九宫格重画L1,结束;
3.[翻转] 如果L1的反方向没有已布局的兄弟支线,即和L1有相同根节点的支线,则
3.1 将L1翻转;
3.2 如果不交叉,则结束;
计算拉伸平移方案
3.3 拉伸平移方案1,L1不翻转
3.3.1 如果L1和L2是兄弟关系,则无法通过拉伸平移解决;
3.3.2 如果L1和L2重叠,则L1移动1个单位;
3.3.3 如果L1是L2的子线,则L1的直接父线PL1沿其父线方向移动:
3.3.3.1 平移的线 = PL1;
3.3.3.2 移动的距离 = 交叉点和L1终点的距离;
3.3.4 否则,将L1沿其父线方向移动:
3.3.4.1 平移的线 = L1;
3.3.4.2 如果L1和L2重合,则移动的距离 = 1个单位;
3.3.4.3 如果L1父线和L2同向,则移动的距离 = 交叉点和L2终点的距离;
3.3.4.4 否则,则移动的距离 = 交叉点和L2起点的距离;
3.4 拉伸平移方案2,L1翻转,记L1翻转后为L1’,和线路L2’交叉或重叠
3.4.1 如果L1反方向有已布局兄弟支线,则无法通过拉伸平移解决;
3.4.2 否则,计算L1’的拉伸平移方案,计算方法同方案1;
4.如果方案1和方案2都无法通过拉伸平移解决
4.1 [重布] 如果L1和L2重合且L2是L1的兄弟支线,则九宫格重画L1,结束;
4.2 [无法解决] 如果是“无法解决的交叉或重叠”,则结束;
5.[拉伸平移]
5.1 选取较好的移动方案
5.1.1 如果两种方案一个移动L1一个移动PL1,则优先选择移动L1的方案;
5.1.2 否则,优先选择移动距离较小的方案;
5.2 拉伸平移。
2.根据权利要求1所述的一种配电网单线图自动生成方法,其特征在于,当L1是按九宫格布局的支线时,处理交叉或者重叠的算法的步骤为:如果L1和L2根节点相同,则结束;
如果L2是从L1根节点发出的支线,则移动支线L2。
3.根据权利要求1所述的一种配电网单线图自动生成方法,其特征在于,所述“无法解决的交叉或重叠”,是指可能进入死循环,设置最多处理交叉或者重叠的次数为10次,如果超出所设次数,仍然有交叉或者重叠,则判定为“无法解决的交叉或重叠”,直接退出。
4.根据权利要求1所述的一种配电网单线图自动生成方法,其特征在于,所述九宫格布局算法设定16个备选方向,按照顺时针方向依次为向上,偏右上1,右上,偏右上2,向右,偏右下1,右下,偏右下2,向下,偏左下1,左下,偏左下2,向左,偏左上1,左上,偏左上2。