Ok, I played with this a bit more. When I try running this simple program

require "matrix"

Shoes.app do
  Vector[1,2]
end

I don't get any complaints from the console. However, when I run my actual
program which is for drawing fractals, I get the errors I described. Here is
the code.


require "matrix"

class Vector
  def angle_from(v = Vector[1,0])
    ans = Math.atan2(self[1],self[0])
    ans -= v.angle unless v == Vector[1,0]
    return ans
  end
  def rotate(theta)
    Matrix.rot_mat(theta) * self
  end
end

class Matrix
  def self.rot_mat(theta)

self[[Math.cos(theta),Math.sin(theta)],[-Math.sin(theta),Math.cos(theta)]]
  end
end

module Fractalizer
  def self.fractalize(points,its)
    vi, vf = points.first, points.last
    theta_l = Math.atan2(yf-yi,xf-xi)
    ll = (vf-vi).r
    segments = (1..points.length).map { |n| [points[n-1],points[n]] }
    answer = []
    segments.each do |seg|
      theta_s = seg[1].angle_from seg[0]
      ls = (seg[1]-seg[0]).r
      newpoints = points.map do |pt|
        npt = (pt - points.first)*(ls/ll)
        npt = npt.rotate(theta_s - thetal)
        npt += points.first
      end
      newpoints.delete_at -1
      answer += newpoints
    end
    answer << points.last
  end
end

Shoes.app do
  button "Fractalize!" do
    @points = Fractalizer.fractalize(@points, @e.text.to_f)
  end
  para "Number of Iterations"
  @e = edit_line :width => 30
  @f = flow
  @points = []
  animate do
    if self.mouse[0]==1
      pos = Vector[mouse[1], mouse[2]]
      @points << pos
      if @points.size > 1
        @f.append {line(@points[-2][0],@points[-2][1],*(@points[-1]))}
      end
    end
  end
end



Is there something I'm doing wrong here that is making the code not work?
Can anyone else run this code and see if they get errors? The basic idea is
that this program is intended to let you draw a connected set of line
segments by clicking on the shoes window. Once you click the fractalize
button, it runs takes each segment and replaces it with the whole shape. So,
if things run properly on your machine, when you click at two different
points in the shoes window, you should get a line segment drawn. If not, it
should be because one of the errors that I described earlier. Thanks for the
help.

Chris

On Sun, Dec 28, 2008 at 10:39 PM, <[email protected]> wrote:

> I did require "matrix" but had no luck with that.
>
> Chris
> Sent from my BlackBerry Smartphone provided by Alltel
>
> -----Original Message-----
> From: Ernest Prabhakar <[email protected]>
>
> Date: Mon, 29 Dec 2008 12:06:38
> To: <[email protected]>
> Subject: Re: Vector class
>
>
> Hi Christopher,
>
> > There seems to be a bug with the Vector class in the shoes version
> > of ruby. I'm making vectors of coordinates using this line:
>
> That sounds like the same problem I had with tankspank.  Did you:
>
> require 'matrix'
>
> ?
>
> I don't think I needed to do that in pure Ruby, but I did in Shoes.
>
> -- Ernie P.
> On Dec 29, 2008, at 3:23 AM, Christopher Small wrote:
>
> > There seems to be a bug with the Vector class in the shoes version
> > of ruby. I'm making vectors of coordinates using this line:
> >
> > pos = Vector[mouse[1], mouse[2]]
> >
> > Before I was doing this with arrays, but realized that using vectors
> > would help me out in the long run. Once I switched to vectors, I got
> > this error in the shoes console:
> >
> > undefined method '[]' for #<Class:0x1249a54>::Vector
> >
> > Has anyone come across this? It seems like this should work just
> > fine. I'm using the latest .dmg release of Raisins on Leopard.
> >
> > Thanks
> >
> > Chris
>
>

Reply via email to