class Curvature::Curve

Constants

DefaultSampleAttributes

Attributes

chart[RW]
name[RW]
samples[RW]

Public Class Methods

new(params={}) click to toggle source
# File lib/curvature/curve.rb, line 9
def initialize(params={})
  @samples = []
  {
  }.merge(params).each { |k, v| send("#{k}=", v) }
end

Public Instance Methods

<<(sample) click to toggle source
# File lib/curvature/curve.rb, line 15
def <<(sample)
  @samples << sample
end
print() click to toggle source
to_html() click to toggle source
# File lib/curvature/curve.rb, line 42
def to_html
  xml = Builder::XmlMarkup.new(indent: 2)

  # draw interpolated curve
  xml.g(fill: 'none', stroke: 'green', :'stroke-width' => 0.5) do
    points = @chart.x_range.step(1.0 / @chart.width).map do |input|
      @chart.scaled_point(input, value_for(input))
    end
    xml.polyline(points: points.map { |pt| pt.join(',') }.join(' '))
  end

  # draw individual samples
  @samples.each do |sample|
    cx, cy = @chart.scaled_point(sample.input, sample.output)
    attributes = DefaultSampleAttributes.merge(
      title: sample.label,
      cx: cx,
      cy: cy,
      r: 3,
    ).merge(sample.attributes || {})
    xml.circle(attributes)
  end

  xml.target!
end
value_for(input) click to toggle source
# File lib/curvature/curve.rb, line 19
def value_for(input)
  unless @spliner
    @spliner = Spliner::Spliner.new(
      @samples.map(&:input),
      @samples.map(&:output),
    )
  end
  @spliner[input] or raise "Can't find output for input #{input.inspect} on curve #{@name.inspect}"
end