我正在绘制高程剖面图,显示沿着轨迹的高程增益/损失,类似于下面的那个:
这基本上是一个折线图,其中x轴为起点,y轴为高程。
我想在沿着路径的有趣点提供带有点高程的花式标签,就像我手工添加到样本图像中的那些。我正在寻找关于如何最好地放置这些标签的想法:
为实现这些目标,我认为我可以(至少):
PlaceName
已经以非常好的方式支持缩写,因此从“南双山”切换到“S Twin Mtn”很容易)但我不知道如何最好地构建这个算法。这似乎是一个优化问题? (最小化与注释相关的臭,并为我试图避免的每一件事提供数字惩罚?)但是因为有很多离散变量需要优化而且我并不真正关心“最佳”解决方案(只是一个好的,最好是稳定的)我不知道该怎么做。
通常如何处理图形中的问题?动态编程?分支?优化理念是否偏离基础?是否有任何有用的.NET库我可能想看一下?
(我不想直接将它放到一般的图形绘制库中,因为它是整个产品的一个关键特性,我计划了一些更多自定义功能,可能很难插入通用图形绘图库)
答案 0 :(得分:2)
这是我的看法:
2*size
现在再次翻看标签,看看是否可以从一侧翻转到另一侧,同时缩短垂直线的长度。
在我看来,应该会产生不错的输出。
答案 1 :(得分:1)
我可能会放置一个标签,然后放置下一个标签,检查它是否与第一个标签重叠,如果是这样,请将其翻转,如果不起作用,则将其向上轻推,直到它不再重叠为止...无论如何,这是一个起点。也许添加一个成本函数作为距离理想或默认位置的距离(如果没有其他标签可以阻挡),这将被最小化。然后找到成本最低的标签排列。可以给出翻转,移动,旋转,缩写和丢弃每个不同的成本。
答案 2 :(得分:1)
这个问题让我想起了我不久前的一个图形项目。它是以最令人愉悦的方式绘制数学图(如在节点和边缘中)。有几种方法,但我最喜欢的是物理方法。您将每个节点视为带电粒子,将所有其他节点和每个边缘排斥为具有一定理想长度的经典弹簧。你运行几百个步骤,最终达到一个具有适当阻尼效果的稳定状态。
我发现你的问题有许多相似之处。文本框是节点,引导线是边缘。
必须进行修改。例如,应该有一个向上的正向力,因此它们不会低于图形。您还必须考虑向左或向右翻转文本的想法。但它应该在大多数投入上给出合理的结果。
我为我的项目引用的文章是here。