Advertisement
programcreator

Bezier

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