在数组中查找圆的算法

时间:2016-11-22 10:30:57

标签: arrays algorithm delphi pascal

我有一个600x600整数值的数组。 值代表一个圆圈。 例如:0在外面,> = 1在圆圈内。 这是一个简短的例子:

0000110000000
0001111000000
0011111200000
0112112110000
1111111111000
0111411110000
0011131100000
0000110000000
0000000000000
0000000000000

阵列中圆的位置和大小不同。 现在,我正在寻找一种快速算法来找到圆的中心和半径。 快,因为我必须处理许多数组。

2 个答案:

答案 0 :(得分:1)

叠加网格,走它,(小矩阵:每行和每列,每第X行和列的大矩阵)并找到发生变化(0 - >> = 1或反之亦然)的点。

如果您的网格是对称且足够密集的,则这些点的平均值等于中心。

找到的点和中心的平均距离(sqrt(x-xm)+ sqr(y-ym)))是半径的度量。

单独行走行可能足以用于较大的数据集,并且仅扫描第X行。如果使用真实图像,则可能需要考虑噪声和亮度变化。

答案 1 :(得分:0)

可以更快地完成。实际上根据你的样本,如果有一个圆圈或一个正方形,那么无关紧要(我们不能估计)。

假设存在一个基于0的二维数组,则半径将只是非零(非空)行(或列)除以2的计数。

<强> ALGO。

  1. 查找非零行的数量及其第一个(顶部)索引。 将此数字除以2并添加零行数,索引小于最小的非零行。现在您知道了radiusy坐标。

  2. 找到第一个(左)非零列并将半径添加到其索引中。现在您拥有x坐标。

  3. 在提供的示例中。

    1. 非零行的数量是8. radius是8/2 = 4.在非零行之前有0行到顶部(换句话说,第一个非行的ID)零行是0)。所以y坐标是0 + 4 = 4.
    2. 第一个非零列左侧有0个空列(或者第一个非零列的ID为0)。 x坐标为4 + 0 = 4。
    3. 要知道列是否为零,您可以使用以下函数:

      IsEmpty := true;
      for i := 0 to High(Column) do
      if Column[i] > 0 then
        begin
          IsEmpty := false;
          Break;
        end;