*内容概述

---实现添加自己的线路由

---给出一个案例,线能自动绕开其他的图形.

 

*ManhattanConnectionRouter简介

---算法简介

与节点无关,只关心如何折线,拐点是不断取折点和结束锚点的中间点位置.

这是一个简洁的算法,却给我们提供了几点关键的概念和代码,作为设计线算法的思路.

a)直角线

开始和结束间的线不是水平线,就是垂直线,折角都是直角.

b)给出了线头的方向和线尾的方向的代码

getStartDirection(Connection conn),getEndDirection(Connection conn),getDirection(Rectangle r, Point p)

---缺点

1)线不会避开锚点间的节点,因为算法自身不考虑这个因素.

 

*实现智能连线

---目标

选择路径能够尽量绕开节点,效果是线不会穿过节点.

---源码

智能连线源码

---源码说明

这里只介绍思路,和关键点

a)实现线路由的基本方式,

继承org.eclipse.draw2d.AbstractRouter-->自定义route()方法,它是布局算法的入口,算法就在这个方法里实现

-->getStartPoint(Connection conn)获取起点+getEndPoint(Connection connection)获取终点+自定义算法获取的其他点,

所有的这些点全部放入PointList中-->route()的最后关键就是conn.setPoints(points.getCopy());这个方法将会重新绘制连线.

b)这里添加的private IFigure content;就是要避开节点的父容器图形;

c)要注意,conn.translateToRelative(startPoint);

这个方法的作用,把点换算成相对线容器的相对坐标,比如说GEF对figure做了放大缩小后,调用这个方法才能保证节点坐标的相对正确性.

d)解决方法,一个基本的障碍物模型+递推+直角线的方式,读者只需看其中一个方向的处理代码就能明白细节思路了.

下图是processDown时的障碍物模型图

障碍物模型

e)后续优化点,在考虑障碍物时,没有把开始和结束点所在的figure作为障碍物,这样就导致了线穿过开始或者结束figure的情况.

 

*添加路由

一般有2中方式给线添加路由

---统一添加方式

在figure的连接层添加,那么这个线路由将作用于其中的所有线

全局添加

---个别添加,直接调用线自身的方法

void org.eclipse.draw2d.PolylineConnection.setConnectionRouter(ConnectionRouter cr)

 

*总结

---draw2d已提供ManhattanConnectionRouter,BendpointConnectionRouter,ShortestPathConnectionRouter等,可以直接使用或者继承后做些修改.

---当需要自己定制连线路由时,继承AbstractRouter,并自定义route(Connection conn)方法,也不难,麻烦的可能就是算法.

---线的路由算法,设计思路是建立解决方案的基本模型,保证通用正确性处理,兼顾考虑特殊情况并给出特殊优化,这也是算法设计的基本思路之一.

posted on 2012-02-29 23:54  戴忠  阅读(1554)  评论(0编辑  收藏  举报