Skip to content

Instantly share code, notes, and snippets.

@qwtel
Last active December 18, 2015 15:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save qwtel/5804291 to your computer and use it in GitHub Desktop.
Save qwtel/5804291 to your computer and use it in GitHub Desktop.
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; i++) {
buffer.setPixel(x, y);
x += sx;
if (p < 0) {
p += 2*deltaY;
}
else {
p += 2*deltaY - 2*deltaX;
y += sy;
}
}
}
}
class FrameBufferWrapper implements PixelSetter {
private Framebuffer framebuffer;
public FrameBufferWrapper(Framebuffer framebuffer) {
this.framebuffer = framebuffer;
}
@Override
public void setPixel(int x, int y) {
framebuffer.setPixel(x, y, Vec3.one);
}
}
interface LineDrawer {
public void drawLine(int x1, int y1, int x2, int y2);
}
class LineDrawerDecorator implements LineDrawer {
private LineDrawer component;
public LineDrawerDecorator(LineDrawer component) {
this.component = component;
}
@Override
public void drawLine(int x1, int y1, int x2, int y2) {
component.drawLine(y1, x1, y2, x2); // swapped x and y
}
}
interface PixelSetter {
public void setPixel(int x, int y);
}
class PixelSetterDecorator implements PixelSetter {
private PixelSetter component;
public PixelSetterDecorator(PixelSetter component) {
this.component = component;
}
@Override
public void setPixel(int x, int y) {
component.setPixel(y, x); // swapped x and y
}
}
int deltaX = Math.abs(x2 - x1);
int deltaY = Math.abs(y2 - y1);
PixelSetter buffer = new FrameBufferWrapper(framebuffer);
if (deltaY > deltaX) {
buffer = new PixelSetterDecorator(buffer);
}
LineDrawer lineDrawer = new BresenhamLineDrawer(buffer);
if (deltaY > deltaX) {
lineDrawer = new LineDrawerDecorator(lineDrawer);
}
lineDrawer.drawLine(x1, y1, x2, y2);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment