查找指定半径范围的所有整数坐标(Find all integer coordinates in a

2019-07-18 03:05发布

给定一个二维坐标系我怎么能找到的所有点整数在半径从给定的点的坐标? 我想点作为X坐标和Y坐标值。

围绕给定的点方找到点是容易的,可以这样做:

for(int x = -radius + point.x; x < radius + point.x; ++x)
for(int y = -radius + point.y; y < radius + point.y; ++y)
{
    points.insert(point(x, y));
}

但是,我怎么能找到在围绕给定的点了一圈点? 该算法的性能有关,但不准确有关。 所以,如果一个点关闭比1被添加或不半径也没关系。 换句话说,我并不需要浮点精度。

Answer 1:

简单的解决方法:取一个正方形并将其过滤:

Point point(100, 100);
for(int x = -radius; x <= radius; ++x)
for(int y = -radius; y <= radius; ++y)
if(x*x + y*y <= radius* radius)   {
    points.insert(Point(x + point.x, y + point.y));
}


Answer 2:

一种方式是x上的外环从-R到+ R,并根据在该x值(圆的y值从-sqrt(R ^ 2 Y上内环 - X ^ 2)到SQRT(R ^ 2 - X ^ 2)如果中心是在0,0),如果该中心在X,Y - 只需添加X或Y的所有环路范围内以同样的方式,你在你的例子一样



Answer 3:

你可以做一个小的修改到中点画圆算法得到一个实心圆。

首先生成坐标:

data = new int[radius];
int f = 1 - radius, ddF_x = 1;
int ddF_y = -2 * radius;
int x = 0, y = radius;
while (x < y)
{
    if (f >= 0)
    {
        y--;
        ddF_y += 2; f += ddF_y;
    }
    x++;
    ddF_x += 2; f += ddF_x;
    data[radius - y] = x; data[radius - x] = y;
}

然后访问所有的内部点:

int x0 = center.X;
int y0 = center.Y - Radius;
int y1 = center.Y + Radius - 1;

for (int y = 0; y < data.Length; y++)
{
    for (int x = -data[y]; x < data[y]; x++)
    {
        doSomething(x + x0, y + y0);
        doSomething(x + x0, y1 - y);
    }
}

这可以节省一些工作访问,将不会在圈内点,但在小前处理的费用。 它绝对不会帮助小圆圈,并为更大的,好了,我真的不知道。 你必须对它进行基准测试。



Answer 4:

下面的代码只是解析沿着四分之一圆的边界,以确定内部区域。 它并不需要计算距离的外点,也不是为内点。 ( 编辑 :但最后,添加的实心圆的所有点)

在一些小型Java的基准,对小半径(<10),它是相同的速度与解析完整的正方形的简单的方法的。 对于半径20-40它比较快约2倍,并且它实现了用于半径> 50.约4倍的加速对于一些大得多半径(> 200)的加速再次降低,因为对于任何方法然后需要的主导时间创建和加入> 100K点 - 不管它们是如何确定的。

// add the full length vertical center line once
for (int y = -radius + point.y; y <= radius + point.y; ++y)
    points.insert(Point(point.x, y));

int sqRadius = radius * radius;

// add the shorter vertical lines to the left and to the right
int h = radius;
for (int dx = 1; dx <= radius; ++dx) {
    // decrease h
    while (dx*dx + h*h > sqRadius && h > 0)
        h--;

    for (int y = -h + point.y; y <= h + point.y; ++y) {
        points.insert(Point(point.x + dx, y));
        points.insert(Point(point.x - dx, y));
    }
}


文章来源: Find all integer coordinates in a given radius