(简单?)线图的标签放置

时间:2009-06-23 00:01:54

标签: optimization graphics charts gis

我正在绘制高程剖面图,显示沿着轨迹的高程增益/损失,类似于下面的那个:

Sample Elevation Profile with hand-placed labels http://img38.imageshack.us/img38/4079/profilewithgoodlabels.png

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

我想在沿着路径的有趣点提供带有点高程的花式标签,就像我手工添加到样本图像中的那些。我正在寻找关于如何最好地放置这些标签的想法:

  • 它们彼此不重叠
  • 它们与配置文件本身不重叠,或者至少这种情况以干净的方式发生(例如,似乎在陡峭的山谷中间可能是必要的),
  • 它们不会延伸到限制整体图像的框外

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

  • 翻转文字(参阅示例)
  • 为领导者选择合适的长度
  • 为领导者选择合适的角度(但出于审美原因,最小化变化可能是合乎需要的)
  • 在拥挤的地区降低不太重要的地方的地点高度
  • 拥挤区域中的缩写名称(我的环境中的PlaceName已经以非常好的方式支持缩写,因此从“南双山”切换到“S Twin Mtn”很容易)
  • 完全在拥挤的区域删除不太重要的注释

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

通常如何处理图形中的问题?动态编程?分支?优化理念是否偏离基础?是否有任何有用的.NET库我可能想看一下?

(我不想直接将它放到一般的图形绘制库中,因为它是整个产品的一个关键特性,我计划了一些更多自定义功能,可能很难插入通用图形绘图库)

3 个答案:

答案 0 :(得分:2)

这是我的看法:

  1. 标记要放置标签的点
  2. 将它们分成两组,距离至少为2*size
  3. 对于每个小组,请从右侧尝试放置标签。
  4. 尝试将标签放在右侧或左侧。查看垂直线长度较短的结果
  5. 如果无所谓,请尝试将其置于右侧
  6. 除非是小组的结尾,否则请尝试将其放在左侧
  7. 现在再次翻看标签,看看是否可以从一侧翻转到另一侧,同时缩短垂直线的长度。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

必须进行修改。例如,应该有一个向上的正向力,因此它们不会低于图形。您还必须考虑向左或向右翻转文本的想法。但它应该在大多数投入上给出合理的结果。

我为我的项目引用的文章是here