Bitmap/Bresenham's line algorithm: Difference between revisions

m
m (→‎{{header|Phix}}: minor tidy)
Line 2,795:
=={{header|Phix}}==
Modified copy of [[Bitmap/Bresenham%27s_line_algorithm#Euphoria|Euphoria]], with a bigger bitmap and a simpler pattern.
Requires new_image() from [[Bitmap#Phix|Bitmap]], write_ppm() from [[Bitmap/Write_a_PPM_file#Phix|Write_a_PPM_file]]. <br>
IncludedNote asthat demo\rosetta\Bresenham_line.exw is just the last 6 lines below preceded by include ppm.e since that contains bresLine() which is also used by several other examples, resultsand covers the above requirements, as shown commented out. Results may be verified with demo\rosetta\viewppm.exw
<lang Phix>-- demo\rosetta\Bresenham_line.exw (runnable version)
<lang Phix>function bresLine(sequence screenData, integer x0, integer y0, integer x1, integer y1, integer colour)
-- The line algorithm
integer deltaX = abs(x1-x0),
deltaY = abs(y1-y0),
stepX = iff(x0<x1,1,-1),
stepY = iff(y0<y1,1,-1),
lineError = iff(deltaX>deltaY,deltaX,-deltaY),
prevle
 
<langglobal Phix>function bresLine(sequence screenDataimage, integer x0, integer y0, integer x1, integer y1, integer colour)
lineError = round(lineError/2,1)
while-- 1The doline algorithm
integer dimx if x0>=1 and x0<=length(screenDataimage),
and y0>=1 and y0< dimy = length(screenDataimage[x01]) then,
screenData[x0][y0]deltaX = colourabs(x1-x0),
deltaY = abs(y1-y0),
stepX = iff(x0<x1,1,-1),
stepY = iff(y0<y1,1,-1),
lineError = iff(deltaX>deltaY,deltaX,-deltaY),
prevle
lineError = round(lineError/2, 1)
while true do
if x0>=1 and x0<=dimx
and y0>=1 and y0<=dimy then
image[x0][y0] = colour
end if
if x0=x1 and y0=y1 then exit end if
Line 2,823 ⟶ 2,826:
end if
end while
return screenDataimage
end function
 
--include ppm.e -- red, green, blue, white, new_image(), write_ppm(), bresLine() (as distributed, instead of the above)
 
sequence screenData = new_image(400,300,black)
7,806

edits