【问题标题】:Filled circle in matrix(2D array)矩阵中的实心圆(二维数组)
【发布时间】:2020-09-06 20:24:55
【问题描述】:

用什么算法来得到实心圆的点?

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
}

【问题讨论】:

  • 计算 (x,y) 和圆心 (cx, cy) 之间的线的长度,如果是
  • @JonathanPotter 或许算出长度的平方,和r * r比较会更好。
  • 实心圆点是什么意思??
  • 你的意思是点在圆圈里吗?
  • @johnchen902:不确定我是否遵循,如果 (aa)b) 然后 a

标签: c++ matrix geometry


【解决方案1】:

你得到一个圆的方程:

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

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

【讨论】:

    【解决方案2】:

    您可以在正方形区域 2r 上搜索 2r 中心 (start_X,start_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));
           }
       }
    }
    

    【讨论】:

    • 这是不正确的。我相信应该是if((i-start_X)*(i-start_X) + (j-start_Y)*(j-start_Y) &lt;= r*r)
    • 这个解中显示的方程确实是错误的。但是,我在 Lua 中测试了 Chris 的更正,并且确实有效。
    • 感谢@ChrisChevalier,您的更正有效。
    【解决方案3】:

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

    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
                }
            }
    

    【讨论】:

      【解决方案4】:

      这是一个完整的 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
      
      
        }
      

      【讨论】:

      • 可以叫int n = 7; int[][] emptyMatrix = new int[n][n]; drawCircle(emptyMatrix, n);
      猜你喜欢
      • 1970-01-01
      • 2020-03-19
      • 2018-09-17
      • 1970-01-01
      • 2021-07-18
      • 2020-08-25
      • 1970-01-01
      • 2021-07-10
      • 2014-11-29
      相关资源
      最近更新 更多