圆内的整数点阵对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;}
}
谢谢!
据我了解,您的方向是正确的,但还可以进行一些优化:
- 使用 C# 中的
System.Windows.Vector
class 而不是您自己的
- 您只需计算四分之一圆的点,例如
x>0
和 y>=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;
}
我在尝试编写一种方法(在 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;}
}
谢谢!
据我了解,您的方向是正确的,但还可以进行一些优化:
- 使用 C# 中的
System.Windows.Vector
class 而不是您自己的 - 您只需计算四分之一圆的点,例如
x>0
和y>=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;
}