我特别要解决的问题不仅仅是图形的布局,但是当用户选择图形节点并开始将其拖动到屏幕区域时,必须不断重新绘制线条以反映它的外观比如 if 用户要释放节点。我想这是布局算法的一部分?
另外一些应用程序有点花哨,并不是简单地以一种漂亮的弯曲方式绘制线条,而是以几乎直角弯曲方形节点周围的线条。请参阅附图,并记住,当拖动一个节点时,该线被绘制为行进的蚂蚁,并在保留其弯曲样式的同时重新排列好。
答案 0 :(得分:8)
如果您的图表不是疯狂的,那么您不需要一个额外的算法,但只需使用一些常识。
用矩形网格覆盖表面,然后找到一种方法连接到具有最小角度的网格线的直线框:如果框不在同一网格线上而您没有在你连接的地方,如果中间没有其他节点则需要一个角度。如果有例如你需要至少再多一个角度的节点。
作为更全面的图表的第二步,添加代码不仅可以优化最小边数,还可以最小化线条长度。如果您的图表没有疯狂,那么在应用程序响应方面几乎不会引起注意。
考虑到两条腿的长度并检查表面上其他物体的交叉点,在角度范围内使用额外的眼睛糖果。我会使用90°的圆圈并调整圆圈的半径(显然不是上面所做的) - 对于较长的腿,半径应该更大。也许你正在使用的工具包可以帮助你。
答案 1 :(得分:0)
您熟悉Graphviz吗?我不确定布局算法是如何“动态”和可重用的,但它可能是一个很好的起点。
答案 2 :(得分:0)
为什么不查看Dia源代码以了解他们是如何做到的? http://live.gnome.org/Dia/Download
答案 3 :(得分:0)
扩展@honk答案:对于更平滑的曲线,您可以使用3或4个轴点并使用二次/三次贝塞尔曲线连接它们。
答案 4 :(得分:0)
除了直接绘制到笛卡尔坐标之外,不需要任何戏剧性的东西。简单的启发式方法可以用于处理路径并且可能在大多数时间内达到最佳的最小角度数,但是甚至更频繁地可能是最短的长度路径。所有这些都可以根据需要动态完成,但在保持图形精度的同时,不需要更多地离散屏幕(像素应该保持最离散的水平),而不需要复杂的算法。
对于叠加层,只需将所有像素设置为线条的颜色,并将Alpha通道位修改为透明或不透明,具体取决于像素是否为线条的一部分。要弄清楚哪些位是线的一部分需要一些几何形状,但是一旦你掌握了所有的东西,这就是小菜一碟。
要弄清楚如何将线条绘制到Alpha通道上,您需要弄清楚线条的样式。很多你要做的事情取决于风格。一种常见的风格是使用水平和纵向与直角四分之一圆对齐的直线。
对于“回避”算法,当你只是想避免代表你的节点的“盒子”时,这些算法并不太难实现......对你的所有行进行分簇是一项任务有点大,而不是即使Visio雇用。为了避免使用盒子/节点,使用盒子边缘之间的中点(例如geo1和geo3之间的垂直边缘)可以很好地进行对称,然后选择一个简单的预定距离来保持非连接线(即线条)没有连接到特定的盒子)远离盒子也很好。用于此的通用算法很简单,但在这里描述有点过于冗长,但实质上是一组广义检查和开关,它们在水平和垂直方向上对齐线和四分之一圈。如果您最终想要了解如何执行此操作的详细信息,请发表对此答案的评论。
如果你正在寻找已经为你做的事情,你想要的连接和重新安排的类型实际上取决于应用程序,而不是很多人制造需求低或需求太具体的工具。显然这种类型的软件就在那里,因为Visio和其他人使用它,但是它是否可用作开源或其他一些免费库的一部分我不确定。