Implemention of DDA algorithm

766 Views Asked by At

I am trying to implement DDA algorithm in Java to draw a line. The Line Rasterizer implements an interface. Then I call the rasterizeLine function in class named Canva. The LineRasterizes successfully gets x and y points. No errors are thrown up, however there has to be some logical problem with the algorithm, because the line is not being drawed. Can you help me find the logical mistake?

Interface

    package rasterops;

import rasterdata.RasterImage;

public interface LineRasterizer<PixelType> {
    RasterImage<PixelType> rasterizeLine(RasterImage<PixelType> img,
                  double x1, double y1, double x2, double y2,
                  PixelType value);
}

Line Rasterizer

package rasterops;

import rasterdata.RasterImage;

public class LineRasterizerDDA<PixelType> implements LineRasterizer <PixelType> {
    @Override
    public RasterImage<PixelType> rasterizeLine(RasterImage<PixelType> img, double x1, double y1, double x2, double y2, PixelType value) {


       double dy = y2-y1;
       double dx = x2-x1;

       double k = dy/dx;
       double y = y1;

        RasterImage<PixelType> result = img;
        for( double x = x1; x <= x2; x++ ){
            result = result.withPixel((int)x, (int)Math.round(y), value);
            y = y1 + k;
        }

        return result;



    }
}

Canva - calling the function

panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                previousX = e.getX();
                previousY = e.getY();
            }
        });
        panel.addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                final double startX = previousX / (panel.getWidth() - 1.0); //k zamysleni: proc 1.0 a ne 1?
                final double startY = 1 - previousY / (panel.getHeight() - 1.0);
                final double endX = e.getX() / (panel.getWidth() - 1.0);
                final double endY = 1 - e.getY() / (panel.getHeight() - 1.0);
                clear(); // zkuste zakomentovat
                rasterImage = liner.rasterizeLine(rasterImage,
                        startX, startY, endX, endY,
                        0xffff00);
                panel.repaint();
            }
        });
1

There are 1 best solutions below

1
On

This line:

y = y1 + k;

keeps assigning the same value to y, because y1 and k aren't changing.

Example output, drawing line between (0,0) and (10, 10):

O..........
.OOOOOOOOOO
...........
...........
...........
...........
...........
...........
...........
...........
...........

You may mean:

y = y + k;

or y += k;.

Example output, drawing line between (0,0) and (10, 10):

O..........
.O.........
..O........
...O.......
....O......
.....O.....
......O....
.......O...
........O..
.........O.
..........O