login

<     >

2021-04-21 19:20:22 (UTC-03:00)

Marcel Rodrigues <marcelgmr@gmail.com>

use DDA algorithm to draw lines with non-integer coordinates

diff --git a/surf.lua b/surf.lua
index 86365f6..8d8cd50 100644
--- a/surf.lua
+++ b/surf.lua
@@ -58,48 +58,15 @@ end
 
 function Surf:line(x0, y0, x1, y1, v, r)
     r = r or 0
-    x0, y0 = round(x0), round(y0)
-    x1, y1 = round(x1), round(y1)
-    if x1 == x0 then
-        local x, y, h
-        if y1 > y0 then
-            x, y, h = x0, y0, y1-y0
-        else
-            x, y, h = x0, y1, y0-y1
-        end
-        self:vline(x, y, h, v)
-        for i = 1, r do
-            self:vline(x-i, y, h, v)
-            self:vline(x+i, y, h, v)
-        end
-    elseif y1 == y0 then
-        local x, y, w
-        if x1 > x0 then
-            x, y, w = x0, y0, x1-x0
-        else
-            x, y, w = x1, y0, x0-x1
-        end
-        self:hline(x, y, w, v)
-        for i = 1, r do
-            self:hline(x, y-i, w, v)
-            self:hline(x, y+i, w, v)
-        end
-    else
-        local dx, dy = x1-x0, y1-y0
-        local sx, sy = copysign(1, dx), copysign(1, dy)
-        local de = math.abs(dy / dx)
-        local e = 0
-        local x, y = x0, y0
-        while x ~= x1 do
-            self:disk(x, y, r, v)
-            e = e + de
-            while e >= 0.5 do
-                self:disk(x, y, r, v)
-                y = y + sy
-                e = e - 1
-            end
-            x = x + sx
-        end
+    local dx, dy = x1-x0, y1-y0
+    local n = math.max(math.abs(dx), math.abs(dy))
+    local sx, sy = dx/n, dy/n
+    local x, y = x0, y0
+    self:disk(math.floor(x), math.floor(y), r, v)
+    for i = 1, n do
+        x = x + sx
+        y = y + sy
+        self:disk(math.floor(x), math.floor(y), r, v)
     end
 end