"Programming Ruby", ed. 2, P747. Script generated different image to book's example

Chaps,

Please find below a script taken from "Programming Ruby", ed. 2, P747. Its intention is to "show off" the abilities of Tk and widgets. The script works but generates a different image to that shown in the book. What results do you guys have? I would be interested to know.

#!/usr/bin/ruby
require 'tk'
include Math

TkRoot.new do |root|
  title "Curves"
  geometry "400x400"
  TkCanvas.new(root) do |canvas|
    width 400
    height 400
    pack('side' => 'top' , 'fill' => 'both' , 'expand' => 'yes' )
      points = [ ]
      10.upto(30) do |scale|
        (0.0).step(2*PI,0.1) do |i|
          new_x = 5*scale*sin(i) + 200 + scale*sin(i*2)
          new_y = 5*scale*cos(i) + 200 + scale*cos(i*6)
          points << [ new_x, new_y ]
          f = scale/5.0
          r = (Math.sin(f)+1)*127.0
          g = (Math.cos(2*f)+1)*127.0
          b = (Math.sin(3*f)+1)*127.0

          col = sprintf("#%02x%02x%02x", r.to_i, g.to_i, b.to_i)
          if points.size ==3
            TkcLine.new(canvas,
                        points[0],[0], points[0],[1],
                        points[1],[0], points[1],[1],
                        points[2],[0], points[2],[1],
                        'smooth' => 'on',
                        'width' => 7,
                        'fill' => col,
                        'capstyle' => 'round')
             points.shift
           end
         end
       end
     end
   end
   Tk.mainloop

#errors generated
jayeola@tp20$ /usr/lib/ruby/1.8/tk.rb:2313: warning: redefine encoding=
/usr/lib/ruby/1.8/tk.rb:2316: warning: redefine encoding

···

--
John Maclean
MSc (DIC)
07739 171 531

Something must have goofed up between your and my version of the book, on whichever version of ruby and tcl/tk that comes with Cygwin updated a week ago, what you posted does indeed generate something strange, however no errors.

Then I pasted the code from the PDF, version 2004-9-30, page 754 in the file, 726 in the book, I got the same image as in the book.

I'll go diff the two codes now.

David Vallner

···

On Sun, 15 Jan 2006 16:08:15 +0100, John Maclean <info@jayeola.org> wrote:

Chaps,

Please find below a script taken from "Programming Ruby", ed. 2, P747. Its intention is to "show off" the abilities of Tk and widgets. The script works but generates a different image to that shown in the book. What results do you guys have? I would be interested to know.

#!/usr/bin/ruby
require 'tk'
include Math

TkRoot.new do |root|
  title "Curves"
  geometry "400x400"
  TkCanvas.new(root) do |canvas|
    width 400
    height 400
    pack('side' => 'top' , 'fill' => 'both' , 'expand' => 'yes' )
      points =
      10.upto(30) do |scale|
        (0.0).step(2*PI,0.1) do |i|
          new_x = 5*scale*sin(i) + 200 + scale*sin(i*2)
          new_y = 5*scale*cos(i) + 200 + scale*cos(i*6)
          points << [ new_x, new_y ]
          f = scale/5.0
          r = (Math.sin(f)+1)*127.0
          g = (Math.cos(2*f)+1)*127.0
          b = (Math.sin(3*f)+1)*127.0

          col = sprintf("#%02x%02x%02x", r.to_i, g.to_i, b.to_i)
          if points.size ==3
            TkcLine.new(canvas,
                        points[0],[0], points[0],[1],
                        points[1],[0], points[1],[1],
                        points[2],[0], points[2],[1],
                        'smooth' => 'on',
                        'width' => 7,
                        'fill' => col,
                        'capstyle' => 'round')
             points.shift
           end
         end
       end
     end
   end
   Tk.mainloop

#errors generated
jayeola@tp20$ /usr/lib/ruby/1.8/tk.rb:2313: warning: redefine encoding=
/usr/lib/ruby/1.8/tk.rb:2316: warning: redefine encoding

Chaps,

Please find below a script taken from "Programming Ruby", ed. 2, P747. Its intention is to "show off" the abilities of Tk and widgets. The script works but generates a different image to that shown in the book. What results do you guys have? I would be interested to know.

#!/usr/bin/ruby
require 'tk'
include Math

TkRoot.new do |root|
  title "Curves"
  geometry "400x400"
  TkCanvas.new(root) do |canvas|
    width 400
    height 400
    pack('side' => 'top' , 'fill' => 'both' , 'expand' => 'yes' )
      points =
      10.upto(30) do |scale|
        (0.0).step(2*PI,0.1) do |i|
          new_x = 5*scale*sin(i) + 200 + scale*sin(i*2)
          new_y = 5*scale*cos(i) + 200 + scale*cos(i*6)
          points << [ new_x, new_y ]
          f = scale/5.0
          r = (Math.sin(f)+1)*127.0
          g = (Math.cos(2*f)+1)*127.0
          b = (Math.sin(3*f)+1)*127.0

          col = sprintf("#%02x%02x%02x", r.to_i, g.to_i, b.to_i)
          if points.size ==3
            TkcLine.new(canvas,
                        points[0],[0], points[0],[1],
                        points[1],[0], points[1],[1],
                        points[2],[0], points[2],[1],
                        'smooth' => 'on',
                        'width' => 7,
                        'fill' => col,
                        'capstyle' => 'round')
             points.shift
           end
         end
       end
     end
   end
   Tk.mainloop

#errors generated
jayeola@tp20$ /usr/lib/ruby/1.8/tk.rb:2313: warning: redefine encoding=
/usr/lib/ruby/1.8/tk.rb:2316: warning: redefine encoding

