首页 文章

算法:如何均匀分布不同颜色的球?

提问于
浏览
-1

假设我有一些不同颜色的球 . 为了举个例子,我们假设有4个红球,4个蓝球和2个绿球 . 如果我想均匀分布这些球,以便保持两个相同颜色的球之间的最一致的距离,我可以有以下顺序:

R-B-G-R-B-R-B-G-R-B

尽管蓝色和红色球与其对应球的距离并不总是相同,但它们的排列方式使得它们的距离保持一致,同时保持了绿球的一致性 .

在6个红球,5个蓝球和3个绿球的情况下,我可以有类似的东西:

R-B-R-G-B-R-B-G-R-B-R-G-R

我不完全确定“相同颜色的两个球之间的最大距离”的标准是什么,但是有某种算法或通用解决方案可以解决这个问题吗?如果是这种情况,这个问题的正式名称是什么?

1 回答

  • 0

    此问题类似于nD空间中的线条绘制(此处为3D) . 因此,您可以使用类似Bresenham / DDA的算法生成具有公平项目分布的序列(而不是在任何维度上公平分布像素移位) . 任意found example
    (我没有检查它的正确性 - 也许分区 dm/2 可能会产生比错误加倍更糟糕的结果):

    void plotLine3d(int x0, int y0, int z0, int x1, int y1, int z1)
    {
       int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1;
       int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1; 
       int dz = abs(z1-z0), sz = z0<z1 ? 1 : -1; 
       int dm = max(dx,dy,dz), i = dm; /* maximum difference */
       x1 = y1 = z1 = dm/2; /* error offset */
    
       for(;;) {  /* loop */
          setPixel(x0,y0,z0);
          if (i-- == 0) break;
          x1 -= dx; if (x1 < 0) { x1 += dm; x0 += sx; } 
          y1 -= dy; if (y1 < 0) { y1 += dm; y0 += sy; } 
          z1 -= dz; if (z1 < 0) { z1 += dm; z0 += sz; } 
       }
    }
    

    x1-x0 替换为第一个颜色计数, y1-y0 替换为秒,依此类推 . 在成功的if条件下输出相应的颜色:

    {x1 -= dx; if (x1 < 0) { x1 += dm; x0 += sx; HERE }

相关问题