I would like to use R.oo and tcltk to implement a Turtle World. I have encountered
many problems because:


1) I am not sure how to implement static fields with R.oo
2) I am not sure how to implement a constructor that would
call a function only for the first instance of a class (i.e., to initialize
value of static fields only once)
3) I am not sure how to remove/delete cleanly existing instances. In particular,
I don't know how to reset tcktk when the last instance is deleted.


Here is the sort of behavior I would like to get:

t1<-TurtleBasic()   # a window (the Turtle world) with a turtle appears
forward(t1,50)       #  the turtle moves (turtle's state is also updated)
turn(t1,pi/2)
forward(t1,50)
t2<-TurtleBasic()  # a second turtle in the Turtle world appears
turn(t2,pi/2)  # second turtle moves
forward(t1,50)
delete(t1) # first turtle disappears
delete(t2) # second turtle and the world disappears

If possible, I would like to keep this syntax. In fact, I am using R.oo to
create mutable objects so as to avoid syntax like tu<-forward(tu,10) which
would be more typical of a functional language like R. From the doc/help files of R.oo,
I believe that one could do it but I don't find many examples to guide me.


I pasted my current code with comments below. Thank you for your help.

Gabriel Baud-Bovy

#---------------------------------------------------------------------------------------------------------------------

Description of Turtle Basic Class:

private fields:
  .x, .y, .a (turtle position and heading)
  .turtle: ID of canvas item representing turtle
static fields:
  .canvas: tcltk canvas widget
  .top: tcktk toplevel widget
methods:
   TurtleBasic: constructor
   plot: display turtle in Turtle World
   forward, turn: move turtle
   delete: delete turtle (not implemented)

Note: My current code is very buggy:
- Can't see turtle movements
- Does not define method to delete turtles
- I get an tcltk error when I try to recreate a turtle world after having tried to destroy it
(for the moment, I need to detach tcltk to reset it)


#---------------------------------------------------------------------------------------------------------------------

library("R.oo")

setConstructorS3("TurtleBasic",function() {
  new<-extend(Object(),"TurtleBasic",.x=100,.y=100,.a=0,.turtle=NA)
  ## Create a new Turtle World if necessary
  require(tcltk) || stop("tcl/ library not available")
  if(!is.tkwin(new$.canvas)) { # check to see if it is first instance or not
    cat("Create Turtle World\n")
    top <- tktoplevel()
    tktitle(top) <- "Turtle World"
    canvas <- tkcanvas(top, relief="raised", width=200, height=200)
    tkpack(canvas, side="top", fill="both",expand="1")
    new$.canvas<-canvas                              # store canvas widget in static 
field
    new$.top<-top
  }
  plot.TurtleBasic(new)                                 # plot Turtle
  new
})

setMethodS3("plot","TurtleBasic",function(turtle) {
## delete old item (if it exists)
if(is.tkwin(turtle$.canvas) && is.tclObj(turtle$.turtle)) tkdelete(turtle$.canvas,turtle$.turtle)
## a new canvas item representing the turtle is created
## (note: it's necessary to make new item because turtle's heading can change)
x <- c(-10,10)
y <- c(-10,10)
aux<- cos(turtle$.a)*x+sin(turtle$.a)*y + turtle$.x
y <- -sin(turtle$.a)*x+cos(turtle$.a)*y + turtle$.y
x <- aux
turtle$.turtle <- tkcreate(turtle$.canvas, "line", x[1],-y[1],x[2],-y[2],width=1)
})


setMethodS3("forward","TurtleBasic",function(turtle,length){
  aux       <- turtle$.x + length*cos(turtle$.a)
  turtle$.y <- turtle$.y + length*sin(turtle$.a)
  turtle$.x <- aux
  plot(turtle)
})

setMethodS3("turn","TurtleBasic",function(turtle,angle){
   turtle$.a<-turtle$.a+angle
   plot(turtle)
})


if(0) {


t1<-TurtleBasic()  # a window (the Turtle world) with a turtle appears
forward(t1,50)
turn(t1,pi/2)
forward(t1,50)
t2<-TurtleBasic()  # a second turtle in the Turtle world
turn(t2,pi/2)

# manually destroy first turtle (would be great to define some sort of method for it)
tkdelete(t1$.canvas,t1$.turtle)
rm(t1)
# destroy second turtle and world
tkdelete(t2$.canvas,t2$.turtle)
tkdestroy(t2$.top)
rm(t2)


}
--------------------------------------------------------------------
Gabriel Baud-Bovy
Assistant Professor
UHSR University
via Olgettina, 58       tel:  (+39) 02 2643 4839
20132 Milan, Italy      fax: (+39) 02 2643 4892

______________________________________________
[EMAIL PROTECTED] mailing list
https://www.stat.math.ethz.ch/mailman/listinfo/r-help

Reply via email to