例如,我绘制了一个饼图,其中有 n 个组件,并且它们的百分比值位于数组中。现在我更新了百分比数组,我想重新绘制饼图。是否有任何算法可以以最小的颜色变化来绘制它?我在想 A* 可能是最佳解决方案,但很难找到解决这个问题的启发式方法。
3 回答
就我个人而言,我不会打扰我只是重新绘制饼图。我希望通过不重新绘制图表的未更改部分所节省的时间将被花费在弄清楚要更改的时间上的时间所淹没。
不过,这里有一个想法:
将饼图绘制成一组 100 个三角形排列成一个圆圈。如果 100 不足以使图表看起来漂亮,请选择 100 的某个整数倍。假设分段 A 是原始图表的 20%,并且是图表中的第一个(从 12 点钟顺时针计数)分段。在绘画时,只需根据需要为三角形 1-20 着色。如果分段 A 扩大到 25%,则重新绘制三角形 21-25。等等。
我想我从来没有见过一个饼图,其中百分比的分数在视觉上是有意义的,所以我不会为处理诸如 23.8% 之类的值而烦恼,我只是将它们四舍五入。
这不是解决方案。我只是试图将问题形式化,看看我是否能想出一些办法。恐怕这个问题没有计算成本低的解决方案。
让我们从形式化问题开始:
输入:
圆周上的两组有序 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(yx,360)(弧是顺时针表示的)。
其中mod(a,b) = ab *floor(a/b)*
我们将O(a1,a2,b1,b2)标记为弧 [a1,a2) 和弧 [b1,b2) 之间的交点。
请注意,两条弧线可以有 0 到 2 个交点。例如 O(270,100,90,280)= {[270,280),[90,100)},而 O(10,20,30,40)= {}
我们将L(a1,a2,b1,b2)标记为 arc [a1,a2) 和 arc [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,并增加接近最佳 w 的分辨率(无论如何您不需要亚像素分辨率)。
至于一般情况,我相信你必须找到一个很好的启发式来限制排列集 - 也许通过在大约相同的地方留下大弧。
猜猜它不仅仅是在你之后重新粉刷工作,而是.. 制作 dubbelbuffer,比较,油漆差异。