Để hiểu được câu trả lời của Nick một chút: khái niệm cốt lõi đằng sau thuật toán DDA (cũng hoạt động theo ba chiều) là với mỗi trục của lưới của bạn, bạn theo dõi 'điểm giao nhau' tiếp theo cho trục đó theo hướng của bạn tham số dòng; mỗi bước của thuật toán bao gồm tìm trục nào có điểm giao nhau tiếp theo (là so sánh đơn giản theo hai chiều), thực hiện bước thích hợp và cập nhật các giá trị giao nhau tiếp theo cho mỗi trục.

Dòng ở đây có thể được viết là '(x, y) = (x0, y0) + t * (m, n)', trong đó m = x1-x0 và n = y1-y0. Nếu kích thước của một ô lưới là gx và gy, thì dx - khoảng cách (tính theo tham số t) mà nó cần để vượt qua một ô lưới - có thể được tìm thấy với một chút đại số nhanh: từ cặp phương trình x = x0 + m t, (x + gx) = x0 + m (t + dx) ta được gx = m * dx, hay nói cách khác là dx = gx / m. Tương tự như vậy, dy = gy / n. Thuật toán theo dõi next_x (khoảng cách đến điểm đỏ tiếp theo dọc theo đường thẳng) và next_y (khoảng cách đến điểm xanh tiếp theo dọc theo đường) và cập nhật chúng mỗi khi nó chạm vào một điểm giao nhau khác, vì vậy vòng lặp trung tâm trông giống như thế này :
while ( cur_t < t_max) {
if ( next_x < next_y ) {
cell_x++;
cur_t += next_x;
next_y -= next_x;
next_x = dx;
} else {
cell_y++;
cur_t += next_y;
next_x -= next_y;
next_y = dy;
}
// Process the cell (cell_x, cell_y)
}
Lưu ý rằng mã này thiếu rất nhiều chi tiết - chẳng hạn, nó không cho bạn biết cách khởi tạo next_x và next_y. Có nhiều cách để loại bỏ hầu hết các đường phân chia, giúp dễ dàng xử lý các trường hợp đặc biệt như đường dọc và ngang. Việc bạn tăng hay giảm cell_x và cell_y tùy thuộc vào góc phần tư của bạn nằm ở đâu - lưu ý rằng đối với dòng ví dụ của tôi, bạn thực sự sẽ giảm cell_x mỗi dấu, vì m (x1 - x0) là âm. Bạn cũng phải quyết định cách bạn sẽ xử lý các trường hợp trong đó dòng của bạn đi chính xác qua góc giữa các ô, thay vì chuyển tiếp trên một cạnh; có rất nhiều chi tiết nhỏ có thể sai, và nó cần rất nhiều thử nghiệm. Tuy nhiên, hy vọng điều này sẽ cung cấp cho bạn một bức tranh về ý tưởng cốt lõi của thuật toán là gì.