2017-10-05 105 views
-1

比方說,我有一些不同顏色的球。舉例來說,我們假設4個紅球,4個藍球和2個綠球。如果我要平均分配這些球,使相同顏色的兩個球之間最一致的距離保持我可能有以下順序:算法:如何均勻分佈不同的綵球?

RBGRBRBGRB

即使藍色和紅色球並不總是與他們的同行距離相同,他們的排列方式保持了他們的距離一致,同時也保持了綠球的一致性

在6個紅球,5個藍球和3個綠球的情況下,我可以有例如:

RBRGBRBGRBR- G-R

我不完全確定「相同顏色的兩個球之間最一致的距離」的標準是什麼,但有沒有某種算法或通用解決方案可以解決這個問題?這個問題的正式名稱是什麼,如果是這樣的話?

+0

豈不GRBRBRBRBG或RGRBRBRBGB更加一致? R之間的距離總是2,B之間總是2,G之間總是9(或7)。 – m69

回答

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; } 
    } 
} 

第一色數,y1-y0第二等替換x1-x0。相應顏色的成功,如果條件輸出:

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