📜  在二进制编号的圆中仅使用1的常规多边形(1)

📅  最后修改于: 2023-12-03 15:07:57.686000             🧑  作者: Mango

在二进制编号的圆中仅使用1的常规多边形

在计算机科学中,我们经常遇到用二进制数字表示的圆形。在这样的圆中,我们可以使用“常规多边形”即仅使用1的多边形,来填充圆中的区域,通过这种方式实现图形渲染。

进制转换

在开始讨论常规多边形之前,我们需要了解一些基础的进制转换知识。在计算机科学中,所有数字都是以二进制形式进行存储和处理的。因此,我们需要将十进制表示的圆的直径转换为二进制形式。例如,如果圆的直径是10,那么它的二进制表示为1010。

常规多边形

现在我们已经有了二进制编码的圆,我们需要填充它们。我们可以使用一种叫做“常规多边形”的形状来填充。这种形状仅仅使用1,可以被认为是“完美”的形状。

常规多边形的数量由其阶数决定。阶数是指多边形的顶点数,因此第一阶只有一个顶点(即一个点),第二阶有两个顶点(即一条线段),第三阶有三个顶点(即一个三角形),以此类推。

为了绘制常规多边形,我们需要一种算法来确定多边形中点的坐标。这个算法叫做的“正多边形方程”。

正多边形方程的一般形式为:

其中,x和y表示坐标,r表示多边形半径,n表示多边形的阶数,k是一个介于0到n-1的整数,表示多边形的不同面。

我们可以将这个方程用代码的形式实现。例如,以下代码可以用来计算二阶多边形的坐标:

function drawPolygon2(r, x0, y0) {
  const v = r * Math.sqrt(2) / 2;
  const path = `M ${x0 - v} ${y0 - v} L ${x0 + v} ${y0 + v} M ${x0 + v} ${y0 - v} L ${x0 - v} ${y0 + v}`;
  return path;
}
绘制圆形和填充方案

我们已经了解了如何计算常规多边形的坐标,我们可以用这些常规多边形填充圆形。我们只需要计算出一个常规多边形中心的坐标,然后将它缩放并重复地绘制,直到填充整个圆形。

以下是用JavaScript实现的代码,可以用来绘制阶数为n的圆并填充它。

function drawRound(n) {
  const diameter = 200;
  const radius = diameter / 2;
  const cx = radius;
  const cy = radius;
  const circlePath = `M ${cx} ${cy} m -${radius}, 0 a ${radius},${radius} 0 1,0 ${diameter},0 a ${radius},${radius} 0 1,0 -${diameter},0`;
  const polygonPaths = [];

  for (let i = 0; i < n; i++) {
    const x = cx + radius * Math.sin(2 * Math.PI / n * i);
    const y = cy - radius * Math.cos(2 * Math.PI / n * i);
    polygonPaths.push(drawPolygon(n, 50, x, y));
  }

  const path = circlePath + polygonPaths.join('');
  return path;
}

我们可以将绘制的结果输出到HTML SVG元素中,以便在浏览器中查看。

以下是一个阶数为6的圆,使用常规六边形填充。