Ich habe versucht, Bresenham Linie Algorithmus aus der Wikipedia Page zu implementieren, und ich habe ein seltsames Problem, das zu einer Ausnahme führt aufgetreten.Index war außerhalb der Grenzen des Arrays Doppel C# (Doppel)
public static int[,] Line(int x0, int y0, int x1, int y1)
{
int arraySizeX = x1 - x0;
int arraySizeY = y1 - y0;
int [,] outputArray = new int[arraySizeX, arraySizeY];
//Bresenham's line algorithm from Wikipedia
double deltax = x1 - x0;
double deltay = y1 - y0;
double deltaerr = Math.Abs(deltay/deltax); // Assume deltax != 0 (line is not vertical),
double error;
error = 0.0;//no error at start
int y = 0;
for(int x = x0; x1 >= x; x++)
{
outputArray[x, y] = 1;
error += deltaerr;
while(error >= 0.5)
{
y = y + Math.Sign(deltay) * 1;
error = error - 1.0;
}
}
return outputArray;
}
Und wenn ich es testen mit:
Line(2, 1, 5, 3);
es die Ausnahme zurück:
System.IndexOutOfRangeException: 'Index außerhalb der Grenzen des Arrays war'
an dieser Linie:
error += deltaerr;
Dies geschieht auf der zweiten Iteration der for-Schleife. An diesem Punkt die beiden Werte sind:
error -0.33333333333333337 double
und
deltaerr 0.66666666666666663 double
In meinem Kopf Fehler sollte so etwas wie 0.3333 zugeordnet werden. Irgendwelche Hinweise darauf, was schief gelaufen sein könnte?
Dies ist meine erste Frage, also bitte sagen Sie mir, wie ich mich in Zukunft verbessern könnte. Vielen Dank.
Lösung: Achten Sie genau auf alle Arrays im Code.
Der Fehler war tatsächlich auf der Linie über wo der Code versucht, eine Position im Array zu verweisen, die nicht existierte.
gegebene Eingabe: 'Leitung (2, 1, 5, 3);' das mehrdimensionale Array im wesentlichen als 'int definiert [,] output = new int [3, 2];' Sie können sich das als eine Tabelle von 3 Zeilen und 2 Spalten vorstellen. Das Problem ist jedoch, dass die for-Schleife-Iterationsvariable "x" über die Anzahl der verfügbaren Zeilen hinausgeht. Sie können dies leicht mit einem Debugger lösen und sicherstellen, dass Ihr Algorithmus korrekt ist. –
Der Fehler 'IndexOutOfRangeException' kann nicht in dieser Zeile 'error + = deltaerr;' auftreten, da diese Zeile keine Indizierung beinhaltet. Dies muss 'outputArray [x, y] = 1; ', wobei das Array mit' [x, y] 'indiziert wird. Ich erkläre es ausführlich in meiner Antwort. –