Bresenham’s Line Algorithm in Java Part II

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 korrekt gezeichnete Stern

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

Code: https://gist.github.com/qwtel/5804291


© 2024 Florian Klampfer

Powered by Hydejack v9.2.0