Guest User

Untitled

a guest
Nov 28th, 2017
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.25 KB | None | 0 0
  1. local bezier = {};
  2.  
  3. function length(n, func, ...)
  4.     local sum, ranges, sums = 0, {}, {};
  5.     for i = 0, n-1 do
  6.         local p1, p2 = func(i/n, ...), func((i+1)/n, ...)
  7.         local dist = (p2 - p1).magnitude;
  8.         ranges[sum] = {dist, p1, p2};
  9.         table.insert(sums, sum);
  10.         sum = sum + dist;
  11.     end;
  12.     return sum, ranges, sums;
  13. end;
  14.  
  15. function bezier.new(func, n, ...)
  16.     local self = setmetatable({}, {__index = bezier});
  17.     local sum, ranges, sums = length(n, func, ...);
  18.     self.func = func;
  19.     self.n = n;
  20.     self.points = {...};
  21.     self.length = sum;
  22.     self.ranges = ranges;
  23.     self.sums = sums;
  24.     return self;
  25. end;
  26.  
  27. function bezier:setPoints(...)
  28.     -- only update the length when the control points are changed
  29.     local sum, ranges, sums = length(self.n, self.func, ...);
  30.     self.points = {...};
  31.     self.length = sum;
  32.     self.ranges = ranges;
  33.     self.sums = sums;
  34. end;
  35.  
  36. function bezier:calc(t)
  37.     -- if you don't need t to be a percentage of distance
  38.     return self.func(t, unpack(self.points));
  39. end;
  40.  
  41. function bezier:calcFixed(t)
  42.     local T, near = t * self.length, 0;
  43.     for _, n in next, self.sums do
  44.         if (T - n) < 0 then break; end;
  45.         near = n;
  46.     end;
  47.     local set = self.ranges[near];
  48.     local percent = (T - near)/set[1];
  49.     return set[2], set[3], percent;
  50. end;
  51.  
  52. return bezier;
Advertisement
Add Comment
Please, Sign In to add comment