5

我正在绘制高程剖面,显示沿路径的高程增益/损失,类似于下面的:

带有手工放置标签的示例海拔剖面 http://img38.imageshack.us/img38/4079/profilewithgoodlabels.png

这基本上是一个折线图,x 轴为起点,y 轴为高程。

我想在沿途的有趣点提供带有点高程的精美标签,就像我手动添加到示例图像中的那些。我正在寻找有关如何最好地放置这些标签的想法,以便:

  • 它们不相互重叠
  • 它们不与轮廓本身重叠,或者至少以一种看起来很干净的方式发生(例如,在陡峭的山谷中间可能有必要)
  • 它们不会延伸到限制整体形象的盒子之外

为了实现这些目标,我认为我可以(至少):

  • 翻转文本(参见示例)
  • 为领导者选择合适的长度
  • 为领导者选择合适的角度(但出于审美原因,可能需要尽量减少变化)
  • 在拥挤区域中为不太重要的地方放置点高程
  • 拥挤地区的缩写名称(PlaceName我的环境中的 s 已经以非常好的方式支持缩写,因此从“South Twin Mountain”切换到“S Twin Mtn”很容易)
  • 在拥挤的区域完全删除不太重要的注释

但我不知道如何最好地构造这个算法。这似乎是一个优化问题?(尽量减少与注释相关的臭味,并为我试图避免的每件事提供一个数值惩罚?)但是由于有很多离散变量需要优化,我并不真正关心“最佳”解决方案(只是一个好的,最好是稳定的)我不知道该怎么做。

通常如何处理图形中的此类问题?动态规划?分支和绑定?优化的想法是否有根据?是否有任何我可能想要查看的有用的 .NET 库?

(我不想把它完全交给一个通用的绘图库,因为它是整个产品的一个关键特性,而且我计划了一些更多的自定义特性,这些特性可能很难塞进一个通用的绘图库中)

4

3 回答 3

2

这是我的看法:

  1. 标记要放置标签的点
  2. 2*size将它们分成组,它们之间的距离至少为
  3. 对于每个组,从右边开始尝试贴上标签。
  4. 尝试将标签放在右侧或左侧。查看哪个导致垂直线的长度较短
  5. 如果没关系,尽量放在右边
  6. 除非它是组的末尾,然后尝试将其放在左侧

现在再次检查标签,看看是否可以将任何标签从一侧翻转到另一侧,同时缩短垂直线的长度。

在我看来,应该会产生不错的输出。

于 2009-06-23T00:10:41.100 回答
1

我可能会放置一个标签,然后放置下一个,检查它是否与第一个标签重叠,如果是这样翻转它,如果这不起作用,向上轻推它直到它不再重叠......作为起点反正。也许添加一个成本函数作为与理想或默认位置的距离(如果没有其他标签妨碍),这将被最小化。然后找到成本最低的标签排列。可以给翻转、移动、旋转、缩写和丢弃每个不同的成本。

于 2009-06-23T00:08:45.817 回答
1

这个问题让我想起了我不久前做的一个图形项目。它是以最令人愉悦的方式绘制数学图(如节点和边)。有几种方法,但到目前为止我最喜欢的是物理方法。您将每个节点视为排斥所有其他节点的带电粒子,将每个边缘视为具有理想长度的经典弹簧。您运行几百个时间步,最终达到具有适当阻尼效果的稳定状态。

我看到你的问题有很多相似之处。文本框是节点,引导线是边缘。

必须对其进行修改。例如,应该有一个向上的正向力,这样它们就不会低于图表。您还必须结合将文本向左或向右翻转的想法。但它应该对大多数输入给出合理的结果。

我为我的项目引用的文章在这里

于 2009-06-23T00:16:27.720 回答