round coordinates to integers in a few places

Thanks Lion Kimbro for pointing out this issue.

I still have to use floats for start/end angles of arcs. That might be a
sign that I don't have the right serialization yet for them. Or that
that feature needs to go.

I started out with a hazy idea of only using 8-bit ints for coordinates,
but now I'm not sure how committed I am to that constraint. While the
width is always 256 units, it might be nice to create long portrait
drawings at some point, whose height is greater than 256 units.
This commit is contained in:
Kartik K. Agaram 2022-07-29 21:54:06 -07:00
parent 0218980add
commit 9d80e92415
1 changed files with 11 additions and 7 deletions

View File

@ -364,7 +364,7 @@ function Drawing.mouse_released(State, x,y, button)
local mx,my = Drawing.coord(x-State.left, State.width), Drawing.coord(y-line_cache.starty, State.width)
if mx >= 0 and mx < 256 and my >= 0 and my < drawing.h then
local center = drawing.points[drawing.pending.center]
drawing.pending.radius = geom.dist(center.x,center.y, mx,my)
drawing.pending.radius = round(geom.dist(center.x,center.y, mx,my))
table.insert(drawing.shapes, drawing.pending)
end
elseif drawing.pending.mode == 'arc' then
@ -580,8 +580,8 @@ function Drawing.complete_rectangle(firstx,firsty, secondx,secondy, x,y)
-- https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line#Line_defined_by_an_equation
local a = 1/first_slope
local c = -secondy - secondx/first_slope
local thirdx = ((x-a*y) - a*c) / (a*a + 1)
local thirdy = (a*(-x + a*y) - c) / (a*a + 1)
local thirdx = round(((x-a*y) - a*c) / (a*a + 1))
local thirdy = round((a*(-x + a*y) - c) / (a*a + 1))
-- slope of third edge = first_slope
-- equation of line containing third edge:
-- y - thirdy = first_slope*(x-thirdx)
@ -589,8 +589,8 @@ function Drawing.complete_rectangle(firstx,firsty, secondx,secondy, x,y)
-- now we want to find the point on this line that's closest to the first point
local a = -first_slope
local c = -thirdy + thirdx*first_slope
local fourthx = ((firstx-a*firsty) - a*c) / (a*a + 1)
local fourthy = (a*(-firstx + a*firsty) - c) / (a*a + 1)
local fourthx = round(((firstx-a*firsty) - a*c) / (a*a + 1))
local fourthy = round((a*(-firstx + a*firsty) - c) / (a*a + 1))
return thirdx,thirdy, fourthx,fourthy
end
@ -699,12 +699,16 @@ function Drawing.smoothen(shape)
local a = shape.points[i-1]
local b = shape.points[i]
local c = shape.points[i+1]
b.x = (a.x + b.x + c.x)/3
b.y = (a.y + b.y + c.y)/3
b.x = round((a.x + b.x + c.x)/3)
b.y = round((a.y + b.y + c.y)/3)
end
end
end
function round(num)
return math.floor(num+.5)
end
function Drawing.insert_point(points, x,y)
table.insert(points, {x=x, y=y})
return #points