/* 
   Modul  : TURTLE
   Zweck  : Die Turtle als Modul
   Autor  : Gerhard Röhner
   Version: 1.0, 21.1.2000, Urfassung
      
   In das Library-Verzeichnis kopieren, in Prolog öffen und speichern
   und dann "make." aufrufen.

*/

:- module(turtle,
     [ turtle_init/0    % Turtle initialisieren.
     , turtle_term/0    % Turtle beenden.
     , turtle_drawto/2  % Zu einem absoluten Punkt P(X/Y) eine Linie zeichnen.
     , turtle_draw/1    % Eine Strecke der Länge L in aktuelle Richtung zeichnen.
     , turtle_turn/1    % Um den Winkel W relativ drehen.
     , turtle_turnto/1  % Zu einem absoluten Winkel W hindrehen.
     , turtle_move/1    % Eine Strecke der Länge L in aktuelle Richtung ohne Zeichnen bewegen.
     , turtle_moveto/2  % Zu einem festen Punkt (x/y) ohne Zeichnen bewegen.
     ]).

:- use_module(library(pce)).

turtle_init:-
   % alten Zustand löschen
   retractall(turtle(_,_,_)),

   % neuen Zustand setzen
   B is 400,
   H is 300,
   B1 is B /2,
   H1 is H / 2,
   W1 is 0,
   assert(turtle(B1, H1, W1)),
   
   % altes LOGO-Fenster schließen
   free(@logo),

   % neues LOGO-Fenster öffnen
   new(@logo, picture('LOGO', size(B, H))), send(@logo, open).

turtle_term:-
  retractall(logo/3),
  free(@logo).

turtle_drawto(X, Y):-
  retract(turtle(X1, Y1, W)),
  send(@logo, display, new(_, line(X1, Y1, X, Y))),
  assert(turtle(X, Y, W)).

turtle_draw(L):-
  retract(turtle(X1, Y1, W)),
  X2 is X1 + L*cos(W*pi/180),
  Y2 is Y1 - L*sin(W*pi/180),
  send(@logo, display, new(_, line(X1, Y1, X2, Y2))),
  assert(turtle(X2, Y2, W)).

turtle_turn(W):-
  retract(turtle(X, Y, W1)),
  W2 is W1 + W,
  assert(turtle(X, Y, W2)).

turtle_turnto(W):-
  retract(turtle(X, Y, _)),
  assert(turtle(X, Y, W)).

turtle_move(L):-
  retract(turtle(X1, Y1, W)),
  X2 is X1 + L*cos(W*pi/180),
  Y2 is Y1 - L*sin(W*pi/180),
  assert(turtle(X2, Y2, W)).

turtle_moveto(X, Y):-
  retract(turtle(_, _, W)),
  assert(turtle(X, Y, W)).

