3

使用哪种算法来获得实心圆的点?

int start_X = 30; // center point
int start_Y = 30;

int r = 5;

// current point
int x; 
int y;

if(?==true)
{
map2D[x][y] = 1; // for filled circle points
}
4

4 回答 4

14

你得到一个圆的方程:

其中 a & b 是中心点坐标。满足这个方程的所有 x 和 y 点都是圆的一部分。要查看某个点 (x1, y1) 是否存在,请检查是否

((x1 - start_X) * (x1 - start_X) + (y1 - start_Y) * (y1 - start_Y)) <= r * r

<= 符号也包括位于圆内的点。您可以安全地限制区间 [start_X - r; 中的点范围;startX + r] 和 [start_Y - r; 开始Y + r]。

于 2013-06-18T08:24:35.353 回答
3

您可以使用中心 ( , ) 搜索 2 rx 2的正方形区域:rstart_Xstart_Y

std::vector< std::pair<int> > circlePoints;

for(int i = start_X - r; i <= start_X + r; i++)
{
   for(int j = start_Y - r; j <= start_Y + r; j++)
   {
       if((i-r)*(i-r) + (j-r)*(j-r) <= r*r)
       {
         circlePoints.push_back(std::pair<int>(i,j));
       }
   }
}
于 2013-06-18T08:21:57.570 回答
1

如果您想不检查就直接到达圆圈中的所有点,这就是方法。

SatY = CenterY;//StartY + R
        for (int i = StartX; i < EndX; i++)
        {
            int StartY = (int)(SatY - Math.Sqrt(Math.Abs((R + i - StartX) * (R - i + StartX))));
            int EndY = (int)(SatY + Math.Sqrt(Math.Abs((R + i - StartX) * (R - i + StartX))));
            for (int j = StartY; j < EndY; j++)
            {
                // Do Job
            }
        }
于 2018-05-16T09:47:10.957 回答
1

这是Java中的完整解决方案。您可以轻松地将其转换为 C++。从一个预定义为全 0 的空矩阵开始,如果点 (x,y) 位于一个圆圈内,则用 1 填充它,否则用 9 填充外圆。(为什么是 9 - 只是为了让您在矩阵中清楚地看到圆圈)。下面的代码适用于奇数大小的矩阵。让我知道是否有人有更好的解决方案。

  private static void drawCircle(int[][] emptyMatrix, int diameter) {
    int startX = diameter/2;
    int startY = diameter/2;
    int radius = diameter/2;
    drawCircleRecursive(emptyMatrix, diameter, startX, startY, radius, radius);

    System.out.println("Filled matrix: ");
    for (int i = 0; i < emptyMatrix.length; i++) {
      for (int j = 0; j < emptyMatrix[0].length; j++) {
        System.out.print(emptyMatrix[i][j] + " ");
      }
      System.out.println();
    }
  }

  private static void drawCircleRecursive(int[][] emptyMatrix, int d, int startX, int startY, int x, int y) {

    if(x >= emptyMatrix.length || y >= emptyMatrix[0].length || x < 0 || y < 0 || emptyMatrix[x][y] == 1)
      return;
    else if(emptyMatrix[x][y] == 9)
      return;

    int r = d/2;
    if (((x - startX) * (x - startX) + (y - startY) * (y - startY)) <= (r * r))
      emptyMatrix[x][y] = 1; 
    else 
      emptyMatrix[x][y] = 9;

    drawCircleRecursive(emptyMatrix, d, startX, startY, x+1, y);  // down
    drawCircleRecursive(emptyMatrix, d, startX, startY, x, y+1);  // right
    drawCircleRecursive(emptyMatrix, d, startX, startY, x-1, y);  //up
    drawCircleRecursive(emptyMatrix, d, startX, startY, x, y-1);  //left
    drawCircleRecursive(emptyMatrix, d, startX, startY, x-1, y-1); // diagonal up-left
    drawCircleRecursive(emptyMatrix, d, startX, startY, x+1, y+1); // diagonal right-down
    drawCircleRecursive(emptyMatrix, d, startX, startY, x+1, y-1);  // diagonal left-down
    drawCircleRecursive(emptyMatrix, d, startX, startY, x-1, y+1);  // diagonal right-up


  }
于 2019-03-17T16:02:50.730 回答