Class: FXSpline

Inherits:
Object
  • Object
show all
Defined in:
lib/IFMapper/FXSpline.rb

Overview

Class used to evaluate a bspline.

Constant Summary collapse

OS =
1.0 / 6.0
FS =
4.0 / 6.0

Class Method Summary collapse

Class Method Details

.bspline(p) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/IFMapper/FXSpline.rb', line 30

def self.bspline(p)
  pts = []
  0.upto(p.size-4) { |x|
    x2 = p[x+2][0] - p[x+1][0]
    x2 = x2 * x2
    y2 = p[x+2][1] - p[x+1][1]
    y2 = y2 * y2
    num = Math.sqrt( x2 + y2 ).to_i / 16
    bspline_solve(pts, p[x..x+3], num)
  }
  return pts
end

.bspline_solve(r, p, num) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/IFMapper/FXSpline.rb', line 9

def self.bspline_solve( r, p, num )
  ax = -OS  * p[0][0] + 0.5 *   p[1][0] - 0.5 * p[2][0] + OS * p[3][0]
  bx =  0.5 * p[0][0] -         p[1][0] + 0.5 * p[2][0]
  cx = -0.5 * p[0][0]                   + 0.5 * p[2][0]
  dx =  OS  * p[0][0] + FS * p[1][0]    + OS  * p[2][0]

  ay = -OS  * p[0][1] + 0.5 *   p[1][1] - 0.5 * p[2][1] + OS * p[3][1]
  by =  0.5 * p[0][1] -         p[1][1] + 0.5 * p[2][1]
  cy = -0.5 * p[0][1]                   + 0.5 * p[2][1]
  dy =  OS  * p[0][1] + FS * p[1][1] + OS * p[2][1]

  t    = 0.0
  tinc = 1.0 / num
  0.upto(num) {
    x = t * (t * (t * ax + bx) + cx) + dx
    y = t * (t * (t * ay + by) + cy) + dy
    r << [ x, y ]
    t += tinc
  }
end