发布于 2026-01-06 0 阅读
0

通过测量圆的面积来计算 π……在 JavaScript DEV 的全球展示挑战赛中,由 Mux 呈现:展示你的项目!

使用 JavaScript 通过测量圆的面积来计算 π。

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

这是一个有趣的 JavaScript 小程序,你可以自己实现,也可以和编程俱乐部的年轻程序员一起,或者在家里实现。

数学

自阿基米德时代起,人们就已知道π的近似值。多年来,许多数学家和研究人员致力于以越来越高的精度计算π的值。人们
已经发现了许多计算这个奇妙数字的新方法。

了解π非常重要,因为它的值在许多数学应用中都会用到。其中最著名的应用可能是计算已知半径的圆的周长和面积。

在本文中,我们将尝试用一种即使是中学生也能理解的方法来计算 π 的近似值——我们将手动测量圆的面积,然后反向推导 π 的值。

我们从数学课上知道,圆的面积是:

A = πr²

我们通常用这个方程来解面积或半径。但这次我们要解这个方程来解π。

π = A / r²

算法

为了解这个方程,我们将借助 JavaScript 使用一种经验方法。这种方法非常简单:

  • 步骤 1:假设一个半径为 r 的圆。
  • 步骤二:用一个紧密的正方形包围圆。正方形的边长等于圆的直径。
  • 步骤 3:通过计算圆内所有像素的数量来确定圆的面积。
  • 步骤 4:通过将面积除以半径的平方来确定 π,就像上面的公式一样。

替代文字

挑战1:正如你所见,算法很简单,但第一个挑战已经出现。在步骤3中,我们提到需要判断一个点是否在圆内。

为了实现这一点,我们将扫描外正方形内的所有点,并判断该点是否在圆内。这是通过比较圆的半径与该点到圆心的距离来实现的。

如果距离小于或等于半径,则该点在圆内。

替代文字

由于这是一种经验方法,我们将尝试使用足够大的圆来提高计算精度。使用半径较小的圆可能会导致 π 近似值不够精确,因为圆的形状不够理想。请参见下图:

替代文字

挑战二:前一个挑战本身又提出了一个新的挑战:我们如何确定两点之间的距离?

答案是:借助一点几何知识和勾股定理。

由于我们知道这两个点的坐标,我们可以确定三角形的边,然后利用勾股定理求出斜边。

下图应该足以说明问题。

替代文字

现在我们已经有了开始编写计算 π 的 JavaScript 代码所需的所有数据。

您可以使用任何 JavaScript 环境或 Playground 来编写代码。在本文中,我们将使用免费的codeguppy.com环境(不妨创建一个免费帐户——您会玩得很开心)。

虽然我们之前只讨论了图形概念,但代码不会使用任何图形库。我们可以完全使用纯 JavaScript 来实现这个算法,而无需绘制圆形或方形。

var p = calcPI();
println(p);

function calcPI()
{
    // Choose an arbitrary circle radius
    var r = 100;
    var diameter = r * 2;
    var area = 0;

    // Scan all the pixels inside the square
    for(var x = 0; x < diameter; x++)
    {
        for(var y = 0; y < diameter; y++)
        {
            // Calculate the distance from each pixel
            // to the center of the circle
            var d = dist(x, y, r, r);
            if (d <= r)
            {
                // If distance is less than the radius
                // then add it to the area of the circle
                area++;
            }
        }
    }

    // Calculate PI by dividing the area to the 
    return area / (r * r);
}

如果您将上述代码复制到codeguppy.com编辑器中并运行,您将看到显示的结果:

3.1415

对于如此简单的经验方法来说,这个结果相当准确!

注意:我们没有定义用于计算两点之间距离的 dist 函数。这是因为该函数已在codeguppy.com中定义。但是,如果您想在codeguppy.com之外运行代码,则可以按照上述说明,仅需几行代码即可轻松实现该函数。
我们将 dist 函数的实现留给感兴趣的读者自行练习。

想象圆圈

正如你所见,使用这种方法计算π不需要任何图形库。不过,既然我们身处图形化环境中,不妨稍微增加一些趣味性,将我们正在扫描的点可视化。

我们将使用 point 函数来绘制扫描点,如果扫描点位于圆内,则绘制“青色”;如果扫描点位于圆外,则绘制“浅蓝色”。

只需在正确的位置添加以下内容stroke()和行:point()

...
            if (d <= r)
            {
                // If distance is less than the radius
                // then add it to the area of the circle
                area++;

                stroke("teal");
            }
            else
            {
                stroke("lightblue");
            }

            point(x, y);
...

这就是执行效果:

替代文字

希望你享受这次 JavaScript 数学探索之旅!

您可以在此 Playground 中找到此代码的运行示例:https://codeguppy.com/code.html?Z25MRrzMBK8zRwDaeaZY

祝您编程愉快,别忘了分享您的编程经验!

文章来源:https://dev.to/codeguppy/calculate-pi-by-measuring-the-area-of-a-circle-in-javascript-db1