Algorithm 在图形节点之间绘制直线的好算法有哪些?

Algorithm 在图形节点之间绘制直线的好算法有哪些?,algorithm,graphics,graph,drawing,Algorithm,Graphics,Graph,Drawing,我要特别处理的不仅仅是图形的布局,而是当用户选择一个图形节点并开始在屏幕区域周围拖动它时,必须不断地重新绘制线条,以反映如果用户要释放该节点,线条会是什么样子。我想这是布局算法的一部分 此外,有些应用程序有点花哨,不仅以优美的曲线方式绘制直线,而且还以几乎直角的方式围绕方形节点弯曲直线。请参见附件中的图像,请记住,当拖动节点时,该线将绘制为行进中的蚂蚁,并重新排列,同时保留其曲线样式 如果你的图表不是非常满,你不需要额外的算法来实现这一点,只要使用一些常识就可以了 使用矩形网格覆盖曲面,然后找到

我要特别处理的不仅仅是图形的布局,而是当用户选择一个图形节点并开始在屏幕区域周围拖动它时,必须不断地重新绘制线条,以反映如果用户要释放该节点,线条会是什么样子。我想这是布局算法的一部分

此外,有些应用程序有点花哨,不仅以优美的曲线方式绘制直线,而且还以几乎直角的方式围绕方形节点弯曲直线。请参见附件中的图像,请记住,当拖动节点时,该线将绘制为行进中的蚂蚁,并重新排列,同时保留其曲线样式


如果你的图表不是非常满,你不需要额外的算法来实现这一点,只要使用一些常识就可以了

  • 使用矩形网格覆盖曲面,然后找到一种方法,以最小角度沿网格线以直线连接到长方体:如果长方体不在同一网格线上,并且您不关心连接位置,则如果中间没有其他节点,则需要一个角度。如果存在节点,则至少需要一个角度

  • 作为更完整的图表的第二步,添加的代码不仅优化了最小的边数,而且优化了最小的线长度。如果您的图表不是非常满,那么就应用程序响应而言,这几乎不值得注意

  • 考虑到双腿的长度,并检查与曲面上其他对象的交点,以获得额外的视觉效果。我会使用90°的圆并调整圆的半径(显然不是上面所做的)——对于更长的腿,半径应该更大。也许你正在使用的工具包可以帮助你


  • 你熟悉吗?我不确定布局算法的“动态性”和可恢复性如何,但这可能是一个很好的起点。

    为什么不查看Dia源代码以了解它们是如何做到的?

    要扩展@honk答案:对于更平滑的曲线,您只需取3或4个轴点,然后使用二次/三次贝塞尔线将它们连接起来


    这是一个

    除了直接绘制笛卡尔坐标外,实际上不需要任何戏剧性的东西。简单的启发式算法可用于处理路径,在大多数情况下,可能会达到最佳最小角度数,但最短长度路径可能会更频繁。所有这些都可以根据您的需要动态完成,但同时保持图形的精度,而不需要将屏幕分割得更加离散(像素应保持最离散的级别),也不需要复杂的算法

    对于叠加,只需将所有像素设置为线条的颜色,并根据像素是否为线条的一部分,将alpha通道位修改为透明或不透明。要想知道哪一部分是直线的一部分,需要一点几何学,但一旦你把所有东西都准备好了,那就很容易了

    要了解如何在alpha通道上绘制线条,需要了解线条的样式。你要做的很多事情取决于你的风格。一种常见的样式是使用与直角的四分之一圆水平和真实对齐的直线

    对于“避免”算法,当您只想避免表示节点的“框”时,实现这些算法并不太困难。。。取消所有行的聚类是一项更大的任务,甚至Visio都没有采用这项任务。为了避免长方体/节点,使用长方体边缘之间的中点(例如geo1和geo3之间的垂直边缘)很好地实现对称,然后选择一个简单的预定义距离以保持非连接线(即未连接到该特定长方体的线)远离长方体也很好。这方面的通用算法很简单,但这里描述起来有点过于冗长,但本质上是一组通用检查和开关,用于水平和垂直对齐线和四分之一转弯。如果你想要更多关于如何做的细节,就在这个答案上发表评论吧


    如果你正在寻找一些已经为你准备好的东西,那么你想要的连接类型和重新安排实际上取决于应用程序,而不是很多人制造需求低或需求太具体的工具。很明显,这种类型的软件已经存在,因为Visio和其他公司使用了它,但我不确定它是否作为开源软件或其他一些免费库的一部分提供。

    对于1来说,一个完整的网格可能是不必要的,一个包含连接点和避免位的hanan网格应该足够了,我想谢谢,我不想重新发明轮子,尽管我相信我们都能找到精确调整算法的近似值。我想知道是否已经有什么东西可以在更大程度上为您做到这一点?答案本身引入了一些需要处理的非琐碎问题(它解释了一个过程,但缺少“如何”部分)。是否有“经典”算法来涵盖它?@gpilotino:标准A*算法,使用在角度转换上具有更高权重的hanan网格。可以使用标准顶点/边图(而不是*的特例版本,它在搜索时记住方向)模拟角度变换,方法是每个点有两个节点,一个用于水平,一个用于垂直,并对重叠节点之间的边使用高权重。