10
2015
09

流程图连线算法

公司要做一个类似于流程图编辑器的东西,让我来做。我一开始就意识到,连线时最难的,因为平时用word画图的时候,被气的够呛。

参考的网站:

1、https://www.processon.com/tour

这是一个在线画各种流程图的网站,做的不相当错。

下载了js源码看了看,计算画线的路径(其实是计算拐点)一大堆if...else写了1200多行,不知道他们以后怎么维护。

2、http://blog.csdn.net/li_canhui/article/details/6798380/

这个介绍的不错,不得不承认,微软确实很强大。

通过这篇文章,我知道我要用到”曼哈顿路由“。

3、http://xmind.iteye.com/blog/816559

这篇文章介绍了draw2d,一个java的类库。据说用这个开发流程图编辑工具时很方便的。

不了解java,留着以后再看。

4、http://www.draw2d.org/draw2d/download/index.html

还是draw2d,不过是js版的。可惜没有as的,有网页的地方就有js啊。

js和as还是很像的,从里边找到了”曼哈顿路由“的实现代码,改成了as的,拿来用了,只写了一个方法,再稍微复杂点的都没有做。

核心代码(在Line.as里边):

private const MINDIST:Number = 30;
		private const TOL:Number = 0.1;
		private const TOLxTOL:Number = 0.01;
		private const TOGGLE_DIST:Number = 5;
		/**
		 * 核心:寻路算法(routing algorithm)
		 * @param	conn
		 * @param	fromPt
		 * @param	fromDir
		 * @param	toPt
		 * @param	toDir
		 */
		private function route(conn:Array, fromPt:Point, fromDir:int, toPt:Point, toDir:int ):void {
			
			var xDiff:Number = fromPt.x - toPt.x;
			var yDiff:Number = fromPt.y - toPt.y;
			var point:Point;
			var pos:Number;
			var dir:int;
			if ( (xDiff * xDiff < TOLxTOL) && (yDiff * yDiff < TOLxTOL) ) {
				conn.push(new Point(toPt.x, toPt.y));
				return;
			}
			if (fromDir==LEFT) {
				if (xDiff>0 && yDiff*yDiff<TOL && toDir==RIGHT) {
					point = toPt;
					dir = toDir;
				}
				else {
					if (xDiff0&&toDir==DOWN) || (yDiff0) {
						dir = UP;
					}
					else {
						dir = DOWN;
					}
				}
			}
			else if (fromDir==RIGHT) {
				if (xDiff<0 && yDiff*yDiff0) {
						point = new Point(fromPt.x + MINDIST, fromPt.y);
					}
					else if ( (yDiff>0 && toDir==DOWN) || (yDiff0) {
						dir = UP;
					}
					else {
						dir = DOWN;
					}
				}
			}
			else if (fromDir==DOWN) {
				if (xDiff*xDiff0) {
						point = new Point(fromPt.x, fromPt.y + MINDIST);
					}
					else if( (xDiff>0&&toDir==RIGHT) || (xDiff0) {
						dir = LEFT;
					}
					else {
						dir = RIGHT;
					}
				}
			}
			else if (fromDir==UP) {
				if (xDiff*xDiff0&&toDir==DOWN) {
					point = toPt;
					dir = toDir;
				}
				else {
					if (yDiff0&&toDir==RIGHT)||(xDiff0) {
						dir = LEFT;
					}
					else {
						dir = RIGHT;
					}
				}
			}
			route(conn, point, dir, toPt, toDir);
			conn.push(fromPt);
		}

效果:

demo01:

获得 Adobe Flash Player

demo02:

获得 Adobe Flash Player

源码打包下载

« 上一篇下一篇 »

相关文章:

曼哈顿路由在电路连线中的应用  (2021-6-23 13:55:25)

分娩流程图  (2017-8-21 14:33:48)

下载draw2d在线API  (2016-5-16 15:57:25)

draw2d-js实例、API  (2016-5-16 10:48:15)

方棋-流程图  (2016-4-8 12:3:39)

页游安全攻与防(转)  (2016-3-4 21:49:54)

使用NetStream实现p2p(1)  (2016-3-1 20:34:19)

FLEX 迷你教程 — 基于STRATUS的P2P网络电话(转)  (2016-3-1 11:10:6)

(十六)自定义类  (2015-3-24 15:42:45)

(十五)类  (2015-3-24 14:25:51)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。