公司要做一个类似于流程图编辑器的东西,让我来做。我一开始就意识到,连线时最难的,因为平时用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:
demo02:
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。