Sha256: af94bda9d78ecb6d185bd83e5ea18d916ee7a671aadc79e9c6f5557f0d612348

Contents?: true

Size: 1.83 KB

Versions: 4

Compression:

Stored size: 1.83 KB

Contents

#
# Morph. 
# 
# Changing one shape into another by interpolating
# vertices from one to another
#
load_library :vecmath

attr_reader :circle, :square, :morph, :state, :v1, :v2

def setup
  size(640, 360)
  @circle = []
  @square = []
  @morph = []
  @state = false
  frameRate(15)
  # Create a circle using vectors pointing from center
  (0 .. TAU).step(Math::PI / 20.0) do |angle|
    # Note we are not starting from 0 in order to match the
    # path of a circle.  
    v = Vec2D.from_angle(angle + Math::PI / 4.0 )
    v *= 100
    circle << v
    # Let's fill out morph Array with blank Vec2Ds while we are at it
    morph << Vec2D.new
  end

  # A square is a bunch of vertices along straight lines
  # Top of square
  (-50 .. 50).step(10) do |x|
    square << Vec2D.new(x, -50)
  end
  # Right side
  (-50 .. 50).step(10) do |y|
    square << Vec2D.new(50, y)
  end
  # Bottom, NB: can't negative step ruby so use your loaf
  5.downto(-5) do |x|
    square << Vec2D.new(x * 10, 50)
  end
  # Left side
  5.downto(-5) do |y|
    square << Vec2D.new(-50, y * 10)
  end
end

def draw
  background(51)

  # We will keep how far the vertices are from their target
  @total_distance = 0
  
  # Look at each vertex
  circle.length.times do |i|
    # Are we lerping to the circle or square?
    v1 = (state)?  circle[i] : square[i]
    # Get the vertex we will draw
    v2 = morph[i]
    
    # Lerp to the target
    v2.lerp!(v1, 0.1)
    # Check how far we are from target
    @total_distance += Vec2D.dist(v1, v2)
  end
  
  # If all the vertices are close, switch shape
  if (@total_distance < 0.08)
    @state = !state
  end
  
  # Draw relative to center
  translate(width/2, height/2)
  stroke_weight(4)
  # Draw a polygon that makes up all the vertices
  begin_shape
  no_fill
  stroke(255)
  morph.each do |v|
    vertex(v.x, v.y)
  end
  end_shape(CLOSE)
end



Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
ruby-processing-2.4.4 samples/processing_app/library/vecmath/morph.rb
ruby-processing-2.4.3 samples/processing_app/library/vecmath/morph.rb
ruby-processing-2.4.2 samples/processing_app/library/vecmath/morph.rb
ruby-processing-2.4.1 samples/processing_app/library/vecmath/morph.rb