Something must have goofed up between your and my version of the book, on whichever version of ruby and tcl/tk that comes with Cygwin updated a week ago, what you posted does indeed generate something strange, however no errors.

Then I pasted the code from the PDF, version 2004-9-30, page 754 in the file, 726 in the book, I got the same image as in the book.

I'll go diff the two codes now.

David Vallner

Diff results after tweaking all the whitespace differences between the two files (the first is the PDF version, the second the code you posted):

2a3

23,25c24,26
< points[0][0], points[0][1],
< points[1][0], points[1][1],
< points[2][0], points[2][1],

···

On Sun, 15 Jan 2006 17:22:17 +0100, David Vallner <david@vallner.net> wrote:

On Sun, 15 Jan 2006 16:08:15 +0100, John Maclean <info@jayeola.org> > wrote:

---

points[0],[0], points[0],[1],
points[1],[0], points[1],[1],
points[2],[0], points[2],[1],

*coughs*
I rest my case.

David Vallner

Message-ID: <op.s3fhjzc9lyznzu@obyvacka.chello.sk>

>> #errors generated
>> jayeola@tp20$ /usr/lib/ruby/1.8/tk.rb:2313: warning: redefine encoding=
>> /usr/lib/ruby/1.8/tk.rb:2316: warning: redefine encoding

Please ignore this warning. That has no problem.

>> TkcLine.new(canvas,
>> points[0],[0], points[0],[1],
>> points[1],[0], points[1],[1],
>> points[2],[0], points[2],[1],
>> 'smooth' => 'on',
>> 'width' => 7,
>> 'fill' => col,
>> 'capstyle' => 'round')

Diff results after tweaking all the whitespace differences between the two
files (the first is the PDF version, the second the code you posted):

2a3
>
23,25c24,26
< points[0][0], points[0][1],
< points[1][0], points[1][1],
< points[2][0], points[2][1],
---
> points[0],[0], points[0],[1],
> points[1],[0], points[1],[1],
> points[2],[0], points[2],[1],

On current Ruby/Tk, a canvas Item can accept an array or arrays
as its coords.
That is, all of the followings are valid.

···

From: "David Vallner" <david@vallner.net>
Subject: Re: "Programming Ruby", ed. 2, P747. Script generated different image to book's example
Date: Mon, 16 Jan 2006 01:32:31 +0900
----------------------------------------------------------------
(0) TkcLine.new(canvas,
                points[0][0], points[0][1],
                points[1][0], points[1][1],
                points[2][0], points[2][1],
                :smooth=>'on', :width =>7, :fill=>col, :capstyle=>'round')

(1) TkcLine.new(canvas,
                points[0], points[1], points[2],
                :smooth=>'on', :width =>7, :fill=>col, :capstyle=>'round')

(2) TkcLine.new(canvas,
                points.flatten,
                :smooth=>'on', :width =>7, :fill=>col, :capstyle=>'round')

(3) TkcLine.new(canvas,
                points,
                :smooth=>'on', :width =>7, :fill=>col, :capstyle=>'round')
----------------------------------------------------------------
--
Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)

The bug was passing in literal arrays with one element, 0, or 1, to TkcLine::new. Using the whole 2D array at once looks nifty, it would indeed prevent that typo / slip of mind.

David Vallner

···

On Sun, 15 Jan 2006 18:02:20 +0100, Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp> wrote:

[snip]

>> TkcLine.new(canvas,
>> points[0],[0], points[0],[1],
>> points[1],[0], points[1],[1],
>> points[2],[0], points[2],[1],
>> 'smooth' => 'on',
>> 'width' => 7,
>> 'fill' => col,
>> 'capstyle' => 'round')

On current Ruby/Tk, a canvas Item can accept an array or arrays
as its coords.
That is, all of the followings are valid.
----------------------------------------------------------------
(0) TkcLine.new(canvas,
                points[0][0], points[0][1],
                points[1][0], points[1][1],
                points[2][0], points[2][1],
                :smooth=>'on', :width =>7, :fill=>col, :capstyle=>'round')

(1) TkcLine.new(canvas,
                points[0], points[1], points[2],
                :smooth=>'on', :width =>7, :fill=>col, :capstyle=>'round')

(2) TkcLine.new(canvas,
                points.flatten,
                :smooth=>'on', :width =>7, :fill=>col, :capstyle=>'round')

(3) TkcLine.new(canvas,
                points,
                :smooth=>'on', :width =>7, :fill=>col, :capstyle=>'round')
----------------------------------------------------------------

So, (he says, coming to the discussion late), what does this mean for the code i the book?

Cheers

Dave

···

On Jan 15, 2006, at 11:21 AM, David Vallner wrote:

The bug was passing in literal arrays with one element, 0, or 1, to TkcLine::new. Using the whole 2D array at once looks nifty, it would indeed prevent that typo / slip of mind.

The code is fine, for a code example explicitness seems more important to me instead of showing off - that's for the Ruby/Tk documentation to explain.

I suspect John McLean has a printed version of the book and made a blooper typing it into the computer.

David Vallner

···

On Mon, 16 Jan 2006 21:29:55 +0100, Dave Thomas <dave@pragprog.com> wrote:

On Jan 15, 2006, at 11:21 AM, David Vallner wrote:

The bug was passing in literal arrays with one element, 0, or 1, to TkcLine::new. Using the whole 2D array at once looks nifty, it would indeed prevent that typo / slip of mind.

So, (he says, coming to the discussion late), what does this mean for the code i the book?

Cheers

Dave

/me sighs happily

Thanks

···

On Jan 16, 2006, at 2:58 PM, David Vallner wrote:

The code is fine, for a code example explicitness seems more important to me instead of showing off - that's for the Ruby/Tk documentation to explain.