Skip to content

Commit b312567

Browse files
feat: add DDA line drawing algorithm (#6616)
* feat: add DDA line drawing algorithm * refactor: clang formatting --------- Co-authored-by: Deniz Altunkapan <[email protected]>
1 parent 6b7d201 commit b312567

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-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: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
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.api.Assertions;
7+
import org.junit.jupiter.params.ParameterizedTest;
8+
import org.junit.jupiter.params.provider.Arguments;
9+
import org.junit.jupiter.params.provider.MethodSource;
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(Arguments.of(0, 0, 5, 5, List.of(new Point(0, 0), new Point(1, 1), new Point(2, 2), new Point(3, 3), new Point(4, 4), new Point(5, 5))), Arguments.of(0, 0, 5, 0, List.of(new Point(0, 0), new Point(1, 0), new Point(2, 0), new Point(3, 0), new Point(4, 0), new Point(5, 0))),
19+
Arguments.of(0, 0, 0, 5, List.of(new Point(0, 0), new Point(0, 1), new Point(0, 2), new Point(0, 3), new Point(0, 4), new Point(0, 5))), Arguments.of(-2, -2, -5, -5, List.of(new Point(-2, -2), new Point(-3, -3), new Point(-4, -4), new Point(-5, -5))),
20+
Arguments.of(1, 1, 1, 1, List.of(new Point(1, 1))), Arguments.of(0, 0, 1, 5, List.of(new Point(0, 0), new Point(0, 1), new Point(0, 2), new Point(1, 3), new Point(1, 4), new Point(1, 5))));
21+
}
22+
23+
@ParameterizedTest
24+
@MethodSource("linePointsProvider")
25+
void testFindLine(int x0, int y0, int x1, int y1, List<Point> expected) {
26+
List<Point> actual = DDALine.findLine(x0, y0, x1, y1);
27+
Assertions.assertEquals(expected, actual, "The DDA algorithm should generate the expected ordered points.");
28+
}
29+
}

0 commit comments

Comments
 (0)