Advertisement
programcreator

Bezier

Jan 12th, 2016
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.28 KB | None | 0 0
  1. local function Bezier(x1,y1,x2,y2,x3,y3)
  2.     --Private
  3.     local inf = 1/0
  4.     local x1 = x1
  5.     local y1 = y1
  6.     local x2 = x2
  7.     local y2 = y2
  8.     local x3 = x3
  9.     local y3 = y3
  10.  
  11.     local maxY = y1 > y2 and (y1 > y3 and y1 or y3) or y2 > y3 and y2 or y3
  12.     local minY = y1 < y2 and (y1 < y3 and y1 or y3) or y2 < y3 and y2 or y3
  13.  
  14.     local maxX = x1 > x2 and (x1 > x3 and x1 or x3) or x2 > x3 and x2 or x3
  15.     local minX = x1 < x2 and (x1 < x3 and x1 or x3) or x2 < x3 and x2 or x3
  16.  
  17.     local xc = (x3 - 2*x2 + x1)
  18.     local xb = 2*(x2 - x1)
  19.     local yc = (y3 - 2*y2 + y1)
  20.     local yb = 2*(y2 - y1)
  21.    
  22.     --Public
  23.     local self = {}
  24.  
  25.     --Render
  26.     self.render = function(resolution)
  27.         local path = {}
  28.         local num = 1
  29.         for index=0, 1, 1/resolution do
  30.             path[num] = {(1-index)^2*x1+2*(1-index)*index*x2+index^2*x3, (1-index)^2*y1+2*(1-index)*index*y2+index^2*y3}
  31.             num = num + 1
  32.         end
  33.         return path
  34.     end
  35.     --Point
  36.     function self.point(index)
  37.         return {(1-index)^2*x1+2*(1-index)*index*x2+index^2*x3, (1-index)^2*y1+2*(1-index)*index*y2+index^2*y3}
  38.     end
  39.     --Get x of patricular y
  40.     function self.getX(y)
  41.         if y > maxY or y < minY then
  42.             print("Outta range!")
  43.             if y > maxY then
  44.                 print("Too big")
  45.             elseif y < minY then
  46.                 print("Too small")
  47.             else
  48.                 print("Mkay")
  49.             end
  50.             return
  51.         elseif maxY == minY and y == minY then
  52.             return minX, maxX
  53.         end
  54.         local a = (y1 - y)
  55.         if a == 0 then
  56.             return
  57.         end
  58.         local b = yb
  59.         local c = yc
  60.         local discriminant = b^2 - 4*a*c
  61.         --print("Y: ", y)
  62.         if discriminant < 0 then
  63.             return
  64.         else
  65.             local aByTwo = 2*a
  66.             local theSQRT = math.sqrt(discriminant)
  67.             --print("Discriminant: ",discriminant)
  68.             if discriminant == 0 then
  69.                 index1 = -b/aByTwo
  70.                 --print("Incides (1): ",index1)
  71.                 return (1-index1)^2*x1+2*(1-index1)*index1*x2+index1^2*x3
  72.             else
  73.                 index1, index2 = (-b - theSQRT)/aByTwo, (-b + theSQRT)/aByTwo
  74.                 --print("Incides (2): ",index1,index2)
  75.                 return (1-index1)^2*x1+2*(1-index1)*index1*x2+index1^2*x3, (1-index2)^2*x1+2*(1-index2)*index2*x2+index2^2*x3
  76.             end
  77.         end
  78.     end
  79.     --Get y of patricular x
  80.     function self.getY(x)
  81.         if x > maxX or x < minX then
  82.             return
  83.         end
  84.         if maxX == minX and x == minX then
  85.             return minY, maxY
  86.         end
  87.         local index1, index2, buffer1, buffer2
  88.         local a = (x1 - x)
  89.         if a == 0 then
  90.             return
  91.         end
  92.         local b = xb
  93.         local c = xc
  94.         local discriminant = b^2 - 4*a*c
  95.         if discriminant < 0 then
  96.             return
  97.         else
  98.             local aByTwo = 2*a
  99.             local theSQRT = math.sqrt(discriminant)
  100.             if discriminant == 0 then
  101.                 local index1 = -b/aByTwo
  102.                 return (1-index1)^2*y1+2*(1-index1)*index1*y2+index1^2*y3
  103.             else
  104.                 local index1, index2 = (-b - theSQRT)/aByTwo, (-b + theSQRT)/aByTwo
  105.                 return (1-index1)^2*y1+2*(1-index1)*index1*y2+index1^2*y3, (1-index2)^2*y1+2*(1-index2)*index2*y2+index2^2*y3
  106.             end
  107.         end
  108.     end
  109.     --Scanline render
  110.     function self.scanRender()
  111.         local path = {}
  112.         local counter = 1
  113.         local fX, sX
  114.         local a = (y3 - 2*y2 + y1)
  115.         local b = 2*(y2 - y1)
  116.         for i=minY, maxY do
  117.             fX, sX = self.getX(i,a,b)
  118.             if fX then
  119.                 path[counter] = fX
  120.                 path[counter+1] = i
  121.                 counter = counter + 2
  122.                 if sX then
  123.                     path[counter] = sX
  124.                     path[counter+1] = i
  125.                     counter = counter + 2
  126.                 end
  127.             end
  128.         end
  129.         return path
  130.     end
  131.     --More efficient
  132.     --Self
  133.     return self
  134. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement