Bresenham’s Line Algorithm in Java Part II
in Software Last modified at:
Aufbauend auf den vorigen Post hier eine alternative Implementierung des Bresenham Algorithmus, welche stark auf objektorientierte Techniken zurückgreift.
Motivation hierfür ist, dass die prozedurale Umsetzung den grundlegenden Algorithmus durch die Berücksichtigung des Sonderfalls verkompliziert.
Minimal viable algorithm
Zunächst die Klasse zum Zeichnen der Linien, welche nur die minimale Funktionalität zur Verfügung stellt:
// file: "BresenhamLineDrawer.java"
class BresenhamLineDrawer implements LineDrawer {
private PixelSetter buffer;
public BresenhamLineDrawer(PixelSetter buffer) {
this.buffer = buffer;
}
@Override
public void drawLine(int x1, int y1, int x2, int y2) {
int deltaX = Math.abs(x2 - x1);
int deltaY = Math.abs(y2 - y1);
int x = x1;
int y = y1;
int sx = (int)Math.signum(x2 - x1);
int sy = (int)Math.signum(y2 - y1);
int p = 2*deltaY - deltaX;
for (int i=0; i deltaX) {
buffer = new PixelSetterDecorator(buffer);
}
LineDrawer lineDrawer = new BresenhamLineDrawer(buffer);
if (deltaY > deltaX) {
lineDrawer = new LineDrawerDecorator(lineDrawer);
}
lineDrawer.drawLine(x1, y1, x2, y2);
Der Vollständigkeit halber hier die beiden Interfaces LineDrawer
und PixelSetter
:
interface LineDrawer {
public void drawLine(int x1, int y1, int x2, int y2);
}
interface PixelSetter {
public void setPixel(int x, int y);
}