流程图连接线生成算法

一、连接线种类

使用Visio等软件时,图形和图形之间可能需要使用连接线,如下图所示:

一般连接线会有3种,分别是折线、直线和Bezier曲线。上图中的蓝线是Bezier曲线,绿线是直线,黑线是折线。直线过于简单,无需算法讨论,而Bezier曲线将在后续的文章中讨论。本文主要讨论折线的生成算法。

二、折线形态

根据图形的相对位置和箭头的方向,折线会有不同的形态。就分段数来说,会出现2、3、4、5段的情况,如下图所示(事实上还有1段的情况,由于简单,本文不讨论):

对一个图形来说,其他图形相对于它的位置,总共有4种,分别是左上、左下、右上和右下:

而起始箭头的方向有4种,终止箭头的方向有4种,所以连接线一共有64种形态。在算法编写的时候,把64种情况用if语句写出来,也未尝不是一个办法。但本文当然不会用这种方法。

三、形态简化

如果不考虑箭头的方向,而只是考虑两个点的连接线,那么情况就简单很多了,不外乎2种:

对于箭头的方向,我们可以把它看成是起点终点往外延伸一小段距离。我们把延伸之后的那个点,称为内联点。

这样一来,起点和终点的连接线,就转化为内联点的连接线了。而内联点的连接线,只有2种情况!

那么,这2种情况应该怎么选择呢?条件有两个:

  1. 选择连接线没有经过起点和终点的。

  2. 如果条件1满足,选择弯折次数少的。在上图中,两种情况都没有经过起点和终点,都满足条件1。那么,我们应该选择第一种情况,因为它只折了一次。

事实上,条件1有可能两种情况都不能满足(当分段数为5时)。如下图所示:

对于这种情况,我们需要在两个箭头中间插入一条线,直接用内联点连接这条线的两个端点即可。

四、伪代码

经过第三部分的分析,我们可以书写连接线生成算法的伪代码了。

  1. 根据箭头发向,创建内联点。

  2. 创建内联点的两种连接方式。

  3. 判断是否经过起点终点,如果只有一种方式满足,输出这种方式;如果都满足,转到4;如果都不满足,转到5。

  4. 判断哪种方式弯折次数少,输出这种方式。

  5. 添加一条平行于箭头的线,连接内联点和线的两端。输出这种连接方式。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值