lib/bezierspline.rb in xrvg-0.0.2 vs lib/bezierspline.rb in xrvg-0.0.3

- old
+ new

@@ -1,7 +1,10 @@ # +BezierSpline+ source +require 'interpolation' + + # BezierSpline class # # Internal class to represent a single-piece cubic bezier curve, defined by four points or two point + two vectors. # You may never have to use this class. Prefer the use of +Bezier+ class class BezierSpline #:nodoc: @@ -16,12 +19,12 @@ self.initdata( type, v1, v2, v3, v4 ) end def checkvalues( v1, v2, v3, v4 ) [v1, v2, v3, v4].each do |v| - if not v.is_a? V2D - Kernel::raise( "BezierSpline : init value #{v.inspect} is not a V2D" ) + if not (v.respond_to?(:x) || v.respond_to?(:y)) + Kernel::raise( "BezierSpline : init value #{v.inspect} does not respond to :x or :y" ) end end end def checktype( type ) @@ -202,38 +205,38 @@ sum = 0.0 previous = nil samplelist = [0.0, 0.0] new = V2D[0.0,0.0] previous = nil - (0.0..1.0).samples( 100 ) do |abs| + (0.0..1.0).samples( 129 ) do |abs| self.point( abs, new ) if previous sum+= (new - previous).r - samplelist += [abs, sum] + samplelist += [sum, abs] else previous = V2D[0.0,0.0] end previous.x = new.x previous.y = new.y end - @length = samplelist[-1] + @length = samplelist[-2] length_interpolator = nil if @length == 0.0 - newsamplelist = [0.0,0.0,1.0,0.0] - invsamplelist = [0.0,0.0,0.0,1.0] + newsamplelist = [0.0,0.0,0.0,1.0] + invsamplelist = [0.0,0.0,1.0,0.0] else newsamplelist = [] invsamplelist = [] - samplelist.foreach do |abs, sum| - newsamplelist += [abs, sum / @length] - invsamplelist += [sum / @length, abs] + samplelist.foreach do |sum, abs| + newsamplelist += [sum / @length, abs ] + invsamplelist += [abs, sum / @length ] end samplelist = newsamplelist end - @abs_interpolator = Interpolator.new( :samplelist, invsamplelist ) - return Interpolator.new( :samplelist, samplelist ) + @abs_interpolator = InterpolatorQuad.new( :samplelist, invsamplelist ) + return InterpolatorQuad.new( :samplelist, samplelist ) end def length_interpolator() #:nodoc: if @length_interpolator == nil @length_interpolator = self.compute_length_interpolator() @@ -255,12 +258,11 @@ def compute_length() #:nodoc: self.length_interpolator() return @length end - def parameterfromlength( l ) #:nodoc: - result = self.length_interpolator.interpolate( l ) + def parameterfromlength( lvalue ) #:nodoc: + result = self.length_interpolator.interpolate( lvalue ) return result - end - - + end end +