在图表中绘制边缘,以优化可见性

时间:2020-10-14 23:44:56

标签: javascript svg

我的任务是实现网络图表/垂直图表组件,该组件接受任务列表和边缘列表并进行渲染。这些步骤是:

  1. 正在加载:加载所需的数据
  2. 模型:创建模型,计算特定任务需要走的行,列,组和车道,满足某些布局标准并根据给定数据显示对象层次结构
  3. 渲染 3a。渲染任务 3b。渲染组,车道等 3c。渲染边缘。这就是我真正挣扎的地方。

计算模型之后,整个结构固定。步骤3a之后,我知道渲染任务的确切位置(以像素为单位)。现在,我需要从图表中某个位置的a点到图表中某个地方的b点绘制一条边线,而无需完成任务,如果不需要的话,也不能与其他许多边线交叉,例如,通过在顶部将边线分层来使其不可读

首先,我想出了一个幼稚的解决方案。我有了起点和终点,并基于这些起点和终点,创建了一个简单的算法,计算出沿路径总共6个点(含起点和终点),通过该点可以绘制SVG折线。所有这些都很好用,但是一旦绘制出包含50个以上Tasks和Edges的Demo案例,它看起来就像一团糟并且不可读。我的任务是进行优化以减少不必要的边缘交叉以及提高可见性。

无论我尝试什么,改进幼稚的尝试都行不通。谷歌搜索之后,我发现优化诸如减少未解决的边缘交叉口是一项不平凡的NP艰巨任务,并且鉴于该模型以及任务位置已经计算并固定的事实,我选择不尝试优化在这个方向上。

相反,我实现了A *算法,并将正在开发的图表组件与A *连接起来,以使该算法自动计算最佳路径。这虽然提高了可见性,但是在庞大的szenario中看起来仍然很恐怖。此外,我可以轻松地创建一些特定情况,在这些情况下,给定的数据导致我的A *实现无法找到美观的路径。

我做了其他尝试来改善这种情况,例如按照特定顺序绘制边缘以减少可避免的边缘交叉。

问题:我还能做些什么使它正常工作?我真的很努力地尝试这一工作,并试图使其适用于用户可能加载的每种可能的情况……嗯,我在这里。

如果需要,还可以发布一些代码,但是到目前为止,整个组件的代码行数约为2k。

0 个答案:

没有答案