這是一個老問題,但我最近對同一件事的工作。你所要做的是如你所說,高斯的圈子的問題,這是有點描述here
雖然我也有困難understaning這一切的背後嚴重的數學,它或多或少地平底鍋出來的時候不使用奇怪的到外星人的符號是這樣的:
1 + 4 * sum(i=0, r^2/4, r^2/(4*i+1) - r^2/(4*i+3))
其在java中至少是:
int sum = 0;
for(int i = 0; i <= (radius*radius)/4; i++)
sum += (radius*radius)/(4*i+1) - (radius*radius)/(4*i+3);
sum = sum * 4 + 1;
我不知道爲什麼或如何工作的,老實說我是個有點鬱悶我必須使用循環弄清楚這一點,而不是一條線,因爲它意味着表演nce是O(r^2/4)而不是O(1)。
由於數學嚮導似乎無法比循環做得更好,因此我決定查看是否可以將它歸結爲O(r + 1)的性能,這是我做的。所以不要使用上面的,使用下面的。 O(r^2/4)很糟糕,即使我的平方根使用也會變慢。
int sum = 0;
for(int x = 0; x <= radius; x++)
sum += Math.sqrt(radius * radius - x * x);
sum = sum * 4 + 1;
什麼這個代碼是從中心環出沿着正交線的邊緣,並且在每個點處從管線添加的距離在一個perpendicualr方向到邊緣。最後它將在四分位數中得到點數,所以它將結果翻兩番,並增加一個,因爲也有中心點。我覺得wolfram方程做了類似的事情,因爲它也乘以4並加1,但是IDK爲什麼會循環r^2/4。
老實說,這些都不是很好的解決方案,但它似乎是最好的。如果您正在調用定期執行此操作的函數,那麼隨着新的半徑出現,將結果保存在查找表中,而不是每次都執行完整的計算。
它不是你的問題的一部分,但它可能是相關的人,也許這樣我會反正添加它。我親自致力於通過定義細胞的圓內尋找所有的點:
(centreX - cellX)^2 + (centreY - cellY)^2 <= radius^2 + radius
這使整個事情不正常的,因爲額外的+半徑使得這種不完全勾股定理。多餘的一點讓這些圓圈在網格上看起來更吸引人,因爲它們在正交邊緣上沒有那些小丘疹。事實證明,是的,我的形狀仍然是一個圓形,但它使用sqrt(r^2 + r)作爲半徑而不是r,這顯然有效,但不問我如何。反正這意味着,對於我來說,我的代碼略有不同,看起來更像是這樣的:
int sum = 0;
int compactR = ((radius * radius) + radius) //Small performance boost I suppose
for(int j = 0; j <= compactR/4; j++)
sum += compactR/(4 * j + 1) - compactR/(4 * j + 3);
sum = sum * 4 + 1;