Skip to content

Commit f91d9a5

Browse files
committed
feat: add DDA line drawing algorithm
1 parent 7e29be3 commit f91d9a5

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.thealgorithms.geometry;
2+
3+
import java.awt.Point;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
7+
/**
8+
* The {@code DDALine} class implements the Digital Differential Analyzer (DDA)
9+
* line drawing algorithm. It computes points along a line between two given
10+
* endpoints using floating-point arithmetic.
11+
*
12+
* The algorithm is straightforward but less efficient compared to
13+
* Bresenham’s line algorithm, since it relies on floating-point operations.
14+
*
15+
* For more information, please visit {@link https://en.wikipedia.org/wiki/Digital_differential_analyzer_(graphics_algorithm)}
16+
*/
17+
public final class DDALine {
18+
19+
private DDALine() {
20+
// Prevent instantiation
21+
}
22+
23+
/**
24+
* Finds the list of points forming a line between two endpoints using DDA.
25+
*
26+
* @param x0 the x-coordinate of the starting point
27+
* @param y0 the y-coordinate of the starting point
28+
* @param x1 the x-coordinate of the ending point
29+
* @param y1 the y-coordinate of the ending point
30+
* @return an unmodifiable {@code List<Point>} containing all points on the line
31+
*/
32+
public static List<Point> findLine(int x0, int y0, int x1, int y1) {
33+
int dx = x1 - x0;
34+
int dy = y1 - y0;
35+
36+
int steps = Math.max(Math.abs(dx), Math.abs(dy)); // number of steps
37+
38+
double xIncrement = dx / (double) steps;
39+
double yIncrement = dy / (double) steps;
40+
41+
double x = x0;
42+
double y = y0;
43+
44+
List<Point> line = new ArrayList<>(steps + 1);
45+
46+
for (int i = 0; i <= steps; i++) {
47+
line.add(new Point((int) Math.round(x), (int) Math.round(y)));
48+
x += xIncrement;
49+
y += yIncrement;
50+
}
51+
52+
return line;
53+
}
54+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.thealgorithms.geometry;
2+
3+
import java.awt.Point;
4+
import java.util.List;
5+
import java.util.stream.Stream;
6+
import org.junit.jupiter.params.ParameterizedTest;
7+
import org.junit.jupiter.params.provider.Arguments;
8+
import org.junit.jupiter.params.provider.MethodSource;
9+
import org.junit.jupiter.api.Assertions;
10+
11+
/**
12+
* The {@code DDALineTest} class contains unit tests for the
13+
* {@code DDALine} class, specifically testing the {@code findLine} method.
14+
*/
15+
class DDALineTest {
16+
17+
static Stream<Arguments> linePointsProvider() {
18+
return Stream.of(
19+
Arguments.of(0, 0, 5, 5, List.of(
20+
new Point(0, 0), new Point(1, 1), new Point(2, 2),
21+
new Point(3, 3), new Point(4, 4), new Point(5, 5)
22+
)),
23+
Arguments.of(0, 0, 5, 0, List.of(
24+
new Point(0, 0), new Point(1, 0), new Point(2, 0),
25+
new Point(3, 0), new Point(4, 0), new Point(5, 0)
26+
)),
27+
Arguments.of(0, 0, 0, 5, List.of(
28+
new Point(0, 0), new Point(0, 1), new Point(0, 2),
29+
new Point(0, 3), new Point(0, 4), new Point(0, 5)
30+
)),
31+
Arguments.of(-2, -2, -5, -5, List.of(
32+
new Point(-2, -2), new Point(-3, -3),
33+
new Point(-4, -4), new Point(-5, -5)
34+
)),
35+
Arguments.of(1, 1, 1, 1, List.of(new Point(1, 1))),
36+
Arguments.of(0, 0, 1, 5, List.of(
37+
new Point(0, 0), new Point(0, 1), new Point(0, 2),
38+
new Point(1, 3), new Point(1, 4), new Point(1, 5)
39+
))
40+
);
41+
}
42+
43+
@ParameterizedTest
44+
@MethodSource("linePointsProvider")
45+
void testFindLine(int x0, int y0, int x1, int y1, List<Point> expected) {
46+
List<Point> actual = DDALine.findLine(x0, y0, x1, y1);
47+
Assertions.assertEquals(expected, actual,
48+
"The DDA algorithm should generate the expected ordered points.");
49+
}
50+
}

0 commit comments

Comments
 (0)