【问题标题】:How to subdivide a shape into sections of a given size如何将形状细分为给定大小的部分
【发布时间】:2012-07-26 23:06:41
【问题描述】:

我目前正在尝试构建一种饼图/voronoi 图混合(在画布/javascript 中)。我什至不知道这是否可能。我对此很陌生,我还没有尝试任何方法。

假设我有一个圆圈和一组数字 2、3、5、7、11。

我想将圆圈细分为与数字等效的部分(很像饼图),但形成格子/蜂窝状的形状。

这甚至可能吗?这是否非常困难,尤其是对于只做了一些基本饼图渲染的人来说?

【问题讨论】:

  • 哎哟。祝你好运!
  • 你应该更具体地了解“蜂窝”,基本上,当部分数量为某个数字时,它应该是什么样子n
  • 是的,这是可能的,而且不太难。仅:您打算如何选择定义形状的generator points?这最终可能需要更高的几何形状 - 饼图只是一个特殊的(欧几里德)voronoi,点在一个圆圈上。
  • 我所说的蜂窝只是指一个分成多个角形状的圆。我将如何选择生成器点是问题的一部分。我知道数字,也知道面积,因此我知道每个部分所占面积的百分比——但是这些点可以通过多种随机方式进入这个圆圈。例如,在上面的简单版本中,2 可以与 5 交换。
  • 这似乎不是不可能,但我看到了一些困难。一方面,您的解决方案不会是独一无二的,因此不同的人可能会给出完全不同的解决方案。另一方面,确保一个圆圈上的区域相同似乎真的很让人头疼。它需要一些实际的几何图形才能使其工作。你和圈子结婚了吗?因为我认为正方形会更容易使用。

标签: javascript math graphics graph charts


【解决方案1】:

给定一组 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);

这是区域和期望区域之间的差向量的向量范数。可以把它想象成衡量最小二乘拟合线的好坏程度。

我们还想要某种蜂窝图案,所以我们可以称之为honeycombness(positions),并获得事物质量的整体衡量标准(这只是一个开始,它的权重或形式可以是任何浮动的船):

var overallMeasure = areaIndex + honeycombnessIndex;

那么我们就有了一个知道猜测有多糟糕的机制,我们可以将它与修改位置的机制结合起来;最简单的就是在每个中心的 x 和 y 坐标上添加一个随机量。或者,您可以尝试将每个点移向面积过高的相邻区域,并远离面积过低的区域。

这不是一个直接的解决方案,但除了计算最接近每个点的区域外,它只需要最少的数学运算,而且很容易上手。困难的部分可能是识别局部最小值并处理它们。

顺便说一句,获得流程的起点应该相当容易;饼片的质心不应该离真相太远。

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

【讨论】:

    【解决方案2】:

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

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

    通过评估“总边界接近所需边界”的不同预期多边形位置,您可能可以生成与初始目标的廉价近似值。这与词云的作用非常相似:将事物从最大到最小递增地放置,同时尝试填充或多或少封闭的空间。

    【讨论】:

      【解决方案3】:

      这是我快速浏览后的看法。

      假设有n 多边形和k 顶点/边,一个通用解将取决于n 方程的解,其中每个方程不超过2nk,(但恰好是@ 987654325@非零)变量。每个多边形方程中的变量都是相同的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 &lt;= r^2

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

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

      A_i = pi*r^2/S_i

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-16
        • 1970-01-01
        • 1970-01-01
        • 2017-12-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 2020-03-12
        相关资源
        最近更新 更多