2012-07-28 55 views
4

我目前正在尝试构建一种饼图/ voronoi图混合(在canvas/javascript中)。我不知道它是否可能。我对此很新,而且我还没有尝试过任何方法。如何将形状细分为给定大小的部分

假设我具有圆形,以及一组数字2,3,5,7日,11

欲细分成圆等效于号码(很像饼图)部分但形成格子/蜂窝状形状。

enter image description here

这是可能的吗?这是否是非常困难的,特别是对于只做了一些基本饼图渲染的人?

+0

Ouch。祝你好运! – Utkanos 2012-07-28 14:48:21

+0

你应该更具体一些关于“蜂巢”的问题,基本上,它应该如何看起来应该是什么样子,当部分的数量是一些数字'n'? – Andreas 2012-07-28 15:27:03

+0

是的,这是可能的,而不是太困难。只有:你如何去选择定义形状的[生成点](http://en.wikipedia.org/wiki/Voronoi_diagram)?这最终可能需要更高的几何结构 - 饼图仅仅是一个特殊的(欧几里德)voronoi,圆上的点。 – Bergi 2012-07-28 15:29:54

回答

0

这是我对此的看法。

的一般解,假设有可n多边形与k顶点/边,将取决于溶液到n方程,其中每个方程具有不超过2nk,(但究竟2k非零)的变量。每个多边形方程中的变量与变量x_1, x_2, x_3... x_nky_1, y_2, y_3... y_nk相同。 x_1, x_2, x_3... x_nk中的正好四个具有非零系数,并且y_1, y_2, y_3... y_nk中的四个对于每个多边形方程具有非零系数。 x_iy_i根据父级形状的不同而有所不同。为简单起见,我们将假设形状为圆形。边界条件是:(x_i)^2 + (y_i)^2 <= r^2

注:我说不超过2nk,因为我不确定下限,但知道它不能超过2nk。这是多边形作为要求共享顶点的结果。

的方程是确定的集合,但变量有界的,表示每个多边形的面积积分,与该面积相等的ith多边形:

A_i = pi*r^2/S_i

其中r是的半径父圆圈和S_i是分配给多边形的编号,如图中所示。

四个单独的(x_j,y_j)对在多边形方程中都具有非零系数将产生多边形的顶点。

这可能证明是相当困难的。

0

边界是从一开始就固定的,还是可以变形一点?

如果我必须解决这个问题,我会将区域从大到小排序。然后,从最大的区域开始,我首先会生成一个随机的凸多边形(沿着一个圆的顶点),并具有所需的大小。下一个区域将与第一个区域共享一个边缘,但是否则也是随机的并且是凸的。之后,每个多边形将从已存在的多边形中选择一个已存在的边,并且还将共享从那里开始的任何“凸”边(其中,'凸边'是用于新多边形时将导致新多边形仍然凸出)。

通过评估“全部边界进近所需边界”的不同预期多边形位置,您可能可以为您的初始目标生成一个便宜的近似值。这与word-cloud的做法非常相似:在尝试填充一个或多或少的封闭空间时,将事物从大到小递增。

0

给定一组voronio中心(即中心为每一个坐标列表),我们可以最接近计算面积,以每个中心:

area[i] = areaClosestTo(i,positions) 

假设这些都是有点不对劲,因为我们没有把中心放在正确的地方。因此,我们可以通过比较领域的理想区域计算在我国目前的设置错误:

var areaIndexSq = 0; 
var desiredAreasMagSq = 0; 
for(var i = 0; i < areas.length; ++i) { 
    var contrib = (areas[i] - desiredAreas[i]); 
    areaIndexSq += contrib*contrib; 
    desiredAreasMagSq += desiredAreas[i]*desiredAreas[i]; 
} 
var areaIndex = Math.sqrt(areaIndexSq/desiredAreasMagSq); 

这是地区和desiredAreas的差分矢量的矢量范数。把它看作是衡量最小二乘拟合线的好坏的一个指标。

我们也想要某种蜂窝图案,所以我们可以称之为honeycombness(positions),并获得对物体质量的全面测量(这只是一个起动器,其权重或形式可以是浮在你的船上的任何东西):

var overallMeasure = areaIndex + honeycombnessIndex; 

然后我们有一个机制,要知道一个猜测是多么糟糕,我们可以用一个机制,结合本作修改的位置;最简单的就是给每个中心的x和y坐标添加一个随机数。或者,您可以尝试将每个点移动到面积过高的相邻区域,并远离面积过小的相邻区域。

这不是一个直接的解决方案,但除计算最接近每个点的面积外,它需要最少的数学,并且它是平易近人的。困难的部分可能是认识当地的最低标准并处理它们。

顺便说一句,它应该很容易得到过程的起点;馅饼切片的质心不应该离真相太远。

一个明确的优点是,您可以使用中间计算来动画从饼图到voronoi的过渡。

相关问题