查找给定圆中正方形数量的算法

Posted

技术标签:

【中文标题】查找给定圆中正方形数量的算法【英文标题】:Algorithm for finding number of squares in a given circle 【发布时间】:2014-12-05 20:57:20 【问题描述】:

这是我的画:CLICK

我需要编写一个程序,它会找到正方形的数量(1x1),我们可以绘制成给定半径的圆。正方形只能完全绘制并像乐高积木一样放置 - 一个接一个。在某些情况下,正方形的顶点可以位于圆上。

示例:对于 1- 它产生 0,对于 2- 它产生四个,对于 3- 16 个正方形,对于 4-32,对于 5-52。

我已经写了一些东西,但是对于 5+(我的意思是半径大于 5)它不能正常工作。在这里:CLICK。在我的代码中,r 是圆的半径,sum 是所有正方形的总和,height 是我尝试“绘制”到圆中的三角形的高度(使用勾股定理)。

现在——有什么帮助吗?我的算法是否正确?我应该改变什么吗?

【问题讨论】:

您的示例对我来说看起来不正确。例如,在蓝色圆圈内看,有许多正方形(大约是绿色矩形占据的 1/2)也适合蓝色圆圈。 当您说 in 时,您希望方块完全在或部分在? @Cyber​​ 我正在准备更精确的绘图,整个正方形必须在圆圈内 @Cyber​​ ,如您在此处看到的:i.imgur.com/vjUZdsc.jpg ,只有 1 到 4 的正方形适合圆圈,其余的 (5,6,7,8) 不正确。跨度> @NWafel 哦,好吧,所以在您的原始示例中,正方形是您论文中的 2x2 网格。我以为你用的是网格纸上的 1x1 方格,我错了。 【参考方案1】:

Gauss's Circle Problem 给出了一个公式来计算给定半径的圆内的整数点。您可以使用此逻辑来计算圆中的正方形。

N = 4 * Sum[i=1..R] (Floor(Sqrt((R^2-i^2)))

示例:

R = 3
i=1   n1 = Floor(Sqrt(9-1))~Floor(2.8)=2
i=2   n2 = Floor(Sqrt(9-4))~Floor(2.2)=2
i=3   n2 = Floor(Sqrt(9-9))=0
N=4*(n1+n2+n3)=16

【讨论】:

【参考方案2】:

首先关闭 - 半径为 5 的圆适合 60 个 1x1 正方形,而不是 52。我敢打赌有人没有计算点 [3,4],[3,-4 ],[4,3],[4,-3],[-4,3],[-4,-3],[-3,4],[-3,-4] 在纸上绘制时并用手数数,不确定它们是在圆圈上还是在圆圈外。他们正好在圆圈上。

第二 - MBo 的回答把我带到了这里 - 我有时会在 *** 上搜索高斯圆问题,看看是否有人提出了一些新的、有趣的算法。

第三 - 这是代码:

int     allSquares=0,
        squaredRadius=radius*radius,
        sideOfQuarterOfInscribedSquare=(int)(long)(radius/sqrt(2));
for(int x=sideOfQuarterOfInscribedSquare+1;
        x<radius;
        x++)
    allSquares+=(long)sqrt(squaredRadius-x*x);

allSquares= allSquares*8+4*sideOfQuarterOfInscribedSquare*sideOfQuarterOfInscribedSquare;
return allSquares;

它所做的只是计算圆八分之一内的正方形,内接正方形之外的正方形。抱歉我的时髦格式和过于冗长的变量名。

【讨论】:

以上是关于查找给定圆中正方形数量的算法的主要内容,如果未能解决你的问题,请参考以下文章

圆内怎么画标准五角星

算法将点放入具有最大最小距离的正方形

点H,G,E,F,是正方形ABCD各边的中点,求图中正八边形(阴影部分)是正方形ABCD面积的几分之几?

K近邻算法

使用IDEA开发Spark程序

478. Generate Random Point in a Circle