2017-10-31 4 views
1

Ich habe Probleme beim Schreiben einer Methode (in C#), die alle Integer-Gitterpaare innerhalb eines Kreises mit einem bestimmten Radius bei einem bestimmten Offset zurückgibt. Ich fand diesen Artikel https://en.wikipedia.org/wiki/Gauss_circle_problem, aber leider scheint es mehr daran interessiert zu sein, die Anzahl der Gitterpaare zu berechnen als jedes einzelne Gitterpaar zu identifizieren.Integer-Gitterpaare innerhalb eines Kreises C#

Ich habe auch Probleme, einige der mathematischen Terminologie/Symbole zu verstehen, da meine Mathematik leider etwas fehlt, daher wären Codebeispiele oder detaillierte Erklärungen sehr hilfreich, wenn möglich.

Mein Plan ist bisher nur jede Integerwertkombination vom Radius zum negativen Radius zu überprüfen und dann einfach den Abstand zum Ursprung zu überprüfen, bevor der Offset auf die Vektoren angewendet wird, die innerhalb des Bereichs liegen.

Bin ich damit auf dem richtigen Weg, oder gibt es einen optimierten Weg, dies zu erreichen?

Beispiel Stub:

 

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

Einfache Vector2 Klasse

 

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

Dank!

Antwort

0

Für mein Verständnis Sie auf dem richtigen Weg sind, aber es gibt einige Optimierungen möglich:

  1. die System.Windows.Vector Klasse von C# verwenden, anstatt Ihre eigenen
  2. Sie nur die Punkte von einem Viertel berechnen müssen des Kreises, zB für x>0 und y>=0 und den Rest spiegeln (plus inkl. Mittelpunkt).

hier eine mögliche Implementierung:

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)); 
} 
0
 

    public List&ltVector2&gtGetContainedVectors(int radius, Vector2 offset) 
    { 
     List<Vector2> returnValues = new List&ltVector2>(); 
     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; 
    } 
 
Verwandte Themen