圆内的整数点阵对c#

integer lattice pairs within a circle c#

我在尝试编写一种方法(在 c# 中)时遇到问题,该方法 returns 给定半径的圆内的所有整数格对在特定偏移处。我找到了这篇文章 https://en.wikipedia.org/wiki/Gauss_circle_problem,但不幸的是,它似乎对计算晶格对的数量更感兴趣,而不是识别每个单独的晶格对。

我在理解一些数学问题时也遇到了问题 terminology/symbols 因为我的数学知识有点欠缺,所以如果可能的话,代码示例或详细解释会非常有帮助。

我目前的计划是只检查从半径到负半径的每个整数值组合,然后简单地检查到原点的距离,然后再将偏移量应用于范围内的向量。

我这样做是否正确,或者是否有更优化的方法来实现这一点?

示例存根:


    public class CircleTest ()
    {
        public List<Vector2>GetContainedIntegerVectors(float radius, Vector2 centerPosition)
        {
            //math goes here
        }
    }

简单矢量 2 class


    public class Vector2 ()
    {
        public float x {get; set;}
        public float y {get; set;}
    }

谢谢!

据我了解,您的方向是正确的,但还可以进行一些优化:

  1. 使用 C# 中的 System.Windows.Vector class 而不是您自己的
  2. 您只需计算四分之一圆的点,例如 x>0y>=0 并镜像其余部分(包括中心点)。

这里是一个可能的实现:

List<Vector> tmpList = new List<Vector();
List<Vector> list = new List<Vector();
double rSquared=r*r; // using sqared reduces execution time (no square root needed)
for(int x=1; x<=r; x++)
    for(int y=0; y<=r; y++) {
        Vector v = new Vector(x,y);
        if(v.LengthSquared<=rSquared)
            tmpList.Add(v);
        else
            break;
    }

list.Add(centerVector);
foreach(Vector v in tmpList) {
    Vector vMirr = new Vector(v.X, -1*v.Y);
    list.Add(Vector.Add(centerVector, v));
    list.Add(Vector.Add(centerVector, v.Negate()));
    list.Add(Vector.Add(centerVector, vMirr));
    list.Add(Vector.Add(centerVector, vMirr.Negate));
}

    public List<Vector2>GetContainedVectors(int radius, Vector2 offset)
    {
       List<Vector2> returnValues = new List<Vector2>();
       for (int x = radius; x > -radius; x--)
       {
          for (int y = radius; y > -radius; y--)
          {
             if(Vector2.Distance(new Vector2(x,y), Vector2.zero) <= radius)
             {
                returnValues.Add(new Vector2(x + offset.x, y + offset.y));  
             }
          }   
       } 
       return returnValues;
    }