2010-03-17 79 views
18

我特别想知道的不仅仅是一个图形的布局,但是当用户选择一个图形节点并开始在屏幕区域中拖动它时,必须不断重绘该行以反映它看起来的样子如果用户要释放该节点。我想这是布局算法的一部分?在图形节点之间绘制线条有哪些好的算法?

另外一些应用程序有点花哨,不要简单地以一种很好的弯曲方式画出线条,而且还可以以几乎直角弯曲方形节点周围的线条。请参阅附加的图像,并记住,拖动节点时,该线条被绘制为行军蚂蚁,并重新排列,同时保留其弯曲的风格。

alt text http://img260.imageshack.us/img260/5458/nodesr.png

回答

8

如果你的图是不是疯了满你不应该需要这个额外的花哨的算法,只是用一些常识。

  1. 覆盖表面带有矩形网格,然后找到一个方法来连接到与直线沿着网格线与角度的最低数量框:如果纸箱不在同一网格线和你不无论你在哪里连接,你都需要一个角度,如果没有其他节点在之间。如果有例如节点的方式至少需要一个角度。

  2. 作为更完整图表的第二步,添加代码不仅优化最小边数,而且最小长度的线。如果你的图表不够疯狂,那么在应用程序响应方面应该很难察觉。

  3. 对于考虑到两条腿的长度以及检查表面上其他物体的交叉点的角度,可以在角度范围内增加眼睛的糖果。我会使用90°圆圈并调整圆的半径(显然不是以上所做的) - 对于较长的腿,半径应该更大。也许你正在使用的工具包可以帮助你。

+1

为1一个完整的网格可能是没有必要的,一个汉南网格的点连接和位,以避免应该足够我认为 – 2010-03-17 09:43:22

+0

谢谢,我不想重新发明轮子,虽然我相信我们可以都提出了精细调整算法的近似值。我想知道有没有什么能够在一定程度上为你做到这一点? – ApplePieIsGood 2010-03-17 11:17:26

+1

答案本身引入了一些不平凡的问题来处理(它解释了一个过程,但缺乏“如何”部分)。是否有“经典”算法来覆盖它? – gpilotino 2011-04-26 14:11:07

0

您是否知道Graphviz?我不确定布局算法的“动态”和可重构性,但它可能是一个很好的起点。

0

有没有真正需要什么戏剧性超出绘图直接到笛卡尔坐标。简单的启发式算法可以用来处理路径,并且可能在大多数时间内达到最佳的最小角度数,但可能更经常是最短路径。所有这些都可以根据需要动态地完成,但是在保持图形精度的同时,不需要更加分散地将屏幕分离出来(像素应该保持最离散的水平),而不需要复杂的算法。

对于叠加层,只需将所有像素设置为线的颜色,并根据像素是否为线的一部分将Alpha通道位修改为透明或不透明。要确定哪些位是该行的一部分需要一些几何图形,但是一旦你拥有了一切,这是一块蛋糕。

要弄清楚如何在Alpha通道上绘制线条,您需要弄清楚线条的样式。你会做很多事情取决于风格。一种常见的风格是使用水平方向的直线和直角四分之一圆对齐的直线。

对于“避免”算法,当您只想避免代表节点的“盒子”时,这些算法不会太难实现......要将所有线条都消除一点,甚至连Visio都没有雇佣。为了避免盒子/节点,使用盒子边缘之间的中点(例如geo1和geo3之间的垂直边缘)很适合对称,然后选择一个简单的预定义距离以保持非连接线条(即线条没有连接到特定的盒子)远离箱子也运作良好。对此的一种通用算法很简单,但在这里描述有点过于冗长,但本质上是一组广义检查和开关,用于水平和垂直对齐线和四分之一圈。如果您最终希望得到关于如何做到这一点的更多细节,只需发表评论就可以了。

如果你正在寻找一些已经为你做的事情,你想要的连接类型和重新安排取决于应用程序,而不是很多人制作低需求或特定需求的工具。显然这种类型的软件已经存在,因为Visio和其他人使用它,但是不管它是否可以作为开放源代码或其他免费库的一部分提供,我不确定。