User:Brian Schott/code/turtleGraphics/lab

From J Wiki
Jump to navigation Jump to search

Download the script here: File:Tgsj.ijt

LABTITLE=: 'TGSj: turtle graphics system'
LABAUTHOR=: 'Brian Schott'
LABCOMMENTS=: 0 : 0
The file tgsj.ijs must be in the directory '~addons'.
I received awesome help in developing this system from Fraser Jackson.
David Benn developed a similar system circa 1996.
This system highlights contolling multiple turtles in interactive mode.
A turtle state-change history dataset is generated using sparse arrays in SC.
State0 contains the initial turtle states.
)
LABFOCUS=: 1

NB. =========================================================
Lab Chapter Basic turtle movement
NB. =========================================================
Lab Section TGSj introduction
There are two Labs introducing aspects of Turtle Geometry in
J. They use two implementations which were designed to explore
different aspects of Turtle Geometry. One focuses on commands controlling multiple turtles using vector arguments, which is a strength of J, and the other on using paths as objects and matching the Logo Turtle syntax in J. Both are envisaged as first steps towards richer implementations for teaching purposes.

This Lab relates to the first approach above.

This turtle graphics system in J is called TGSj. Only part of a Logo-like syntax is implemented.
)

NB. =========================================================
Lab Section TGSj windows
There are two windows in this system:
    an .ijx window where you see this lab and type commands
    a graphics window showing the turtle(s) created

If you cannot see BOTH windows, then use the Windows|Forms...  menu to find BOTH and reposition them so that both are visible at all times. It is especially useful to resize the graphics window to be a little larger than its default size.

There is a red turtle facing up and a blue one facing east.
)
PREPARE
load jpath '~addons/tgsj.ijs'
PREPARE

NB. =========================================================
Lab Section Turtle movement and control
The basic turtle movement verbs are provided: forward, back, right, and left (abbreviated as fd, bk, rt, and left, respectively). Pen control verbs are provided: penup (pu), pendown (pd), pencolor.

The first examples below show verbs with scalar, not vector, arguments, but produce results for the multiple globally initialized turtles.

Enter the commands recommended below now.

   right 0
   forward 0
   lt 0
   bk 0
   pu ''
   pendown ''
)

NB. =========================================================
Lab Section
Each of the commands print out a text result in the .ijx window. The text result gives the current turtles' states corresponding to the potentially altered feature of the turtle movement or control you selected.

In all the cases above, no change really occurred because of the particular arguments supplied to the verbs.

You can deduce from the current state results printed above that there are two turtles, the turtles are facing direction 0 and 90 degrees, and the center of the graphics screen is x-y postion 0 0. The turtles each have their pens down.
)
PREPARE
pendown ''
PREPARE

NB. =========================================================
Lab Section
Try the following non-trivial turtle movements now.

Notice that both turtles respond although only one argument is supplied to each command.

Each turtle step is currently 5 units so fd 20 produces position changes of 5*20=100 .

   fd 20
   rt 90
   Position
   Heading
)

NB. =========================================================
Lab Section Screen clearing
The turtles can be sent home and the screen cleared with the following commands.

   home ''
   cs ''     NB. clearscreen ''
   rt 0
)

NB. =========================================================
Lab Chapter Programming repetition
NB. =========================================================
Lab Section repeats
"repeats" is a J conjunction that enables repetition somewhat like Logo's "repeat". The conjunction "repeats" takes two arguments itself, and the derived verb which is created can have either a monadic or dyadic form.

For example, consider the following command which repeats the monadic verb forward 4 times and each time the amount of forward movement is 10 steps (really 10*Stepsize, or 50). Notice when you type in this command, that the parentheses are not required in this monadic case.
    (4 repeats forward) 10

On most computers the graphing will occur so swiftly that you will not see the repetition, and the results will appear like simply fd 40 .

   4 repeats forward 10
)

NB. =========================================================
Lab Section
The J verb "fdrt" is dyadic.

   NB. verb fdrt is already typed in
   NB. a verb that combines J and turtle commands
   fdrt =: forwardright =: dyad define
   fd x
   rt y
   )

Because "fdrt" is dyadic, when it is used with "repeats", parentheses are required to inform the derived verb of the conjunction of its arguments.

