Реализация алгоритма DDA

Я пытаюсь реализовать алгоритм DDA в Java, чтобы нарисовать линию. Line Rasterizer реализует интерфейс. Тогда я называю rasterizeLine функция в классе с именем Canva, LineRasterizes успешно получает х и у очков. Никаких ошибок не возникает, однако должна быть логическая проблема с алгоритмом, потому что линия не рисуется. Можете ли вы помочь мне найти логическую ошибку?

Интерфейс

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

Линия Растеризатор

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 - вызов функции

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 ответ

Эта строка:

y = y1 + k;

продолжает присваивать одно и то же значение y, так как y1 а также k не меняются.

Пример вывода, рисуя линию между (0,0) и (10, 10):

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

Вы можете иметь в виду:

y = y + k;

или же y += k;,

Пример вывода, рисуя линию между (0,0) и (10, 10):

O..........
.O.........
..O........
...O.......
....O......
.....O.....
......O....
.......O...
........O..
.........O.
..........O
Другие вопросы по тегам