Eigentlich ist es unnötig für jedes Pixel die neue -Koordinate und die neue -Koordinate auszurechnen, da man ja der Reihe nach alle Pixel der Linie setzen will. Wenn man also für jedes Pixel z.B. die -Koordinate um erhöht, braucht man nur noch die zugehörige -Koordinate zu berechnen. Dazu muß die Geradengleichung aber in Form einer Funktion vorliegen:
Die Steigung errechnet sich mit dem Steigungsdreieck wie folgt:
das gilt sowohl für das Dreieck mit und als auch für das Dreieck mit und dem Punkt , an dem die Gerade die -Achse schneidet:
einsetzen in die Geradengleichung ergibt:
Hier die draw-Methode aus der Klasse line.StraightLine:
public void draw(CGCanvas cgc) { int x, y; double s, c; s = (double)(y2 - y1) / (double)(x2 - x1); // Steigung berechnen c = (double)(y1*x2 - y2*x1) / // y-Achsenabschnitt (double)(x2 - x1); x = x1; // Koordinaten retten y = y1; if(x < x2) { // Linie links -> rechts while(x <= x2) { // fuer jede x-Koordinate y = (int)(s*x + c + 0.5); // berechne y-Koordinate cgc.setPixel(x,y); // setze Pixel x++; // naechste x-Koordinate } } else { // Linie rechts -> links while(x >= x2) { // fuer jede x-Koordinate y = (int)(s*x + c + 0.5); // berechne y-Koordinate cgc.setPixel(x,y); // setze Pixel x--; // naechste x-Koordinate } } } |
Diese Version kommt mit ungefähr halb soviel Gleitkommaarithmetik aus, wie die letzte. Allerdings brauchen wir eine zusätzliche Fallunterscheidung, um zu klären, ob die Linie von links nach rechts verläuft oder andersherum. Ein weiterer schwerer Nachteil liegt in der Tatsache, daß die Pixel für steile Geraden nicht benachbart sind.