Experiment by changing the number 20 to other numbers (negatives?).

   cs ''  [ home ''
   20 forwardright 90             NB. draws a corner and a side
   cs ''  [ home ''
   20 (4 repeats forwardright) 90 NB. draws a whole square
)

NB. =========================================================
Lab Section
Alone, accepting only one verb argument, "repeats" is rather limited. The following example, while producing an error-free turtle movement, repeats only the forward movement, not the turns. Furthermore, placing parentheses around the phrase "forward 10 [ right 90" does not produce a viable command either (because the conjunction has implicit parentheses only around "4 repeats forward").

4 repeats forward 10 [ right 90 [ clearscreen ''

Try it yourself.
)

NB. =========================================================
Lab Chapter Programming one-liners with "repeats"
NB. =========================================================
Lab Section "then" and "do"
"then" is a dyadic verb that takes text arguments and puts them into a column. It may be simpler to use "then" than to use the more primitive J verbs laminate (,:) and append (,).

"do" is the primitive ". .

Experiment with the following commands.

   'a' , 'b' ,: 'c'
   'a' then 'b' then 'c'
   'fd 30' then 'rt 90'
   do 'fd 30' then 'rt 90'
)

NB. =========================================================
Lab Section
"repeat" is a verb, not a conjunction, and is a synthesis of the ideas of David Benn, Brian Schott and Fraser Jackson, created by Fraser. "repeat" is monadic, but requires a 2-piece single argument. The first piece is the number or repetitions; the second piece is a text list describing the repeated turtle movements.

In this example the two boxed inputs are explicitly conjoined using J's primitive link (;). You will see that a square is produced. No text is output because of the prepended ''[

   ''[repeat 4 ; 'fd 30' then 'rt 90'
)

NB. =========================================================
Lab Section "rep" expands "repeat"
The verb "rep" is similar to "repeat", without a "do".

Try the following example.

rep 4; 'fd 30' then 'rt 90'
)

NB. =========================================================
Lab Section
Now we embed "rep" within a "repeat" to get a fancy one-liner of repeating boxes.

Definitely try this one.

   ''[repeat 24 ; (rep 4; 'fd 30' then 'rt 90') then 'rt 15'
)

NB. =========================================================
Lab Chapter Programming multiple turtles
NB. =========================================================
Lab Section Verb arguments
The main turtle movement verbs and control verbs constructed in Jlo are monadic and anticipate that multiple turtles may be employed. If only one argument is supplied to the turtle movement verbs, Jlo applies its value to ALL turtles. If more than one argument is supplied to the turtle movement verbs, Jlo applies them to the turtles in the order they are supplied. An error is signaled if (#argument)~:(#turtles) .

For example, try the commands below.

   cs ''[ home ''
   forward 15      NB. all turtles move forward 15 steps

                   NB. assuming there are 2 turtles,
   forward 15 _10  NB. turtle 0 moves forward 15 steps; turtle 1, back 10
)

NB. =========================================================
Lab Section
Most of the turtle control verbs expect their argument to be a list of turtle numbers for which the control is to apply, or an empty argument ('') if it is to apply to all turtles. An error is signaled if an invalid turtle number is supplied. For example.

   pendown ''      NB. all turtle pens are lowered

                   NB. the following will produce an error
   pendown 2 1     NB. because there are only turtles 0 and 1
)

NB. =========================================================
Lab Section Initializing turtles
A slightly different rule applies to the monadic version of the main turtle initialization verb, iTS =: initTurtleState . iTS places a single turtle at the center of the graphic screen and multiple turtles on a circle around the center, turtle(s) facing northward.

Monadic iTS requires a singleton input which is a whole number. The magnitude of the singleton number indicates the number of turtles to be created. A postive singleton number places the turtles at regular intervals around the circle; a negative singleton number places the turtles at IRregular intervals around the circle.

Try the following examples.

Notice that the Heading's are given in radians with East considered 0 and anticlockwise turns being "positive." The noun "Heading" typed reports the turtle headings in degrees and clockwise turns are "positive."

   iTS 3[cs ''
   Heading
   iTS 1[cs ''
   iTS _3[cs ''
)

NB. =========================================================
Lab Section
Dyadic iTS takes turtle heading information as the left-hand, as well as the monadic iTS's argument. For example to produce a new 2-turtle system with turtles facing 30 and 60 degrees right of north, enter the following.

   30 60 iTS 2[ cs ''
)

NB. =========================================================
Lab Chapter Programming repetition and recursion
NB. =========================================================
Lab Section spiro54
"spiro54" is created and executed by embedding the existing verb "forwardright" within an explicit J verb named spiro54 which contains a "for." loop control. The arguments for rt and fd in spiro54 are derived from dividing 360 degrees by 5*4 and 5, respectively . The example was suggested by Fraser Jackson's tutorial Lab for his similar system.

   spiro54 =: dyad define
   for. i. x do.
   rt 18
   y (5 repeats forwardright) 72
   end.
   )

The arguments of spiro54, 20 and 13, request 20 loops and sides of length 13. The 20 loops are chosen because 20=5*4 .

   20 spiro54 13 [ cs ''
   10 spiro54 13 25 [ cs ''
)
PREPARE
spiro54 =: dyad define
for. i. x do.
rt 18
y (5 repeats forwardright) 72
end.
)
PREPARE

NB. =========================================================
Lab Section polyspi
Recursive turtle graphics are also very straightforward by combining J verb definitions with turtle movement commands. "polyspi" is ubiquitous and various in Logo literature. Abelson and diSessa suggest the following recursive graphics.

   polyspi =: dyad define
   x rightforward y
   if. y > 25 do. return. end. NB. this line may not be needed
   x polyspi y+1
   )

On systems that have a "Break" feature, the indicated line may be unnecessary.

Notice that the two turtles are creating different polyspi's with the arguments 95 and 117 -- really  95,1  and 117,1 .

   95 117 polyspi 1 [cs ''
)
PREPARE
polyspi =: dyad define
x rightforward y
if. y > 25 do. return. end.
x polyspi y+1
)
PREPARE