什么可以是一个优化的算法修改饼图与最小重绘量?

时间:2013-11-08 08:27:47

标签: algorithm

例如,我有一个饼图,其中我有n个组件,我在数组中有它们的百分比值。现在我更新了百分比数组,我想要重新绘制饼图。是否有任何算法可以用最少的颜色变化来绘制它? 我认为A *可以是最佳解决方案,但找到这个问题的启发式算法很难。

3 个答案:

答案 0 :(得分:2)

就个人而言,我不会打扰我只是重新绘制饼图。我希望通过不重新绘制图表中未更改的部分而节省的时间将会花费在确定要更改的内容上的时间。

然而,这是一个想法:

将饼图绘制为一组以圆圈排列的100个三角形。如果100不足以使图表看起来漂亮,请选择100的整数倍。假设段A是原始图表的20%并且是图表中的第一个(从12点顺时针计数)段。在绘画上只需要颜色三角形1-20。如果段A扩展到25%,则重新绘制三角形21-25。等等。

我认为我从来没有见过一个饼图,其中百分比的百分比在视觉上是有意义的,所以我不会因为处理23.8%这样的值而出汗,我只是围绕它们。

答案 1 :(得分:1)

这不是解决方案。我只是试图将问题正式化,看看我是否能想出一些东西。我担心问题没有解决方案,计算成本低。

让我们从形式化问题开始:

<强>输入:

圆周上有两组n个点:

A(1).. A(n)和B(1).. B(n),每个都定义了一组弧,这样

  • 更改前:弧m介于角度A(m)和角度A(mod(m + 1,n))之间
  • 变化后:弧m在角度B(m)和角度B(mod(m + 1,n))之间

基础数学:

角度x和y之间的弧的弧长是 mod(y-x,360)(弧顺时针方向标记)。

其中 mod(a,b)= a-b * floor(a / b)*

我们将 O(a1,a2,b1,b2)标记为arc [a1,a2)和arc [b1,b2]之间的交点。

注意两个弧可以有0到2个交点。例如O(270,100,90,280)= {[270,280),[90,100}},而O(10,20,30,40)= {}

我们将 L(a1,a2,b1,b2)标记为弧[a1,a2]和弧[b1,b2]之间较大交点的弧长。

我不会在这里描述L(a1,a2,b1,b2)的计算。

特殊情况:保持弧的顺序相同:

找到最大化

的绘图偏移 w

L(A(1),A(2),mod(B(1)+ w,360),mod(B(2)+ w,360))+

L(A(2),A(3),mod(B(2)+ w,360),mod(B(3)+ w,360))+ ... +

L(A(n)时,A(1),MOD(B(N)+ W,360),B(1),MOD(B(1)+ W,360)

一般情况:不保持弧的顺序相同:

同时找到

  • 由点集B
  • 定义的弧组顺序的排列
  • 图纸偏移w

最大化与特殊情况相同的表达式。

我的想法

我担心由于模数函数的不连续性,找不到最佳解决方案是没有简单的方法。

对于特殊情况,您可以简单地从给定分辨率(例如0.1度)开始搜索最佳 w ,并将分辨率提高到最佳值附近(您不需要子分辨率)无论如何,像素分辨率。)

至于一般情况,我相信你必须找到一个良好的启发式来限制置换集 - 可能是在大约相同的位置留下大弧。

答案 2 :(得分:0)

猜测它不仅仅是重新制作你的作品,而是制作dubbelbuffer,比较,画出差异。