Hello

I have a problem with a program I'm writing and I was wondering if
anybody here could help. I have attached the relevant portion of the
program to this message.

The full version of the program is intended to produce files in which
each line is either "write" or a list of three numbers. A machine uses
these files as input. It interprets each line of the file that has three
numbers on it as a point in space and it draws a line between any two
points that don't have a "write" between them.

To that end I have written some methods that generate arrays whose
elements are arrays. Each of the subarrays consists either of the string
"write" or has three entries each of which is a number.

I have a method called "horizblocks". It produces an array that
represents a set of layers arranged vertically. Each layer consists of a
set of parallel horizontal lines.

Another method, called "rotateblock" takes an array and performs an
operation that is equivalent to rotating it about (0,0) in the (x,y)
plane if it is of the same form as the arrays coming out of
"horizblocks".

The method "polyparams" generates a has that contains some parameters
that are involved in the rotation and appear in several other methods in
the full program.

The method "horizcornerblocks" is supposed to generate a block whose
bottom left corner is at (0,0). It should then generate several blocks
that are rotated with respect to one another around (0,0). I intended
that it would generate an array called "blockies" whose first entry is
an array representing a block whose bottom left corner is at (0,0). It
would then produce a new array that represented a rotated version of
that block and push it into "blockies". It does this by taking
"blockies.last", applying "rotateblock" to it and pushing the result
into "blockies". The next step is to take "blockies.last", which is now
the rotated version of the first block and repeating this process a
fixed number of times.

The line that is supposed to do this last step reads

(1..numsides-1).to_a.each{blockies.push(rotateblock(blockies.last,polypar["cos"],polypar["sin"]))}

The program doesn't do what I intended it to do. It gives the error
minimum.rb:41:in `*': Array can't be coerced into Float (TypeError)
from minimum.rb:41:in `block in rotateblock'
from minimum.rb:37:in `each'
from minimum.rb:37:in `rotateblock'
from minimum.rb:53:in `block in horizcornerblocks'
from minimum.rb:53:in `each'
from minimum.rb:53:in `horizcornerblocks'
from minimum.rb:57:in `<main>'

I tested the first three methods and they seem to work. I can generate a
suitable array with "horizblock" and "rotateblock" will rotate it. I
guess the problem must be with "horizcornerblocks" but I haven't worked
out what the problem is.

I have tried using irb to do things like define arrays a = [[1,2]] and b
= [3,4], then write
(0..3).to_a.each{a.push([a.last[0]+b[0]],a.last[1]+b[1])}
and then irb tells me that a is
[[1,2],[4,6],[7,10],[10,14],[13,18]]
which is what I expect.

I am perplexed. Any help would be appreciated.

Alan Forrester

Attachments:
http://www.ruby-forum.com/attachment/7869/minimum.rb


-- 
Posted via http://www.ruby-forum.com/.