feat: add DDA line drawing algorithm (#6616)

* feat: add DDA line drawing algorithm

* refactor: clang formatting

---------

Co-authored-by: Deniz Altunkapan <deniz.altunkapan@outlook.com>
This commit is contained in:
Saahil Mahato
2025-10-18 17:26:01 +05:45
committed by GitHub
parent 6b7d201657
commit b312567dc3
2 changed files with 83 additions and 0 deletions

View File

@@ -0,0 +1,54 @@
package com.thealgorithms.geometry;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
/**
* The {@code DDALine} class implements the Digital Differential Analyzer (DDA)
* line drawing algorithm. It computes points along a line between two given
* endpoints using floating-point arithmetic.
*
* The algorithm is straightforward but less efficient compared to
* Bresenhams line algorithm, since it relies on floating-point operations.
*
* For more information, please visit {@link https://en.wikipedia.org/wiki/Digital_differential_analyzer_(graphics_algorithm)}
*/
public final class DDALine {
private DDALine() {
// Prevent instantiation
}
/**
* Finds the list of points forming a line between two endpoints using DDA.
*
* @param x0 the x-coordinate of the starting point
* @param y0 the y-coordinate of the starting point
* @param x1 the x-coordinate of the ending point
* @param y1 the y-coordinate of the ending point
* @return an unmodifiable {@code List<Point>} containing all points on the line
*/
public static List<Point> findLine(int x0, int y0, int x1, int y1) {
int dx = x1 - x0;
int dy = y1 - y0;
int steps = Math.max(Math.abs(dx), Math.abs(dy)); // number of steps
double xIncrement = dx / (double) steps;
double yIncrement = dy / (double) steps;
double x = x0;
double y = y0;
List<Point> line = new ArrayList<>(steps + 1);
for (int i = 0; i <= steps; i++) {
line.add(new Point((int) Math.round(x), (int) Math.round(y)));
x += xIncrement;
y += yIncrement;
}
return line;
}
}