Advertisement
Shiranuit

openGL2D

Feb 22nd, 2018
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 14.74 KB | None | 0 0
  1. local arrayfunction = {}
  2.  
  3. local function recurseMul(self, val)
  4.     for k, v in pairs(self) do
  5.         if type(v) == "table" then
  6.             return recurseMul(v,val)
  7.         else
  8.             self[k]=(tonumber(v) or 0) * (tonumber(val) or 1)
  9.         end
  10.     end
  11.     return self
  12. end
  13.  
  14. function arrayfunction.mul(tble, v)
  15.     if type(tble) ~= "array" then return nil end
  16.     local self=getmetatable(tble)
  17.     local r = recurseMul(self.__data,v)
  18.     return tble
  19. end
  20.  
  21. function arrayfunction.get(tble, ...)
  22.     if type(tble) ~= "array" then return nil end
  23.     local args = {...}
  24.     local self = getmetatable(tble)
  25.     local bfValue = self.__data
  26.     for i=1, #args do
  27.         if type(bfValue) == "table" then
  28.             bfValue = rawget(bfValue,args[i])
  29.         else
  30.             return bfValue
  31.         end
  32.     end
  33.     return bfValue
  34. end
  35.  
  36. function arrayfunction.clear(tble)
  37.     if type(tble) ~= "array" then return nil end
  38.     local self = getmetatable(tble)
  39.     self.__data = {}
  40.     self.__count = 0
  41.     return tble
  42. end
  43.  
  44. function arrayfunction.count(tble)
  45.     if type(tble) ~= "array" then return nil end
  46.     return getmetatable(tble).__count
  47. end
  48.  
  49. function arrayfunction.unpackValues(tble)
  50.     if type(tble) ~= "array" then return nil end
  51.     local self = getmetatable(tble)
  52.     local n = {}
  53.     for k, v in pairs(self.__data) do
  54.         n[#n+1]=v
  55.     end
  56.     return unpack(n)
  57. end
  58.  
  59. function arrayfunction.unpackKeys(tble)
  60.     if type(tble) ~= "array" then return nil end
  61.     local self = getmetatable(tble)
  62.     local n = {}
  63.     for k, v in pairs(self.__data) do
  64.         n[#n+1]=k
  65.     end
  66.     return unpack(n)
  67. end
  68.  
  69. function arrayfunction.unpackPairs(tble)
  70.     if type(tble) ~= "array" then return nil end
  71.     local self = getmetatable(tble)
  72.     local n = {}
  73.     for k, v in pairs(self.__data) do
  74.         n[#n+1]={key=k, value=v}
  75.     end
  76.     return unpack(n)
  77. end
  78.  
  79. local function newindex(tble,index,val)
  80.     if getmetatable(tble).__data[index] and val == nil then
  81.         getmetatable(tble).__count = getmetatable(tble).__count-1
  82.         local bval = getmetatable(tble).__data[index]
  83.         getmetatable(tble).__data2[bval] = getmetatable(tble).__data2[bval] or {}
  84.         getmetatable(tble).__data2[bval][index]=nil
  85.     end
  86.     if not getmetatable(tble).__data[index] and val ~= nil then
  87.         getmetatable(tble).__count = getmetatable(tble).__count+1
  88.         getmetatable(tble).__data2[val] = getmetatable(tble).__data2[val] or {}
  89.         getmetatable(tble).__data2[val][index]=true
  90.     end
  91.     getmetatable(tble).__data[index]=val
  92. end
  93.  
  94. local function call(me, arg1)
  95.     if not arg1 then
  96.         return getmetatable(me).__count
  97.     else
  98.         if getmetatable(me).__data2[arg1] then
  99.             return setmetatable(getmetatable(me).__data2[arg1], {__index=function(tble, index) return getmetatable(tble).__data2[arg1][index] end,__call=function(tble) local n={} for k, v in pairs(getmetatable(me).__data2[arg1]) do n[#n+1]=k end return n end })
  100.         end
  101.     end
  102. end
  103.  
  104. local function new(me,tble)
  105.     local count = 0
  106.     local d2 = {}
  107.     for k, v in pairs(tble) do
  108.         count = count + 1
  109.         d2[v] = d2[v] or {}
  110.         d2[v][k]=true
  111.     end
  112.    
  113.     if type(tble) == "table" or type(tble) == "array" then
  114.       return setmetatable({},{__index=function(tble, index) return getmetatable(tble).__data[index] end,
  115.       __newindex = newindex,
  116.       __data=tble,
  117.       __data2=d2,
  118.       __count=count,
  119.       __mul=arrayfunction.mul,
  120.       __tostring=function() return tostring(tble):gsub("table:","array:") end,
  121.       __type="array",
  122.       __call=call,
  123.       __len=function(tble) return #getmetatable(tble).__data end,
  124.       })
  125.   end
  126. end
  127.  
  128. local array = setmetatable({},{__index=arrayfunction,__call=new,__tostring=function() return "ArrayClass" end,__type=="ArrayClass"})
  129.  
  130. dim3D = {}
  131. dim2D = {}
  132. function dim3D.sphere(dx,dy,dz,r)
  133.   local points = {}
  134.   local check = {}
  135.   for theta = -math.pi/2,math.pi/2, 1/r/2 do
  136.     local subr = r*math.cos(theta)
  137.     local z = math.sin(theta)*r
  138.     for phi=0, 2*math.pi, 1/subr/2 do
  139.       x=math.cos(phi)*subr
  140.       y=math.sin(phi)*subr
  141.       local dt = math.floor(dx+x+0.5)..":"..math.floor(dy+y+0.5)..":"..math.floor(dz+z+0.5)
  142.       if not check[dt] then
  143.         points[#points+1]={x=math.floor(dx+x+0.5),y=math.floor(dy+y+0.5),z=math.floor(dz+z+0.5)}
  144.         check[dt]=true
  145.       end
  146.     end
  147.   end
  148.   return points
  149. end
  150.  
  151. function dim2D.line(x0,y0,x1,y1)
  152.     local dx, sx = math.abs(x1-x0), x0<x1 and 1 or -1
  153.     local dy, sy = -math.abs(y1-y0), y0<y1 and 1 or -1
  154.     local err = dx+dy
  155.     local e2 = 0
  156.     local points = {}
  157.     while true do
  158.         points[#points+1]={x=x0,y=y0}
  159.         e2=2*err
  160.         if e2>=dy then
  161.             if x0 == x1 then break end
  162.             err=err+dy x0=x0+sx
  163.         end
  164.         if e2<=dx then
  165.             if y0 == y1 then break end
  166.             err=err+dx y0=y0+sy
  167.         end
  168.     end
  169.     return points
  170. end
  171.  
  172. function dim3D.line(x0,y0,z0,x1,y1,z1)
  173.     local points = {}
  174.     points[#points+1]={x=x1,y=y1,z=z1}
  175.     points[#points+1]={x=x0,y=y0,z=z0}
  176.     local dx, sx = math.abs(x1-x0), x0<x1 and 1 or -1
  177.     local dy, sy = math.abs(y1-y0), y0<y1 and 1 or -1
  178.     local dz, sz = math.abs(z1-z0), z0<z1 and 1 or -1
  179.     local dm = math.max(dx,dy,dz)
  180.     local i = dm
  181.     x1, y1, z1 = dm/2, dm/2, dm/2
  182.     while true do
  183.         points[#points+1]={x=x0,y=y0,z=z0}
  184.         i=i-1
  185.         if i==0 then break end
  186.         x1=x1-dx
  187.         if x1<0 then x1=x1+dm x0=x0+sx end
  188.         y1=y1-dy
  189.         if y1<0 then y1=y1+dm y0=y0+sy end
  190.         z1=z1-dz
  191.         if z1<0 then z1=z1+dm z0=z0+sz end
  192.     end
  193.     return points
  194. end
  195.  
  196. function dim2D.circle(xm,ym,r)
  197.     local points = {}
  198.     local x, y, err=-r, 0, 2-2*r
  199.     while (x<0) do
  200.         points[#points+1]={x=xm-x,y=ym+y}
  201.         points[#points+1]={x=xm-y,y=ym-x}
  202.         points[#points+1]={x=xm+x,y=ym-y}
  203.         points[#points+1]={x=xm+y,y=ym+x}
  204.         r = err
  205.         if r<=y then y=y+1 err=err+y*2+1 end
  206.         if r>x or err>y then x=x+1 err=err+x*2+1 end
  207.         sleep(0.2)
  208.     end
  209.     return points
  210. end
  211.  
  212. function dim2D.ellipse(x0,y0,x1,y1)
  213.     local a=math.abs(x1-x0)
  214.     local b=math.abs(y1-y0)
  215.     local b1 = bit.band(b,1)
  216.     local dx, dy = 4*(1-a)*b^2, 4*(b1+1)*a^2
  217.     local err, e2=dx+dy+b1*a^2, 0
  218.     if x0>x1 then x0=x1 x1=x1+a end
  219.     if y0>y1 then y0=y1 end
  220.     y0=y0+(b+1)/2
  221.     y1=y0-b1
  222.     a=8*a^2
  223.     b1=8*b^2
  224.     local points = {}
  225.     while x0 <= x1 do
  226.         points[#points+1]={x=x1,y=y0}
  227.         points[#points+1]={x=x0,y=y0}
  228.         points[#points+1]={x=x0,y=y1}
  229.         points[#points+1]={x=x1,y=y1}
  230.         e2=2*err
  231.         if e2<=dy then y0=y0+1 y1=y1-1 dy=dy+a err=err+dy end
  232.         if e2 >= dx or 2*err > dy then x0=x0+1 x1=x1-1 dx=dx+b1 err=err+dx end
  233.     end
  234.    
  235.     while y0-y1 < b do
  236.         points[#points+1]={x=x0-1,y=y0}
  237.         y0=y0+1
  238.         points[#points+1]={x=x1+1,y=y0}
  239.         points[#points+1]={x=x0-1,y=y1}
  240.         y1=y1-1
  241.         points[#points+1]={x=x1+1,y=y1}
  242.     end
  243.    
  244.     return points
  245. end
  246.  
  247. function dim2D.fastcircle(nx,ny,r)
  248.     local x0, y0, x1, y1=nx-r, ny-r, nx+r, ny+r
  249.     local a=math.abs(x1-x0)
  250.     local b=math.abs(y1-y0)
  251.     local b1 = bit.band(b,1)
  252.     local dx, dy = 4*(1-a)*b^2, 4*(b1+1)*a^2
  253.     local err, e2=dx+dy+b1*a^2, 0
  254.     if x0>x1 then x0=x1 x1=x1+a end
  255.     if y0>y1 then y0=y1 end
  256.     y0=y0+(b+1)/2
  257.     y1=y0-b1
  258.     a=8*a^2
  259.     b1=8*b^2
  260.     local points = {}
  261.     while x0 <= x1 do
  262.         points[#points+1]={x=x1,y=y0}
  263.         points[#points+1]={x=x0,y=y0}
  264.         points[#points+1]={x=x0,y=y1}
  265.         points[#points+1]={x=x1,y=y1}
  266.         e2=2*err
  267.         if e2<=dy then y0=y0+1 y1=y1-1 dy=dy+a err=err+dy end
  268.         if e2 >= dx or 2*err > dy then x0=x0+1 x1=x1-1 dx=dx+b1 err=err+dx end
  269.     end
  270.    
  271.     while y0-y1 < b do
  272.         points[#points+1]={x=x0-1,y=y0}
  273.         y0=y0+1
  274.         points[#points+1]={x=x1+1,y=y0}
  275.         points[#points+1]={x=x0-1,y=y1}
  276.         y1=y1-1
  277.         points[#points+1]={x=x1+1,y=y1}
  278.     end
  279.     return points
  280. end
  281.  
  282. function dim2D.bezier(x0,y0,x1,y1,x2,y2)
  283.     local sx, sy = x2-x1, y2-y1
  284.     local xx, yy= x0-x1, y0-y1
  285.     local xy = 0
  286.     local dx, dy, err, cur = xx*sy-yy*sx, xx*sy-yy*sx, xx*sy-yy*sx, xx*sy-yy*sx
  287.     --assert(xx*sx<=0 and yy*sy<=0)
  288.     if sx^2+sy^2 > xx^2+yy^2 then x2=x0 x0=sx+x1 y2=y0 y0=sy+y1 cur=-cur end
  289.     if cur ~= 0 then
  290.         xx=xx+sx
  291.         sx=x0<x2 and 1 or -1
  292.         xx=xx*sx
  293.         yy=yy+sy
  294.         sy=y0<y2 and 1 or -1
  295.         yy=yy*sy
  296.         xy=2*xx*yy
  297.         xx=xx^2
  298.         yy=yy^2
  299.         if cur*sx*sy < 0 then xx=-xx yy=-yy xy=-xy cur=-cur end
  300.         dx=4*sy*cur*(x1-x0)+xx-xy
  301.         dy=4*sx*cur*(y0-y1)+yy-xy
  302.         xx=2*xx
  303.         yy=2*yy
  304.         err=dx+dy+xy
  305.         local points = {}
  306.         while dy < dx do
  307.             print(dy,dx)
  308.             points[#points+1]={x=x0,y=y0}
  309.             if x0==x2 and y0==y2 then return points end
  310.             y1=2*err<dx
  311.             if 2*err > dy then x0=x0+sx dx=dx-xy dy=dy+yy err=err+dy end
  312.             if y1 then y0=y0+sy dy=dy-xy dx=dx+xx err=err+dx end
  313.         end
  314.         return points
  315.     end
  316.     return dim2D.line(x0,y0,x2,y2)
  317. end
  318.  
  319. function dim2D.triangle(x0,y0,x1,y1,x2,y2)
  320.     local points={}
  321.     local function line(x0,y0,x1,y1)
  322.         local dx, sx = math.abs(x1-x0), x0<x1 and 1 or -1
  323.         local dy, sy = -math.abs(y1-y0), y0<y1 and 1 or -1
  324.         local err = dx+dy
  325.         local e2 = 0
  326.         while true do
  327.             points[#points+1]={x=x0,y=y0}
  328.             e2=2*err
  329.             if e2>=dy then
  330.                 if x0 == x1 then break end
  331.                 err=err+dy x0=x0+sx
  332.             end
  333.             if e2<=dx then
  334.                 if y0 == y1 then break end
  335.                 err=err+dx y0=y0+sy
  336.             end
  337.         end
  338.     end
  339.     line(x0,y0,x1,y1)
  340.     line(x0,y0,x2,y2)
  341.     line(x1,y1,x2,y2)
  342.     return points
  343. end
  344.  
  345. local function fillBottomFlatTriangle(x0,y0,x1,y1,x2,y2,pts)
  346.     local points=pts
  347.     local function line(x0,y0,x1,y1)
  348.         local dx, sx = math.abs(x1-x0), x0<x1 and 1 or -1
  349.         local dy, sy = -math.abs(y1-y0), y0<y1 and 1 or -1
  350.         local err = dx+dy
  351.         local e2 = 0
  352.         while true do
  353.             points[#points+1]={x=x0,y=y0}
  354.             e2=2*err
  355.             if e2>=dy then
  356.                 if x0 == x1 then break end
  357.                 err=err+dy x0=x0+sx
  358.             end
  359.             if e2<=dx then
  360.                 if y0 == y1 then break end
  361.                 err=err+dx y0=y0+sy
  362.             end
  363.         end
  364.     end
  365.     local invslop1 = math.floor((x1-x0)/(y1-y0)+0.5)
  366.     local invslop2 = math.floor((x2-x0)/(y2-y0)+0.5)
  367.    
  368.     local curx1 = x0
  369.     local curx2 = x0
  370.    
  371.     for scanLineY=y0, y1 do
  372.         line(curx1,scanLineY,curx2,scanLineY)
  373.         curx1=curx1+invslop1
  374.         curx2=curx2+invslop2
  375.     end
  376.     pts=points
  377. end
  378.  
  379. local function fillTopFlatTriangle(x0,y0,x1,y1,x2,y2,pts)
  380.     local points=pts
  381.     local function line(x0,y0,x1,y1)
  382.         local dx, sx = math.abs(x1-x0), x0<x1 and 1 or -1
  383.         local dy, sy = -math.abs(y1-y0), y0<y1 and 1 or -1
  384.         local err = dx+dy
  385.         local e2 = 0
  386.         while true do
  387.             points[#points+1]={x=x0,y=y0}
  388.             e2=2*err
  389.             if e2>=dy then
  390.                 if x0 == x1 then break end
  391.                 err=err+dy x0=x0+sx
  392.             end
  393.             if e2<=dx then
  394.                 if y0 == y1 then break end
  395.                 err=err+dx y0=y0+sy
  396.             end
  397.         end
  398.     end
  399.     local invslop1 = math.floor((x2-x0)/(y2-y0)+0.5)
  400.     local invslop2 = math.floor((x2-x1)/(y2-y1)+0.5)
  401.    
  402.     local curx1 = x2
  403.     local curx2 = x2
  404.    
  405.     for scanLineY=y2, y0, -1 do
  406.         line(curx1,scanLineY,curx2,scanLineY)
  407.         curx1=curx1-invslop1
  408.         curx2=curx2-invslop2
  409.     end
  410.     pts=points
  411. end
  412.  
  413. function dim2D.filledtriangle(x0,y0,x1,y1,x2,y2)
  414.     local points = dim2D.triangle(x0,y0,x1,y1,x2,y2)
  415.     local function line(x0,y0,x1,y1)
  416.         local points={}
  417.         local dx, sx = math.abs(x1-x0), x0<x1 and 1 or -1
  418.         local dy, sy = -math.abs(y1-y0), y0<y1 and 1 or -1
  419.         local err = dx+dy
  420.         local e2 = 0
  421.         while true do
  422.             points[#points+1]={x=x0,y=y0}
  423.             e2=2*err
  424.             if e2>=dy then
  425.                 if x0 == x1 then break end
  426.                 err=err+dy x0=x0+sx
  427.             end
  428.             if e2<=dx then
  429.                 if y0 == y1 then break end
  430.                 err=err+dx y0=y0+sy
  431.             end
  432.         end
  433.         return points
  434.     end
  435.     local x3 = 0
  436.     local y3 = math.min(y1,y2)
  437.  
  438.     local v1 = line(x0,y0,x1,y1)
  439.     local v2 = line(x0,y0,x2,y2)
  440.    
  441.     if y3==y1 then
  442.         for i=1, #v2 do
  443.             if v2[i] and v2[i].y==y3 then
  444.                 x3=v2[i].x
  445.                 break
  446.             end
  447.         end
  448.         fillBottomFlatTriangle(x0,y0,x1,y1,x3,y3,points)
  449.         fillTopFlatTriangle(x1,y1,x3,y3,x2,y2,points)
  450.     else
  451.         for i=1, #v1 do
  452.             if v1[i] and v1[i].y==y3 then
  453.                 x3=v1[i].x
  454.                 break
  455.             end
  456.         end
  457.         fillBottomFlatTriangle(x0,y0,x3,y3,x2,y2,points)
  458.         fillTopFlatTriangle(x3,y3,x2,y2,x1,y1,points)
  459.     end
  460.     return points
  461. end
  462.  
  463. function dim2D.filledCircle(xm,ym,r)
  464.     local points = {}
  465.     local function line(x0,y0,x1,y1)
  466.         local dx, sx = math.abs(x1-x0), x0<x1 and 1 or -1
  467.         local dy, sy = -math.abs(y1-y0), y0<y1 and 1 or -1
  468.         local err = dx+dy
  469.         local e2 = 0
  470.         while true do
  471.             points[#points+1]={x=x0,y=y0}
  472.             e2=2*err
  473.             if e2>=dy then
  474.                 if x0 == x1 then break end
  475.                 err=err+dy x0=x0+sx
  476.             end
  477.             if e2<=dx then
  478.                 if y0 == y1 then break end
  479.                 err=err+dx y0=y0+sy
  480.             end
  481.         end
  482.     end
  483.     local x, y, err=-r, 0, 2-2*r
  484.     while (x<0) do
  485.         points[#points+1]={x=xm-x,y=ym+y}
  486.         points[#points+1]={x=xm-y,y=ym-x}
  487.         points[#points+1]={x=xm+x,y=ym-y}
  488.         points[#points+1]={x=xm+y,y=ym+x}
  489.         line(xm-x,ym+y,xm+x,ym+y)
  490.         line(xm-x,ym-y,xm+x,ym-y)
  491.         r = err
  492.         if r<=y then y=y+1 err=err+y*2+1 end
  493.         if r>x or err>y then x=x+1 err=err+x*2+1 end
  494.         sleep(0.2)
  495.     end
  496.     return points
  497. end
  498.  
  499. function dim2D.filledEllipse(x0,y0,x1,y1)
  500.     local points = {}
  501.     local function line(x0,y0,x1,y1)
  502.         local dx, sx = math.abs(x1-x0), x0<x1 and 1 or -1
  503.         local dy, sy = -math.abs(y1-y0), y0<y1 and 1 or -1
  504.         local err = dx+dy
  505.         local e2 = 0
  506.         while true do
  507.             points[#points+1]={x=x0,y=y0}
  508.             e2=2*err
  509.             if e2>=dy then
  510.                 if x0 == x1 then break end
  511.                 err=err+dy x0=x0+sx
  512.             end
  513.             if e2<=dx then
  514.                 if y0 == y1 then break end
  515.                 err=err+dx y0=y0+sy
  516.             end
  517.         end
  518.     end
  519.     local a=math.abs(x1-x0)
  520.     local b=math.abs(y1-y0)
  521.     local b1 = bit.band(b,1)
  522.     local dx, dy = 4*(1-a)*b^2, 4*(b1+1)*a^2
  523.     local err, e2=dx+dy+b1*a^2, 0
  524.     if x0>x1 then x0=x1 x1=x1+a end
  525.     if y0>y1 then y0=y1 end
  526.     y0=y0+(b+1)/2
  527.     y1=y0-b1
  528.     a=8*a^2
  529.     b1=8*b^2
  530.     while x0 <= x1 do
  531.         points[#points+1]={x=x1,y=y0}
  532.         points[#points+1]={x=x0,y=y0}
  533.         points[#points+1]={x=x0,y=y1}
  534.         points[#points+1]={x=x1,y=y1}
  535.         line(x0,y0,x1,y0)
  536.         line(x0,y1,x1,y1)
  537.         e2=2*err
  538.         if e2<=dy then y0=y0+1 y1=y1-1 dy=dy+a err=err+dy end
  539.         if e2 >= dx or 2*err > dy then x0=x0+1 x1=x1-1 dx=dx+b1 err=err+dx end
  540.     end
  541.    
  542.     while y0-y1 < b do
  543.         points[#points+1]={x=x0-1,y=y0}
  544.         y0=y0+1
  545.         points[#points+1]={x=x1+1,y=y0}
  546.         points[#points+1]={x=x0-1,y=y1}
  547.         y1=y1-1
  548.         points[#points+1]={x=x1+1,y=y1}
  549.     end
  550.    
  551.     return points
  552. end
  553.  
  554. function dim2D.filledFastcircle(nx,ny,r)
  555.     local points = {}
  556.     local function line(x0,y0,x1,y1)
  557.         local dx, sx = math.abs(x1-x0), x0<x1 and 1 or -1
  558.         local dy, sy = -math.abs(y1-y0), y0<y1 and 1 or -1
  559.         local err = dx+dy
  560.         local e2 = 0
  561.         while true do
  562.             points[#points+1]={x=x0,y=y0}
  563.             e2=2*err
  564.             if e2>=dy then
  565.                 if x0 == x1 then break end
  566.                 err=err+dy x0=x0+sx
  567.             end
  568.             if e2<=dx then
  569.                 if y0 == y1 then break end
  570.                 err=err+dx y0=y0+sy
  571.             end
  572.         end
  573.     end
  574.     local x0, y0, x1, y1=nx-r, ny-r, nx+r, ny+r
  575.     local a=math.abs(x1-x0)
  576.     local b=math.abs(y1-y0)
  577.     local b1 = bit.band(b,1)
  578.     local dx, dy = 4*(1-a)*b^2, 4*(b1+1)*a^2
  579.     local err, e2=dx+dy+b1*a^2, 0
  580.     if x0>x1 then x0=x1 x1=x1+a end
  581.     if y0>y1 then y0=y1 end
  582.     y0=y0+(b+1)/2
  583.     y1=y0-b1
  584.     a=8*a^2
  585.     b1=8*b^2
  586.     while x0 <= x1 do
  587.         points[#points+1]={x=x1,y=y0}
  588.         points[#points+1]={x=x0,y=y0}
  589.         points[#points+1]={x=x0,y=y1}
  590.         points[#points+1]={x=x1,y=y1}
  591.         line(x0,y0,x1,y0)
  592.         line(x0,y1,x1,y1)
  593.         e2=2*err
  594.         if e2<=dy then y0=y0+1 y1=y1-1 dy=dy+a err=err+dy end
  595.         if e2 >= dx or 2*err > dy then x0=x0+1 x1=x1-1 dx=dx+b1 err=err+dx end
  596.     end
  597.    
  598.     while y0-y1 < b do
  599.         points[#points+1]={x=x0-1,y=y0}
  600.         y0=y0+1
  601.         points[#points+1]={x=x1+1,y=y0}
  602.         points[#points+1]={x=x0-1,y=y1}
  603.         y1=y1-1
  604.         points[#points+1]={x=x1+1,y=y1}
  605.     end
  606.     return points
  607. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement