% This is the documentation of DrGeo
% Copyright 2002-2004 Ofset
% Licensed under the terms of the FDL
% Traduction and Italian version by Andrea Centomo <acentomo@ofset.org>

\documentclass[a4paper,11pt]{book}
\usepackage{hyperlatex}
\T \usepackage[pdftex]{color,graphicx}
\usepackage{makeidx}

\usepackage[latin1]{inputenc}
\usepackage[italian]{babel}

\usepackage{hyperref}

\captionsitalian
\dateitalian
\extrasitalian
\W \htmlpanelitalian


% Prepare macro
\newcommand{\drgeoImagePath}{../it/figures}
\newcommand{\drgeoApiOutLocale}{output}
\newcommand{\drgeoApiExampleLocale}{Esempio}
% Include common definitions
\input{../drgeniusCommon.tex}


\makeindex

\htmltitle{Manuale di Dr. Geo} 

\htmladdress{\small Hai domande o commenti da fare? \\
  Vuoi partecipare alla stesura di parti di questo manuale?\\
  -> Contatta Andrea Centomo all'OFSET (acentomo at ofset dot org) o
  aggiungiti alla lista per la diffusione di \drgeo.}


\title{Manuale di \drgeo \\
\drgeniusImage{fig0}
}
\author{Hilaire Fernandes \\ Andrea Centomo \\
\textit{OFSET}\\
\texttt{http://www.ofset.org}
}


\begin{document}

\W \begin{center}

\maketitle

\W \end{center}

\xname{contents}
\tableofcontents

\chapter*{Copyright}
Copyright (c)  2000-2004  OFSET.

      Permission is granted to copy, distribute and/or modify this document
      under the terms of the GNU Free Documentation License, Version 1.2
      or any later version published by the Free Software Foundation;
      with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
      A copy of the license is included in the section entitled "GNU
      Free Documentation License".
      
      Other copyright apply to the respective owners of the modified
      documentations. See the section history for the complet list.

\xname{introduction}
\chapter{Introduzione}

\drgeo\ \`e un programma Gnome per 
lo studio interattivo della geometria euclidea
e della programmazione Scheme.
Utilizzando \drgeo\ \`e possibile creare 
costruzioni geometriche e manipolarle in modo
da mantenere inalterate le loro propriet\`a geometriche
fondamentali ed introdurre lo studente in modo
graduale alla programmazione. 
\drgeo\ rappresenta, in questo senso, un ottimo ausilio
per la didattica della Matematica nel ciclo 
di istruzione primario e secondario.

\drgeniusFigureSize{La schermata iniziale di \drgeo}{fig1}{8}

La schermata iniziale evidenzia in alto due barre:

\begin{enumerate}

\item la \textit{barra dei menu} caratterizzata dalle voci
File, Modifica, Aiuto;

\item la \textit{barra delle azioni}: aprire una nuova figura,
aprire un nuovo foglio di testo, annullare o ripetere un comando. 

\end{enumerate}

Per creare una nuova figura geometrica \`e sufficiente cliccare
sul primo bottone nella barra delle azioni. Alternativamente
si pu\`o cliccare sull'opzione \drgeniusMenu{File -> Nuovo -> Figura}
della barra dei menu. Non appena creata una nuova figura geometrica, 
oltre ad un foglio da disegno bianco, comparir\`a 
la \textit{barra delle icone}, 
che contiene sette icone fondamentali
e che si conclude con un menu
per l'aggiustamento della scala della figura geometrica corrente.

\drgeniusFigureSize{Schermata iniziale di una costruzione geometrica}{fig2}{8}

Le prime sei icone della barra delle icone contengono
dei sottomenu a tendina relativi alle funzioni base e avanzate di
\drgeo\ per la cui descrizione si rimanda al 
capitolo successivo. 

\drgeniusFigureSize{Una figura geometrica in \drgeo\ e la 
sua descrizione}{fig50}{9}

Ogni figura \`e accompagnata da un \textit{albero sinottico} 
che riassume le costruzioni eseguite. Inizialmente 
l'albero \`e coperto in modo che solo il foglio 
di lavoro risulti visibile.
In ogni momento l'utilizzatore pu\`o aprirlo 
con la seguente procedura: si porta il mouse a sinistra
del righello verticale che delimita il foglio di lavoro fino a quando, 
nella zona centrale, la freccia del puntatore assume la forma $<->$; 
si clicca quindi con il tasto sinistro del mouse e tenendo 
premuto ci si sposta verso destra quanto si desidera allargare l'albero. 
L'albero, che descrive la figura 
geometrica corrente, presenta dei \textit{nodi} che possono 
essere espansi o compressi cliccando su 
linguette triangolari.

\chapter{Funzioni Base}

In questo capitolo vengono descritti gli strumenti 
necessari per la costruzione delle figure geometriche
e gli elementi fondamentali per la personalizzazione 
delle preferenze dell'utilizzatore.

\section{Strumenti di Costruzione}

Questi strumenti sono suddivisi in sei menu visualizzabili
cliccando con il mouse su ciascuna delle 
prime sei icone della barra delle icone
di \drgeo.

\drgeniusFigureSize{Gli strumenti di \drgeo\
e la loro descrizione}{fig3}{12}

\xname{point_tools}
\subsection{Costruzione di punti }

\subsubsection{Punto libero}
\drgeniusIcon{fig4}

\label{free_point}
\drgeniusIndex{Punto:}{libero}{}{}

Selezionando questo comando si possono creare
sul foglio di lavoro un punto o un punto su un
oggetto (retta, semiretta, ...) tracciato
in precedenza.

Nel primo caso il punto si costruisce cliccando 
con il mouse nel punto del foglio di lavoro desiderato e, 
se necessario, potr\`a essere successivamente spostato
dinamicamente all'interno del foglio di lavoro. 

Nel secondo caso il punto si costruisce cliccando 
sull'oggetto geometrico desiderato e, se necessario,
potr\`a essere successivamente spostato, 
rimanendo tuttavia vincolato all'oggetto
geometrico su cui \`e stato creato.

\subsubsection{Punto medio}
\drgeniusIcon{fig5}

\drgeniusIndex{Punto:}{medio}{}{}

Selezionando questo comando si pu\`o costruire 
il punto medio o di un segmento o di una coppia di punti dati.
Nel primo caso il punto medio si ottiene cliccando 
con il mouse direttamente sul segmento. Nel secondo caso
il punto medio si ottiene cliccando in sequenza sui due 
punti dati. 

\subsubsection{Punti di intersezione}
\drgeniusIcon{fig6}

\drgeniusIndex{Punto:}{di intersezione}{}{}

Selezionando questo comando si ottengono uno o pi\`u
punti di intersezione tra due oggetti geometrici dati.
Per creare i punti di intersezione \`e necessario cliccare
con il mouse in sequenza sui due oggetti geometrici da intersecare.

\subsubsection{Punto definito attraverso coordinate}
\drgeniusIcon{fig7}
\label{coordinate_point}

\drgeniusIndex{Punto:}{definito attraverso coordinate}{}{}

Selezionando questo comando si definisce un punto 
precisando le sue coordinate cartesiane (ascissa e
ordinata). Le coordinate devono essere state scritte
precedentemente nel foglio di lavoro utilizzando le modalit\`a
per editare un numero descritte nel paragrafo Strumenti numerici.

\xname{line_tools}
\subsection{Costruzione di linee}

\subsubsection{Retta}
\drgeniusIcon{fig8}

\drgeniusIndex{Retta}{}{}{}

Selezionando questo comando si costruisce una retta 
passante per due punti dati. Si clicca con il mouse
sui due punti dati.

\subsubsection{Semiretta}
\drgeniusIcon{fig9}

\drgeniusIndex{Semiretta}{}{}{}

Selezionando questo comando si costruisce una semiretta. 
Si clicca con il mouse in sequenza su due punti di cui 
il primo \`e l'origine della semiretta.

\subsubsection{Segmento}
\drgeniusIcon{fig10}

\drgeniusIndex{Segmento}{}{}{}

Selezionando questo comando si costruisce un segmento. 
Si clicca con il mouse su due punti dati che rappresentano
gli estremi del segmento. 

\subsubsection{Vettore}
\drgeniusIcon{fig11}

\drgeniusIndex{Vettore}{}{}{}

Selezionando questo comando si costruisce un vettore. 
Si clicca con il mouse su due punti dati che rappresentano
nell'ordine coda e punta del vettore.

\subsubsection{Circonferenza}
\drgeniusIcon{fig12}

\drgeniusIndex{Circonferenza}{}{}{}

Selezionando questo comando si costruisce una circonferenza
secondo tre possibili modalit\`a:
\begin{enumerate}
 \item si clicca con il mouse in sequenza su due punti dati che sono, 
nell'ordine, il centro della circonferenza e un punto ad essa
appartenente;
 \item si clicca con il mouse su un punto che rappresenta il centro 
della circonferenza e si seleziona un numero che rappresenta il raggio
della circonferenza;
 \item  si clicca con il mouse in sequenza su un punto, 
che rappresenta il centro della circonferenza, e su 
un segmento la cui lunghezza rappresenta il raggio
della circonferenza. 
\end{enumerate}

\subsubsection{Arco di circonferenza}
\drgeniusIcon{fig13}

\drgeniusIndex{Arco di circonferenza}{}{}{}

Selezionando questo comando si costruisce un
arco di circonferenza. Si clicca con il mouse su
tre punti di cui il primo e il terzo sono 
gli estremi dell'arco mentre
il secondo \`e un punto appartenente all'arco. 

\subsubsection{Luogo}
\drgeniusIcon{fig14}

\drgeniusIndex{Luogo}{}{}{}

Selezionando questo comando si costruisce un luogo 
geometrico definito da due punti. Si clicca 
con il mouse su due punti di cui il primo \`e libero di muoversi 
su una linea mentre il secondo \`e vincolato
a muoversi con il secondo.

\subsubsection{Poligono}
\drgeniusIcon{fig15}

\drgeniusIndex{Poligono}{}{}{}

Selezionando questo comando si costruisce un poligono
dati i suoi $n$ vertici. Si clicca con il 
mouse $n+1$ volte in sequenza
su tutti i vertici del poligono 
avendo cura di cliccare all'inizio
e alla fine sul medesimo vertice; 
in questo modo \drgeo\
comprende che la costruzione del 
poligono \`e conclusa.
In \drgeo\ i poligoni sono oggetti geometrici speciali in 
quanto su essi non \`e possibile disegnare un punto cos\`{\i}
come non \`e possibile determinare i punti di intersezione
tra due qualsiasi di essi.
 
\xname{transformation_tools}
\subsection{Trasformazioni del piano}

Questo menu permette di studiare le isometrie
del piano euclideo e le trasformazioni omotetiche. 

\subsubsection{Retta parallela}
\drgeniusIcon{fig16}

\drgeniusIndex{Retta}{parallela}{}{}

Selezionando questo comando, dati una retta e un 
punto ad essa esterna, si costruisce la retta
parallela alla data passante per quel punto. 
Si clicca con il mouse su un punto e una retta dati.

\subsubsection{Retta perpendicolare}
\drgeniusIcon{fig17}

\drgeniusIndex{Retta}{perpendicolare}{}{}

Selezionando questo comando, dati una retta e un 
punto ad essa esterna, si costruisce la retta 
perpendicolare alla data passante per quel punto.
Si clicca con il mouse su un punto e una retta dati.

\subsubsection{Riflessione}
\drgeniusIcon{fig18}

\drgeniusIndex{Trasformazioni del piano:}{riflessione}{}{}

Selezionando questo comando si esegue una riflessione
intorno ad una retta (asse di riflessione) di 
un qualsiasi oggetto geometrico.  
Si clicca con il mouse sull'oggetto e sull'asse di riflessione.
Se l'oggetto da riflettere \`e una retta prima si deve 
selezionare la retta da riflettere e solo dopo l'asse di riflessione.
  
\subsubsection{Simmetria centrale}
\drgeniusIcon{fig19}

\drgeniusIndex{Trasformazioni del piano:}{simmetria}{centrale}{}

Selezionando questo comando si esegue una simmetria
rispetto ad un punto (centro di simmetria) di 
un qualsiasi oggetto geometrico. Si clicca con il mouse
sull'oggetto e sul punto che \`e centro di simmetria. 
Se l'oggetto da riflettere \`e un punto prima si deve 
selezionare il punto da trasformare e solo dopo il centro di
simmetria.  

\subsubsection{Traslazione}
\drgeniusIcon{fig20}

\drgeniusIndex{Trasformazioni del piano:}{traslazione}{}{}

Selezionando questo comando si esegue una traslazione
di un qualsiasi oggetto geometrico. Si clicca con il mouse
sull'oggetto da traslare e sul vettore che rappresenta
la traslazione. Se l'oggetto da traslare \`e un vettore 
prima si deve selezionare il vettore da trasformare e solo 
dopo il vettore che individua la traslazione.  

\subsubsection{Rotazione}
\drgeniusIcon{fig21}

\drgeniusIndex{Tranformazioni del piano:}{rotazione}{}{}

Selezionando questo comando si esegue una rotazione di un
angolo fissato rispetto ad un centro (centro di rotazione) di 
un qualsiasi oggetto geometrico. Si clicca con il mouse
sull'oggetto e sul punto che \`e centro di rotazione. 
Se l'oggetto da ruotare \`e un punto prima si deve 
selezionare il punto da ruotare e solo dopo il centro di
rotazione.  

Il valore dell'angolo di rotazione pu\`o essere definito 
in diversi modi:

\begin{itemize}
\item \textbf{valore numerico}: in questo caso l'angolo viene
espresso in radianti. Esempi di valori numerici sono:
le lunghezze di segmenti, le distanze tra punti, le coordinate
di un punto, i valori numerici restituiti da script 
Guile per \drgeo, ecc.;
\item \textbf{angolo formato da tre punti}: in questo caso
l'angolo si esprime in gradi e il suo valore 
appartiene all'intervallo $[0^{o};180^{o}]$;
\item \textbf{angolo orientato tra vettori}:
in questo caso l'angolo si esprime in gradi e il suo valore 
appartiene all'intervallo $]-180^{o};+180^{o}]$;
\end{itemize}

\subsubsection{Omotetia}
\drgeniusIcon{fig22}

\drgeniusIndex{Trasformazioni del piano:}{omotetia}{}{}

Selezionando questo comando si esegue una omotetia di 
un qualsiasi oggetto geometrico. Si clicca con il mouse
sull'oggetto da trasformare, sul punto che rappresenta il centro
di omotetia e su un numero che rappresenta il fattore di scala. 

\xname{numeric_tools}
\subsection{Strumenti numerici}
\label{strumenti numerici}

Questo menu permette di editare e manipolare
valori numerici.

\subsubsection{Distanze, lunghezze e numeri}
\drgeniusIcon{fig23}
\label{numeric_tool}

\drgeniusIndex{Numero}{}{}{}
\drgeniusIndex{Retta:}{pendenza}{}{}
\drgeniusIndex{Retta:}{distanza da}{}{}
\drgeniusIndex{Circonferenza:}{lunghezza}{}{}
\drgeniusIndex{Segmento:}{lunghezza}{}{}
\drgeniusIndex{Vettore:}{norma}{}{}
\drgeniusIndex{Arco di circonferenza:}{lunghezza}{}{}
\drgeniusIndex{Numero:}{valore libero}{}{}

Selezionando questo comando viene creato 
un valore numerico in molti modi diversi:
\begin{enumerate}
\item 
cliccando con il mouse su due punti
viene visualizzata la loro distanza;
\item 
cliccando con il mouse su un vettore o su un segmento
viene visualizzata la sua lunghezza;
\item
cliccando con il mouse su una circonferenza
viene visualizzata la sua lunghezza; 
\item 
cliccando con il mouse su un arco
viene visualizzata la sua lunghezza;
\item 
cliccando con il mouse su una retta
viene visualizzato il suo coefficiente angolare;
\item 
cliccando con il mouse su una retta e su un punto 
viene visualizzata la distanza tra il punto e la retta stessa;
\item 
\textbf{cliccando con il tasto sinistro del mouse sullo sfondo}
si pu\`o inserire nel foglio di lavoro un valore numerico qualsiasi.
\end{enumerate}

L'ultima modalit\`a risulta molto utile nella pratica in quanto capita 
spesso di aver bisogno di inserire nel foglio di lavoro un numero 
che potr\`a rappresentare una coordinata, una lunghezza o 
l'ampiezza di un angolo prefissato.

\subsubsection{Angolo}
\drgeniusIcon{fig24}

\drgeniusIndex{Angolo:}{geometrico}{}{}{}
\drgeniusIndex{Angolo:}{orientato}{}{}{}

Selezionando questo comando \`e possibile misurare 
l'ampiezza di un angolo o dell'angolo compreso tra due vettori.
Nel primo caso si clicca in sequenza su tre punti: il primo e il terzo
appartengono ai lati dell'angolo e il secondo \`e il vertice
dell'angolo. Nel secondo caso si clicca con il mouse sui due vettori.
Osserviamo che nel primo caso l'angolo non \`e orientato 
e il valore della sua ampiezza non supera l'ampiezza
di un angolo piatto. Nel caso dei vettori l'angolo \`e orientato
e varia tra $]-180^{o};+180^{o}]$.

\subsubsection{Coordinate cartesiane}
\drgeniusIcon{fig25}

\drgeniusIndex{Punto:}{coordinate di}{}{}
\drgeniusIndex{Vettore:}{coordinate di}{}{}

Selezionando questo comando si possono visualizzare le coordinate
cartesiane di un punto o di un vettore. Si clicca con il mouse 
su un punto (o su un vettore) e vengono visualizzate, sovrapposte
verticalmente, la sua ascissa e la sua ordinata.

\subsubsection{Script Guile per \drgeo}
\label{script-tool}
\drgeniusIcon{fig49}

\drgeniusIndex{Script}{}{}{}

Selezionando questo comando si attiva la funzione 
per creare script Guile per \drgeo. 
In generale uno script riceve in ingresso un
certo numero di oggetti geometrici e in uscita fornisce 
un numero che viene visualizzato nell'area di lavoro.
Per gli approfondimenti su questo importante argomento si rinvia 
ai contenuti dedicati alle \link{Funzioni Avanzate}[ Capitolo \Ref]{advancedFeatures}
e in particolare alla
\link{script}[ Sezione \Ref, pagina \Pageref]{script}.

\xname{macroconstruction_tools}
\subsection{Strumenti per la costruzione di macro}

\drgeniusIndex{Macro-costruzione}{}{}{}

La costruzione di macro rappresenta uno
degli aspetti essenziali di \drgeo\ in quanto 
in questo modo possiamo ampliare indefinitamente il numero 
degli strumenti di costruzione in esso presenti.

\subsubsection{Creare una macro-costruzione}
\drgeniusIcon{fig26}

Selezionando questo comando inizia il procedimento guidato di 
realizzazione di una macro.
\drgeniusNote{Le macro-costruzioni sono esposte 
nella sezione \link{macro-costruzioni}[ \Ref, pagina \Pageref]{macroConstruction}.}
\subsubsection{Eseguire una macro-costruzione}
\drgeniusIcon{fig27}

Selezionando questo comando inizia il procedimento
guidato per l'esecuzione di 
una Macro precedentemente costruita.
\drgeniusNote{Le macro-costruzioni sono esposte nella
sezione \link{macro-costruzioni}[ \Ref, pagina \Pageref]{macroConstruction}.}

\xname{other_tools}
\section{Altre funzioni}

In questo capitolo si analizzano le funzioni 
per manipolare dinamicamente i diversi oggetti geometrici.

\subsection{Spostamento di un oggetto geometrico}
\drgeniusIcon{fig28}

\drgeniusIndex{Oggetto geometrico:}{spostamento di}{}{}

Questa funzionalit\`a \`e molto importante e rappresenta
uno dei punti di forza di \drgeo. Dopo aver selezionato
questo comando e dopo aver spostato il mouse su un qualsiasi oggetto 
geometrico, tenendo premuto il tasto sinistro del mouse e contemporaneamente
muovendo il mouse stesso, si sposta l'oggetto geometrico 
selezionato mantenendo tuttavia invariate le 
caratteristiche geometriche della costruzione.

\subsection{Cancellazione di un oggetto geometrico}
\drgeniusIcon{fig30}

\drgeniusIndex{Oggetto geometrico:}{cancella}{}{}

Questa funzionalit\`a permette di cancellare oggetti geometrici 
precedentemente creati. Dopo aver selezionato il comando,
cliccando con il mouse su un oggetto si ottiene l'apertura
di una finestra che chiede la conferma per l'eliminazione
dell'oggetto stesso. Se per errore si elimina un oggetto
che invece si desiderava mantenere \`e possibile rigenerarlo
selezionando il comando ``Annulla'' nella barra delle icone 
o nel menu ``Modifica''. Di default si possono ricostruire
fino a 5 oggetti cancellati tuttavia questo numero pu\`o
essere modificato andando a modificare le Preferenze.
\xname{editing_object_styles}
\subsection{Modificare lo stile di un oggetto}
\label{object-style}
\drgeniusIcon{fig29}

\drgeniusIndex{Modifica:}{stile}{}{}

\drgeniusIndex{Oggetto geometrico:}{rinomina}{}{}

\drgeniusIndex{Oggetto geometrico:}{nascondi}{}{}

Selezionando questo comando si pu\`o modificare
lo stile proprio di un oggetto che \`e definito dalle seguenti
caratteristiche: colore, spessore, etichetta, dimensione e
forma. Oltre a questo \`e possibile nascondere temporaneamente
un oggetto presente in una costruzione senza tuttavia cancellarlo.
Ci\`o pu\`o essere utile per gli oggetti geometrici che 
dopo essere stati usati in una costruzione
geometrica non si desidera siano visibili.
Quando, dopo aver selezionato questo comando, si clicca con 
il mouse su un oggetto, compare una finestra di dialogo che 
permette di modificare tutte le sue propriet\`a.

La finestra di dialogo ha preferenze leggermente diverse 
in relazione al particolare tipo di oggetto geometrico.
La finestra di dialogo relativa ai punti \`e rappresentata in figura:
 
\drgeniusFigure{Finestra di dialogo stile Punto}{fig31}

e si nota che questa finestra \`e diversa da quella 
relativa alle linee (retta, semiretta, vettore, ecc...)
rappresentata pi\`u in basso. Dal momento che questi 
oggetti vengono definiti specificando una coppia di punti
essi non possono essere rinominati in quanto il 
loro nome viene riferito al nome della coppia di
punti che li definisce.

\drgeniusFigure{Finestra di dialogo stile Linea}{fig32}

Una finestra del tutto analoga permette di modificare anche 
lo stile di una circonferenza, di un arco e di un luogo.

Una terza finestra di dialogo permette di modificare 
lo stile in cui vengono presentati i diversi valori numerici
(direttamente editati dall'utente, generati da uno script Guile
per \drgeo\ o altro) e l'aspetto dei poligoni:

\drgeniusFigure{Finestra di dialogo stile Numeri e Poligoni}{fig33}

\subsection{Modificare le propriet\`a di un oggetto}
\label{property-item}
\drgeniusIcon{fig52}

\drgeniusIndex{Modifica:}{propriet\`a}{}{}

\drgeniusIndex{Modifica:}{punto}{}{}

\drgeniusIndex{Modifica:}{script}{}{}

\drgeniusIndex{Modifica:}{valore}{}{}

L'utilizzatore di \drgeo\ \`e 
libero di modificare, attraverso questo comando,
le propriet\`a di alcuni oggetti. 
Cliccando con il mouse su essi si apre una finestra 
di dialogo per la modifica delle propriet\`a. 
Allo stato attuale di sviluppo del programma possono 
essere modificate le propriet\`a dei seguenti oggetti:

\begin{enumerate}
 \item punto libero: si possono modificare ascissa e ordinata\\
 \drgeniusFigure{Cambiamento delle coordinate di un punto}{fig34}
 
 \item valore numerico: si pu\`o modificare un valore numerico libero\\
 \drgeniusFigure{Modifica di un valore numerico}{fig36}
 
 \item script:  si pu\`o modificare il codice di uno script\\
 \drgeniusFigure{Modifica di uno script}{fig35}

\end{enumerate}

\T \clearpage
\section{Preferenze}

\xname{default_behaviour}
\subsection{Preferenze di default}
\label{default_behaviour}

\drgeniusIndex{Modifica:}{preferenze di default}{}{}

Le preferenze di default di \drgeo\ possono essere configurate 
in pi\`u modi. Per parametrizzare le preferenze 
si accede al menu \drgeniusMenu{Modifica -> Preferenze} e si 
apre la seguente finestra di dialogo:

\drgeniusFigureSize{Preferenze globali}{fig37}{8}

La finestra di dialogo \`e articolata in due sezioni:
\begin{enumerate}
\item La prima sezione riguarda le preferenze relative 
      agli oggetti geometrici e permette di modificare
      l'aspetto di ciascuno di essi;
\drgeniusIndex{Modifica:}{stile di default}{}{}
\item La seconda sezione permette di modificare 
      alcune preferenze globali come:\\
\begin{itemize}
\drgeniusIndex{Modifica:}{preferenze di default:}{annulla/rifai}{}{}
\item 
  il numero di oggetti cancellati per errore e ricostruibili
  utilizzando il comando Annulla/Rifai;
  \drgeniusIndex{Modifica:}{preferenze di default:}{nomi}{}
\item 
il nome di default che si attiva ogni volta che un dato 
oggetto viene costruito. Il \%d viene rimpiazzato da un 
numero intero generato da \drgeo; 
questo valore viene incrementato di una unit\`a ad 
ogni nuova costruzione di un oggetto dello stesso tipo;
\item 
i nomi di default per l'esportazione in formato 
\LaTeX\ e PostScript ;
\end{itemize}
\end{enumerate}

\subsection{Altre preferenze}

\drgeniusIndex{Figura:}{rinomina}{}{}

Oltre alle preferenze di default di \drgeo\ \`e possibile modificare 
il nome di un oggetto geometrico a partire dal menu
\drgeniusMenu{Modifica -> Rinomina}.

\drgeniusFigure{Modifica nome di una figura}{fig39}

\chapter{Funzioni Avanzate}
\label{advancedFeatures}

In questo capitolo vengono presentate le funzionalit\`a che 
permettono di estendere in modo  
sostanzialmente indefinito le potenzialit\`a di \drgeo\  
o di adattarne l'uso alle pi\`u svariate situazioni pedagogiche.

La prima funzione avanzata che si considera riguarda la 
creazione di \textit{macro-costruzioni} o, pi\`u brevemente, di macro. 
Attraverso la costruzione di una macro \`e possibile definire in
\drgeo\ una nuova costruzione geometrica, salvarla in un file 
con estensione \textbf{.mgeo} e richiamarla quando necessario. 

La seconda funzione avanzata che si considera consiste nella stesura 
di \textit{script Guile} per \drgeo\ o, pi\`u brevemente, di DGS. 
Questa funzionalit\`a, come la costruzione di macro, 
permette di  estendere le potenzialit\`a di 
\drgeo\ permettendo all'utilizzatore
di familiarizzare con la stesura di script in linguaggio Scheme. 
Uno script DGS generalmente 
ha in ingresso valori numerici relativi ad uno o pi\`u
oggetti geometrici (lunghezza di un segmento, coordinata di 
un punto) e restituisce sempre in uscita un numero.
Per fare un esempio, come vedremo, si pu\`o scrivere un DGS per calcolare 
l'area di un triangolo. In questo caso in ingresso sono date le lunghezze
di base e altezza del triangolo e in uscita si ottiene l'area
del triangolo. 

Un ultimo aspetto avanzato di \drgeo\ riguarda la possibilit\`a
di \textit{modificare l'interfaccia utente} in modo da escludere 
una o pi\`u costruzioni geometriche normalmente disponibili.
Ci\`o potrebbe essere di interesse in alcune situazioni 
didattiche in cui si vuole costringere l'utilizzatore a lavorare
in un ambiente con un set di costruzioni limitato.
\xname{using_macro}
\section{Macro-costruzioni}
\label{macroConstruction}

\drgeniusIndex{Macro-costruzione:}{introduzione}{}{}

La costruzione di una macro \`e una procedura attraverso 
la quale \`e possibile aggiungere a \drgeo\ una nuova costruzione.
Come in ogni costruzione geometrica si definiscono
un certo numero di oggetti geometrici 
in ingresso e si ottengono alcuni oggetti geometrici in uscita. 
L'utilizzatore di \drgeo\ stabilisce 
gli oggetti iniziali e finali della macro-costruzione, che poi 
verr\`a salvata in un file con estensione .mgeo. 

La costruzione di una macro 
deve essere logicamente coerente: gli oggetti 
finali della macro devono dipendere in modo esclusivo 
dagli oggetti iniziali in modo che \drgeo\
possa ricostruire senza ambiguit\`a l'intera costruzione.
Da questo punto di vista \drgeo\ \`e in grado
di memorizzare la sequenza della costruzione 
e di riprodurla ogni volta che l'utilizzatore,
dopo aver azionato il comando di esecuzione di una macro,
andr\`a a cliccare su oggetti geometrici che 
coincidono con gli oggetti in ingresso della macro.

\drgeniusNote{Quando si esegue una macro vengono ricostruiti
tutti gli oggetti geometrici intermedi necessari per la costruzione
degli oggetti finali della macro.}

Per illustrare il modo in cui avviene la costruzione di 
una macro analizziamo in dettaglio, come esempio, 
la costruzione di una circonferenza passante per tre punti dati.

\drgeniusFigureSize{Figura iniziale}{fig40}{4}
\drgeniusIndex{Macro-costruzione:}{crea}{}{}

Prima di creare una macro-costruzione \`e necessario
eseguire la costruzione che porta agli oggetti finali
in modo da rendere disponibile a \drgeo\ un modello. 
Nel nostro caso la costruzione \`e la seguente:

\drgeniusFigureSize{Figura finale}{fig41}{4}

\subsection{Realizzare una macro-costruzione}

A questo punto la sequenza di costruzione \`e completa
ed \`e necessario avvertire \drgeo\ che, a partire
da questa sequenza, si desidera costruire una macro.
Per fare questo si seleziona, nella barra delle icone, il comando
\drgeniusMenu{Costruire una macro} 
\drgeniusIcon{fig26}
o si seleziona l'analogo comando dal menu azionabile 
cliccando con il tasto destro del mouse in un punto dello sfondo.
Si apre allora una finestra di dialogo che riassume 
i passaggi necessari per costruire una macro:
definizione degli oggetti iniziali e finali,
scelta del nome e descrizione.  

\drgeniusFigureSize{Prima pagina della finestra di dialogo
per costruire una macro}{fig42}{6}

Procedendo si apre una seconda pagina in cui 
vengono selezionati gli oggetti iniziali della
macro. Nel nostro esempio sono i tre punti iniziali.
Per inserirli \`e sufficiente cliccare 
su ciascuno di essi.

\drgeniusFigureSize{Seconda pagina: i tre punti sono stati selezionati}{fig43}{6}

Procedendo si apre una terza pagina in cui 
vengono selezionati gli oggetti finali della
macro. Nel nostro esempio gli oggetti finali sono la circonferenza
e il suo centro.
Per inserirli \`e sufficiente, come in precedenza, cliccare su 
ciscuno di essi.

\drgeniusFigureSize{Terza pagina: circonferenza e suo centro
sono stati selezionati}{fig44}{6}
 
Procedendo si apre una quarta pagina in cui 
vengono inseriti il nome e la descrizione 
della macro. Queste informazioni sono utili
quando la macro-costruzione verr\`a 
nuovamente utilizzata, magari a distanza di tempo,
durante altre sessioni di lavoro. A questo proposito
si consiglia di scegliere opportunamente il nome 
delle macro in modo da non confonderle tra loro.

\drgeniusFigureSize{Quarta pagina: nome e descrizione 
della macro sono stati inseriti}{fig45}{6}

Procedendo ancora si apre una quinta pagina 
con i bottoni per conludere la costruzione
o per tornare indietro ed emendare possibili
errori.

\drgeniusNote{Se oggetti iniziali e finali non trovano corrispondenza
(\drgeo\ non riesce a comprendere la logica della costruzione), 
la macro non pu\`o essere costruita. In questo caso \`e necessario
fare marcia indietro e modificare il contenuto di 
alcune pagine precedenti.}

Nel caso in cui la costruzione sia corretta la macro viene 
creata e memorizzata in \drgeo. 
Vedremo ora come sia possibile riutilizzare 
una macro costruita in precedenza e salvata.

\subsection{Eseguire una macro-costruzione}

\drgeniusIndex{Macro-costruzione:}{esegui}{}{}

Per eseguire una macro-costruzione \`e necessario
selezionare nella barra delle icone il comando
\drgeniusMenu{Eseguire una macro precostruita} 
\drgeniusIcon{fig27} o selezionare l'analogo comando dal menu azionabile 
cliccando con il tasto destro del mouse in un punto dello sfondo.

Si apre allora una finestra di dialogo che riassume 
i passaggi necessari per eseguire una macro:
scelta della macro dalla lista macro,
selezione, nella vista corrente, degli oggetti
geometrici necessari per eseguire la macro. 

Procedendo si apre una seconda pagina 
con un elenco da cui \`e possibile 
selezionare la macro desiderata. A
questo punto, per eseguire la macro,
basta cliccare con il mouse sugli oggetti 
geometrici della figura corrispondenti 
agli oggetti iniziali della macro stessa. 

\drgeniusFigureSize{Seconda pagina: selezione di una macro}{fig46}{6}

Se ci riferiamo all'esempio precedente della circonferenza per tre punti
per eseguire la macro dobbiamo avere a disposizione sul foglio
di lavoro almeno tre punti.

\drgeniusFigureSize{Foglio di lavoro con tre punti}{fig47}{4}

Cliccando sui tre punti la macro viene eseguita e compare
la circonferenza passante per i tre punti e il suo 
centro.

\drgeniusFigureSize{Figura finale: circonferenza e centro}{fig48}{4}

\T \clearpage

\xname{drgenius_guile_script}
\section{Script Guile per \drgeo }
\label{script}

\drgeniusIndex{Script:}{introduzione}{}{}

Il software \drgeo\ \`e compatible con Guile; 
ci\`o significa che con \drgeo\ \`e possibile eseguire degli script 
Scheme che si appoggiano all'interprete Guile. 
Ma, che cos'\`e Guile? Se andiamo a leggere l'inizio 
del manuale di Guile troviamo scritto:

\begin{quote}{\em
Guile \`e un interprete per il linguaggio di programmazione Scheme che 
pu\`o essere utilizzato in molti ambienti.
}
\end{quote}

La citazione seguente descrive in modo pi\`u preciso come utilizzare 
Guile in \drgeo:

\begin{quote}{\em
Analogamente ad un terminale, Guile pu\`o essere lanciato in modo interattivo, 
pu\`o ricevere espressioni scritte dall'utilizzatore, elaborarle e restituire 
dei risultati. Alternativamente  come interprete di script, Guile \`e in grado 
di leggere ed eseguire un codice Scheme contenuto in un file. 
In questo modo Guile \`e disponibile, sotto forma di biblioteca, per permettere 
ad applicazioni di vario tipo di incorporare facilmente e in modo completo 
un interprete Scheme. Una applicazione pu\`o utilizzare Guile come un languaggio 
potente di estensione o di autoconfigurazione, o come un adesivo universale 
per ``incollare'' funzioni primitive fornite dall'applicazione. 
}
\end{quote}

In \drgeo, una API viene resa disponibile a partire dall'interprete
Guile. L'utilizzatore di \drgeo, attraverso gli script
pu\`o manipolare opportunamente oggetti (geometrici o numerici)
contenuti in una figura. Oltre a questo, dal momento che uno 
script viene considerato un oggetto come altri 
non vi \`e alcun bisogno di salvarlo
separatamente dalla figura in cui \`e contenuto. D'ora in poi,
per indicare uno script Guile,
utilizzeremo sempre l'acronimo DGS (``\drgeo\ Guile Script'').

\subsection{DGS attraverso esempi}

\drgeniusIndex{Script:}{esempi}{}{}

Il comando per creare un DGS \`e disponibile 
all'interno della sezione riguardante i numeri
del menu azionabile cliccando con il tasto destro del mouse 
in un punto dello sfondo o nella barra delle icone.
Un DGS pu\`o ricevere da 0 a $n$ parametri di ingresso. 

Conviene a questo punto passare direttamente all'analisi
di qualche esempio di DGS che permetta di comprendere 
facilmente le potenzialit\`a di questo strumento.
Macro e DGS conferiscono a \drgeo\ un aspetto
speciale\footnote{Le macro costituiscono l'aspetto
geometrico, gli script, quello numerico di un 
programma nato all'insegna di uno spirito ``hacker''}
nel panorama dei programmi di studio interattivo
della geometria euclidea.
Oltre a questo \`e importante comprendere come, attraverso
i DGS, vengano messe a dispozione la 
maggior parte delle funzionalit\`a dell'interprete 
GNU Guile. Ci\`o vale in particolare per la libreria
delle funzioni matematiche di cui qui viene
fatto largo uso.

\paragraph{DGS senza parametri di ingresso}

La procedura per la creazione di un DGS senza parametri
in ingresso \`e la seguente:

\begin{enumerate}

\item si seleziona il 
\link{comando script}[ Sezione \Ref, pagina
\Pageref]{script-tool};

\item si clicca con il mouse \textit{direttamente}
sullo sfondo del foglio di lavoro nel punto in cui 
si desidera che compaia il valore di uscita dello script
prestando attenzione a \textbf{non cliccare} erroneamente 
su oggetti della figura, in quanto questi verrebbero
considerati da \drgeo\ come parametri di ingresso dello script\footnote{Se 
per errore sono stati selezionati oggetti indesiderati 
per annullare la selezione \`e sufficiente cliccare nuovamente
sul comando per attivare uno script.}; 

\item una volta collocato lo script appare 
per default la scritta celeste ``Dr.~Genius''
ed \`e ora il momento di editare lo script azionando il 
\link{comando per modificare le propriet\`a di un oggetto}[ Sezione \Ref, pagina
\Pageref]{property-item}
e quindi cliccando con il mouse sulla scritta stessa. 
A questo punto si apre automaticamente una finestra di dialogo,
che mostra il contenuto dello script (\texttt{``Dr. Genius''}),
dove si pu\`o cancellare il contenuto di default dello script
e sostituirlo con il desiderato.

\end{enumerate}

\subparagraph{Un generatore di numeri casuali e altro}

\drgeniusIndex{Script:}{numeri casuali}{}{}

Il codice da editare, dopo aver seguito la procedura
illustrata sopra, per ottenere un numero casuale
\`e semplicemente:
\begin{verbatim}
(random 10)
\end{verbatim}

Ogni volta che si clicca sullo script comparir\`a un numero 
casuale tra 0 e 9.

Se si desidera generare un numero casuale 
appartenente all'intervallo $[0;1[$,
basta utilizzare lo script:
\begin{verbatim}
(random:uniform)
\end{verbatim}


\drgeniusNote{Qualche osservazione:

  \begin{itemize}
  \item Il valore restituito da uno script coincide
    con il valore calcolato nell'ultima linea di codice.
    Nel nostro caso questo valore coincide con il valore
    ritornato dalla chiamata ad una funzione.
  \item L'ultima linea di uno script deve ritornare un numero reale.
    In caso contrario comparir\`a la scritta ``Risultato non stampabile''~;
  \item Se si desidera visualizzare il valore di una variabile \`e sufficiente
    scrivere il suo nome nell'ultima riga dello script.
  \end{itemize}
}

\subparagraph{Calcolo di costanti}

Per calcolare un valore approssimato di pigreco \`e sufficiente
scrivere:
\begin{verbatim}
(acos -1)
\end{verbatim}
mentre per calcolare un valore approssimato del numero di Neper:
\begin{verbatim}
(exp 1)
\end{verbatim}

I valori restituiti da questi DGS si possono utilizzare
alla stregua di un qualsiasi altro valore numerico
editabile in \drgeo. 

L'importanza pedagogica dei DGS si sente maggiormente quando,
come ora vedremo, vengono loro passati dei parametri in ingresso.

\paragraph{DGS con uno o pi\`u parametri in ingresso}

\drgeniusIndex{Script:}{parametri}{}{}
 
Il procedimento per creare un DGS con un parametro
in ingresso \`e simile, ma non identico, a quanto visto in precedenza.

L'unica diversit\`a consiste nel fatto che in questo caso,
subito \textbf{dopo} aver selezionato il comando per attivare 
uno script, si deve \textbf{cliccare sugli oggetti geometrici
di ingresso} che si desidera passare allo stesso e solo 
\textbf{successivamente} si deve cliccare in un punto
del foglio di lavoro dove si desidera venga visualizzato 
l'output dello script.

All'interno dello script il riferimento 
al primo parametro di entrata \`e rappresentato 
per default dalla variabile $a1$. In caso di due o pi\`u parametri
di ingresso si utilizzeranno, rispettando 
l'ordine in cui sono stati selezionati gli oggetti,
le variabili $a1, a2\ldots , an$.

A seconda del tipo di oggetto a cui si fa riferimento 
sono disponibili diversi metodi per ottenere valori
numerici, coordinate, lunghezze e via di seguito i cui 
codici sono contenuti nel capitolo
\link{Metodi di riferimento per DGS}[ \Ref, pagina \Pageref]{api-dgs}.

\subparagraph{Area del triangolo}

Iniziamo ora a trattare un esempio molto 
semplice di utilizzo di un DGS per il calcolo 
dell'area di un triangolo. La figura a cui ci riferiamo
\`e la seguente:

\drgeniusFigureSize{Area del triangolo}{fig38}{8}

In essa sono rappresentati un triangolo $ABC$
e l'altezza $CH$ relativa alla base $AB$.

Per calcolare l'area $S(ABC)$ del triangolo utilizziamo 
un DGS con parametri in ingresso i segmenti $AB$ e $CH$
della figura.

Seguendo la procedura precedente si clicca innazitutto 
sul bottone che aziona la funzionalit\`a di
\link{script}[ Sezione \Ref, pagina
\Pageref]{script-tool}
e subito dopo, nell'ordine, sui due segmenti che risulteranno
lampeggiare. Si clicca quindi su un punto dello schermo
dove si desidera collocare l'uscita dello script e comparir\`a
la scritta azzurra Dr. Genius. 

A questo punto, dopo aver azionato il comando per
\link{modificare le propriet\`a di un oggetto}[ Sezione \Ref, pagina
\Pageref]{property-item}
e dopo aver cliccato sulla scritta
Dr. Genius, si aprir\`a una finestra in cui scriveremo il seguente
codice Scheme: 

\begin{verbatim}
(define AB (getLength a1))
(define BC (getLength a2))
(/ (* AB CH ) 2 )
\end{verbatim}

ottenendo il valore dell'area del triangolo. 
Per assegnare il nome $S(ABC)$ allo script e 
per cambiarne il colore da azzurro a rosso scuro
basta utilizzare la funzionalit\`a di
\link{modifica dello stile di un oggetto}[ Sezione \Ref, pagina
\Pageref]{object-style} vista in precedenza.

Altri esempi didattici elementari sono comunque contenuti nel capitolo
dedicato alle
\link{Applicazioni Didattiche}[ Sezione \Ref, pagina
\Pageref]{education}.

\subparagraph{Tangente ad una curva}

In quanto segue proponiamo un esempio
articolato
in cui si esamina pi\`u volte la procedura di creazione di uno script.
L'esempio, che svilupperemo in modo graduale, riguarda la costruzione del grafico
di una funzione e della tangente in un punto variabile del 
suo grafico. 


La figura finale \`e 
contenuta nella documentazione di \drgeo\ e 
prende il nome di
\xlink{slope.fgeo}[(/usr/local/share/drgeo/examples/figures/slope.fgeo)]
{/usr/local/share/drgeo/examples/figures/slope.fgeo}

\drgeniusFigureSize{La figura che otterremo}{fig55}{8}


\subparagraph{Definire un valore in un dato intervallo}

\drgeniusIndex{Script:}{intervallo}{}{}

In un foglio di lavoro bianco disegnamo due punti e il segmento
che li congiunge. Su questo segmento sistemiamo un punto
che chiamiamo ``Move me!''. 

Questo punto ci serve per determinare valori numerici
in un dato intervallo. Infatti il seguente script, 
il cui parametro $a1$ si riferisce a ``Move me!'',
restituisce un numero decimale nell'intervallo $[-10;+10]$:

\begin{verbatim}
(define x (getAbscissa a1))
(* 20  (- x 0.5))
\end{verbatim}

La prima linea dello script definisce una variabile 
\texttt{x} il cui valore \texttt{(getAbscissa a1)} coincide con l'ascissa
curvilinea dell'oggetto geometrico a cui si riferisce
$a1$\footnote{Indipendentemente dal tipo di segmento di curva l'ascissa
curvilinea \`e un numero reale appartenente all'intervallo
$[0;1]$} ossia del punto ``Move me!''.  
Nella seconda riga dello script, che traduce l'espressione
algebrica $20 \cdot ( x - 0.5)$, si fa in modo che il valore 
restituito dallo script appartenga all'intervallo
$[-10;+10]$. Finalmente chiamiamo questo script $X_{0}$.


\subparagraph{Disegnare il grafico di una funzione}

\drgeniusIndex{Luogo:}{script}{}{}

Il valore numerico generato dallo script precedente 
ci serve ora per calcolare, attraverso
un secondo script, la sua immagine attraverso la funzione 
$x \rightarrow cos(x)$ :

\begin{verbatim}
(define x (getValue a1))
(cos x)
\end{verbatim}

Sottolineiamo che in \texttt{(getValue a1)} l'oggetto a cui si
riferisce $a1$ non \`e il punto ``Move me!'' 
ma lo script $X_{0}$. Chiamiamo questo secondo script $Y_{0}$.

Infine creiamo il punto $M_{0}$ di coordinate $(X_{0};Y_{0})$
che \`e un punto del grafico della funzione $x \rightarrow cos(x)$. 
Per disegnare il grafico costruiamo il luogo
del punto $M_{0}$ quando ``Move me!'' descrive tutto il segmento su cui 
giace.

\subparagraph{Calcolare e disegnare la tangente al grafico}

\drgeniusIndex{Script:}{tangente a un grafico}{}{}

Per determinare la tangente nel punto $M_{0}$
del grafico calcoliamo in primo luogo la pendenza
della retta tangente. Consideriamo allora la derivata
prima della funzione $x \rightarrow
-sin(x)$ nel punto $X_{0}$ e scriviamo lo script:

\begin{verbatim}
(- 0 (sin (getValue a1)))
\end{verbatim}

che ha come riferimento l'ascissa $X_{0}$. Le notazioni di 
tipo Scheme/Guile possono sembrare inizialmente
poco intuitive ma dopo aver familiarizzato con 
esse appariranno semplici. Chiamiamo lo script ``pendenza in $M_{0}$''.
Nel momento in cui $M_{0}$ viene spostato 
sul grafico la pendenza viene ricalcolata.

Non resta che disegnare la tangente. Per fare questo 
calcoliamo le coordinate di un secondo punto 
$M_{1}$ di questa retta. 

Iniziamo dall'ascissa ponendo, ad esempio, $X_{1} = X_{0} + 2$ 
e scriviamo uno script, che chiamiamo $X_{1}$, 
con parametro d'ingresso lo script $X_{0}$:

\begin{verbatim}
(define x1 (getValue a1))
(+ x1 2)
\end{verbatim}

Per determinare l'ordinata di $M_{1}$ abbiamo bisogno di:

\begin{itemize}
\item $M_{0}$ (riferimento $a1$);
\item pendenza in $M_{0}$ ($a2$);
\item ascissa $X_{1}$ ($a3$).
\end{itemize}

Nello script seguente calcoliamo 
l'ordinata di $M_{1}$ calcolando
$Y_{0} + m(X_{1} - X_{0})$:

\begin{verbatim}
(define x0 (car (getCoordinates a1)))
(define y0 (cadr (getCoordinates a1)))
(define m (getValue a2))
(define x1 (getValue a3))
(+ (* m (- x1 x0)) y0)
\end{verbatim}

Qualche parola relativamente alla
chiamata \texttt{(getCoordinates a1)}, in essa 
\texttt{a1} deve riferirsi a un oggetto di tipo punto. Il metodo
restituisce in questo caso una lista contenente le coordinate del punto 
che per noi \`e $M_{0}$.
Scrivendo 
\texttt{car} si estrae dalla lista il primo valore, scrivendo
\texttt{cadr} il secondo. La parte rimanente dello script
dovrebbe risultare chiara.

Chiamiamo questo script $Y_{1}$ 
e costruiamo il punto $M_{1}$ di coordinate
$(X_{1};Y_{1})$ e finalmente la tangente $M_{0}M_{1}$.

Osserviamo che, al posto di tutti questi script, 
sarebbe stato possibile scriverne solo due o tre,
anche se pi\`u complessi.

\subsection{Metodi di riferimento per DGS}
\label{api-dgs}
% DGS API is exposed here

Quanto segue \`e una descrizione dei metodi disponibili
per DGS. La classificazione \`e fatta 
secondo il tipo di oggetti geometrici
o numerici cui si riferiscono.

\subsubsection{Punto}

\drgeniusIndex{Script:}{\texttt{getAbscissa}}{}{}{}

\begin{drgeoApi}{valore (getAbscissa punto)}
 \drgeoApiIn{punto}{punto su una curva}
 \drgeoApiOut{ascissa curvilinea del punto sulla curva. Il
   valore appartiene all'intervallo chiuso $[0;1]$}
 \drgeoApiExample{(define x (getAbscissa a1))\\
(* x 10)}
\end{drgeoApi}

\drgeniusIndex{Script:}{\texttt{setAbscissa}}{}{}{}
\begin{drgeoApi}{(setAbscissa punto x)}
  \drgeoApiIn{punto}{punto su una curva}
  \drgeoApiIn{x}{valore decimale nell'intervallo $[0;1]$
    che rappresenta l'ascissa del punto}
  \drgeoApiExample{(setAbscissa a1 0.5)}
\end{drgeoApi}


\drgeniusIndex{Script:}{\texttt{getCoordinates}}{}{}

\begin{drgeoApi}{liste (getCoordinates punto|vettore)}
Restituisce le coordinate di un punto o di un vettore.\\
  \drgeoApiIn{punto|vettore}{punto o vettore}
  \drgeoApiOut{lista contenente le coordinate del punto o del vettore}
  \drgeoApiExample{(define c (getCoordinates a1))\\
(define x (car c))\\
(define y (cadr c))\\
(+ (* x x) (* y y))}
\end{drgeoApi}

\drgeniusIndex{Script:}{\texttt{setCoordinates}}{}{}
\begin{drgeoApi}{(setCoordinates punto coord)}
Posiziona le coordinate di un punto\\
  \drgeoApiIn{punto}{punto libero nel piano}
  \drgeoApiIn{coord}{lista di numeri decimali}
  \drgeoApiExample{(define l (list 1.4 (random 5)))\\
(setCoordinate a1 l)}
\end{drgeoApi}


\subsubsection{Retta, Semiretta, Segmento, Vettore, Angolo}

\drgeniusIndex{Script:}{\texttt{getSlope}}{}{}{}
\begin{drgeoApi}{valore (getSlope direzione)}
  \drgeoApiIn{direzione}{retta, semiretta,
    segmento o vettore}
  \drgeoApiOut{pendenza relativa alla direzione}
  \drgeoApiExample{(define p (getSlope a1))}
\end{drgeoApi}

\drgeniusIndex{Script:}{\texttt{getNorm}}{}{}
\begin{drgeoApi}{valore (getNorm vettore)}
  \drgeoApiIn{vettore}{vettore}
  \drgeoApiOut{norma del vettore}
  \drgeoApiExample{(define n (getNorm a1))}
\end{drgeoApi}

\drgeniusIndex{Script:}{\texttt{getLength}}{}{}
\begin{drgeoApi}{valore (getLength segmento)}
  \drgeoApiIn{segmento}{segmento}
  \drgeoApiOut{lunghezza segmento}
  \drgeoApiExample{(define l (getLength a1))}
\end{drgeoApi}

\drgeniusIndex{Script:}{\texttt{getAngle}}{}{}
\begin{drgeoApi}{valore (getAngle angolo)}
  \drgeoApiIn{angolo geometrico}{angolo geometrico}
  \drgeoApiOut{ampiezza in gradi dell'angolo}
  \drgeoApiExample{(define ABC (getAngle a1))}
\end{drgeoApi}

\subsubsection{Circonferenza, Arco di circonferenza}

\drgeniusIndex{Script:}{\texttt{getCenter}}{}{}
\begin{drgeoApi}{lista (getCenter circonferenza|arco)}
  \drgeoApiIn{circonferenza|arco}{circonferenza o suo arco}
  \drgeoApiOut{lista contenente le coordinate del centro}
  \drgeoApiExample{(define c (getCenter a1))\\
(car c)}
\end{drgeoApi}

\drgeniusIndex{Script:}{\texttt{getRadius}}{}{}
\begin{drgeoApi}{valore (getRadius circonferenza|arco)}
  \drgeoApiIn{circonferenza|arco}{circonferenza o suo arco}
  \drgeoApiOut{raggio}
  \drgeoApiExample{(define r (getRadius a1))}
\end{drgeoApi}

\drgeniusIndex{Script:}{\texttt{getLength}}{}{}
\begin{drgeoApi}{valore (getLength circonferenza|arco)}
  \drgeoApiIn{circonferenza|arco}{circonferenza o suo arco}
  \drgeoApiOut{lunghezza circonferenza o arco}
  \drgeoApiExample{(define l (getLength a1))}
\end{drgeoApi}

\subsubsection{Numeri}

\drgeniusIndex{Script:}{\texttt{getValue}}{}{}
\begin{drgeoApi}{valore (getValue numero)}
  \drgeoApiIn{numero}{numero}
  \drgeoApiOut{valore del numero}
  \drgeoApiExample{(define a (getValue a1))\\
(define b (getValue a2))\\
(+ a b)}
\end{drgeoApi}

\drgeniusIndex{Script:}{\texttt{setValue}}{}{}
\begin{drgeoApi}{(setValue numero v)}
  \drgeoApiIn{numero}{numero}
  \drgeoApiIn{v}{valore decimale}
  \drgeoApiExample{(define v (getValue a1))\\
(setValue a2 v)}
\end{drgeoApi}


\subsubsection{Altro}


\drgeniusIndex{Script:}{\texttt{move}}{}{}
\begin{drgeoApi}{(move item u)}
  \drgeoApiIn{item}{oggetto}
  \drgeoApiIn{u}{vettore}
  \drgeoApiExample{(define v (vector .1 0))\\
(move a1 v)}
\end{drgeoApi}


\section{Blocco di strumenti dell'interfaccia}
\label{ui-lock}

\drgeo\ offre la possibilit\`a di predisporre
delle sessioni\footnote{File che comprendono pi\`u documenti 
di \drgeo\ (figure e/o testi)} in cui l'insegnante
pu\`o decidere, in merito ad alcune costruzioni da eseguire, 
di impedire l'accesso ad alcuni strumenti normalmente disponibili. Il blocco
degli strumenti avviene attraverso un sistema di password.
In questo modo l'insegnante ha la possibilit\`a
di predisporre attivit\`a didattiche che prevedono
gradi diversi di blocco degli strumenti di costruzione.

\subsection{Impedire l'uso di strumenti}

\drgeniusIndex{Strumenti:}{blocco}{}{}

Per impedire l'accesso agli strumenti di costruzione
si ricorre al comando \drgeniusMenu{Modifica -> Personalizza Interfaccia}. 
Dopo aver selezionato il comando si apre 
una grande finestra di dialogo in cui si riconoscono
tutte le icone relative agli strumenti di \drgeo.
Cliccando direttamente sulle icone \`e possibile
attivare o disattivare la loro funzionalit\`a. Le icone disattivate
appariranno pi\`u sbiadite. Allo stesso tempo, cliccando
sull'icona principale di un menu (riconoscibile per la presenza
di un triangolino verde in basso a destra), \`e possibile disattivare
tutti gli strumenti afferenti a quel menu.

\drgeniusFigureSize{Finestra di dialogo per bloccare 
l'interfaccia.}{fig53}{8}

Dopo aver completato la scelta degli strumenti di cui
impedire l'uso si procede alla loro effettiva disattivazione
cliccando sul bottone
\drgeniusMenu{Blocca} della finestra di dialogo.
A quel punto \drgeo\ richiede una password.

\drgeniusNote{Quando si salva in un file una figura o una sessione 
con blocco dell'interfaccia anche le password 
sono salvate in forma criptata nello stesso file.}

\subsection{Sblocco degli strumenti}

\drgeniusIndex{Strumenti:}{sblocco}{}{}
Analogamente a come vengono bloccate delle 
funzionalit\`a dell'interfaccia 
\`e possibile, a seconda delle necessit\`a,
sbloccare le stesse funzionalit\`a.

Sempre ricorrendo al comando \drgeniusMenu{ Modifica -> Personalizza
  Interfaccia} una volta aperta la finestra
di dialogo si utilizza il bottone
\drgeniusMenu{Sblocca}. Come in precedenza
per poter sbloccare uno strumento \`e necessario 
inserire una pasword.

\drgeniusFigure{Finestra di dialogo per sbloccare l'interfaccia}{fig54}

\chapter{Figure Scheme per \drgeo}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{introduzione}{}{}  

Le \emph{Figure Scheme in \drgeo} -- (FSD) -- sono
figure scritte in un linguaggio relativamente naturale.
Non si tratta pi\`u di costruire una figura utilizzando 
gli strumenti messi a disposizione dall'interfaccia grafica
di \drgeo\ ma piuttosto di descrivere una figura utilizzando
il linguaggio di programmazione Scheme.
Abbiamo profuso il massimo sforzo
per rendere la sintassi del linguaggio semplice e 
non intricata. Oltre a questo le parole chiave utili
per descrivere una figura si possono adattare a differenti lingue
in quanto sono ridefinibili. Per coerenza, nonostante sia
possibile utilizzare istruzioni in lingue diverse, \`e
preferibile, una volta scelta una lingua, 
uniformare tutti i comandi a quella stessa lingua. 

\section{Alcuni esempi}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{esempi}{}{}  
  
Scheme \`e per sua natura un linguaggio di alto livello,
per questa ragione, una volta definita una figura, avremo a
disposizione tutta la sua potenza per eseguire, ad esempio, 
azioni ricorsive su parti della figura o per utilizzare
funzioni aleatorie per modificarla ad ogni sua comparsa 
sul foglio di lavoro. In altri termini
le FSD sono allo stesso tempo svincolate dall'interfaccia grafica
e potenziate dalla presenza di Scheme. 

Una FSD \`e un file con estensione .scm creato attraverso 
un editore di testo che, una volta aperto in \drgeo\ attraverso il comando  
\drgeniusMenu{File->Valuta}, genera una figura sul foglio di lavoro.

Iniziamo studiando un semplice esempio di FSD:

% Note to the translator, most of the DSF commands can be translated
% in various languages, this is why you can see the command
% written in French, feel free to translate in your language, however
% you will also have to maintain the corresponding
% scm/drgeo_scm_interface_constant_xx.scm file

\drgeniusIndex{Figure Scheme per \drgeo\ :}{nuova figura}{}{}

\begin{verbatim}
(new-figure "Figura")
\end{verbatim}

Si tratta della pi\`u semplice FSD 
che si possa definire. Una volta valutato il
file in \drgeo\ appare
una nuova figura vuota con nome
``Figura''. Ripetendo il comando 
\texttt{(new-figure "Figura")} verranno create 
quante figure si 
desiderano.

Vediamo un secondo esempio:

\begin{verbatim}
(new-figure "Figura")
(lets Point "A" free 1.2 -2)
\end{verbatim}

Questa FSD definisce una figura con un punto libero
$A$ di coordinate $(1,2~;~-2)$. 
Come si pu\`o vedere la sintassi utile per la definizione
dell'oggetto geometrico \`e intuitiva e espressa in un
linguaggio molto vicino a quello comune. 
Osserviamo inoltre come questa definizione
sia sostanzialmente identica nella forma a quella
di tutti i comandi che permettono
di definire i rimanenti oggetti:

\begin{enumerate}
\item inizia con la parola chiave \texttt{lets} che indica che
  si desidera costruire un nuovo oggetto;
\item segue la categoria a cui appartiene l'oggetto, in questo 
  caso \texttt{Point}.
\item quindi si scrive il nome dell'oggetto, nel nostro caso $A$, sempre 
  tra virgolette ". Se non si desidera dare alcun nome all'oggetto
  \`e sufficiente scrivere: \begin{verbatim}""\end{verbatim}
\item infine si precisa il tipo di oggetto, ossia il tipo di punto,
  che nel nostro caso \`e libero \texttt{free}; 
\item il tipo di oggetto \`e seguito da una lista di argomenti 
  specifici che, nel nostro esempio, coincide con la coppia di coordinate
  che definiscono il punto $A$.
\end{enumerate}

Vediamo un terzo esempio:

\begin{verbatim}
(define (triangolo p1 p2 p3)
  (Segment "" extremities p1 p2)
  (Segment "" extremities p2 p3)
  (Segment "" extremities p1 p3))

(define (casuale)
  (- 8 (* 16 (random:uniform))))

(new-figure "Figura")

(lets Point "A" free (casuale) 0)
(lets Point "B" free 5 0)
(lets Point "C" free (casuale) 5)

(triangolo A B C)
\end{verbatim}

Questo esempio \`e di particolare interesse
in quanto ci mostra tre aspetti essenziali:

\begin{enumerate}
\item come introdurre costruzioni di pi\`u alto livello 
  non previste inizialmente in \drgeo. Qui abbiamo 
  definito la funzione \texttt{triangolo} 
  che a partire da tre punti qualsiasi costruisce un triangolo.
  Possiamo confrontare questa costruzione con quella che 
  potremmo definire attraverso una macro concludendo che 
  il primo metodo \`e pi\`u potente;
\item come definire funzioni associate: nel nostro caso la 
  funzione \texttt{casuale} che ritorna un numero decimale casuale 
  compreso tra -8 e 8. Attraverso questa funzione, ogni volta 
  che viene aperta la figura, il disegno apparir\`a diverso; 
\item l'uso della parola chiave \texttt{lets} non \`e obbligatorio, 
  ma legato alla necessit\`a di definire o meno dei riferimenti
  per l'oggetto creato. Ad esempio nella funzione \texttt{triangolo} 
  non abbiamo bisogno di alcun riferimento ai segmenti creati; al contrario
  quando definiamo i punti $A$, $B$ e $C$ sono necessari dei 
  riferimenti. In questo caso i riferimenti hanno lo stesso 
  nome\footnote{Da un punto di vista interno al linguaggio Scheme,
    i riferimenti sono dei simboli che puntano ad una struttura 
    interna all'oggetto -- un prototipo -- nel momento in cui
    i nomi sono stringhe di caratteri.} senza virgolette: 
  \texttt{A}, \texttt{B} e \texttt{C}.  Nel seguito chiameremo 
  questi riferimenti \textbf{simboli}; ci\`o per utilizzare in 
  modo corretto la terminologia del linguaggio Scheme. In questo modo
  quando la funzione \texttt{triangolo} viene chiamata
  vengono passati ad essa come parametri i simboli
  \texttt{A}, \texttt{B} e \texttt{C}, che vengono utilizzati per
  definire i vertici del triangolo.
\end{enumerate}

Osserviamo che quando si definiscono i segmenti non vengono
assegnati ad essi dei nomi in quanto \drgeo\
fa questo automaticamente: nel nostro caso  
i segmenti saranno $[AB]$, $[BC]$ e $[AC]$.

Per concludere questa sezione vediamo un ultimo esempio:

\begin{verbatim}
(lets Point "A" free 1 0)
(lets Point "B" free 5 0)
(lets Line "d1" 2points A B)

(send A color yellow)
(send A shape round)
(send A size large)
(send B masked)
(send d1 thickness dashed)
\end{verbatim}

I primi tre comandi permettono di costruire due punti e una retta.
La parte che qui maggiormente interessa riguarda la serie
di comandi preceduti da \texttt{send}. 
Questo comando permette di comunicare con un oggetto 
di cui si dispone del simbolo relativo. In questo caso 
i simboli di cui disponiamo sono \texttt{A}, \texttt{B} e \texttt{d1}.
La struttura di \texttt{send} consiste in primo luogo di un
primo argomento che identifica l'oggetto con cui si vuole 
comunicare e di un secondo argomento che definisce il messaggio.
Dal terzo argomento in poi seguono informazioni legate 
alla natura del messaggio. Ad esempio 
\texttt{(send A color yellow)} invia il messagio \texttt{color}
con parametro \texttt{yellow}: in questo caso il punto viene dipinto
di giallo. Il significato dei rimanenti comandi dovrebbe
a questo punto risultare ovvio. In ogni caso ritorneremo
su essi nel seguito.

Terminata questa breve visita guidata alle 
\emph{Figure Scheme per Dr. Geo} nella sezione
seguente verranno esposti i comandi disponibili
per definire le diverse FSD. 

\section{Metodi di riferimento per le Figure Scheme per \drgeo}

La definizione di oggetti in un file FSD avviene attraverso
dei prototipi. I prototipi sono un genere di oggetti
che, come chiariremo nel seguito, \`e possibile interrogare e modificare. 

Tuttavia, prima di ogni definizione di un oggetto in una figura
questa deve essere stata precedentemente creata 
con il comando \texttt{new-figure}.

\subsection{Comandi generali}

\begin{drgeoApi}{(new-figure nome)}
  \drgeoApiIn{nome}{stringa di caratteri} 
  \drgeoApiOut{non viene restituito alcun valore. 
   La chiamata non produce che un effetto di contorno
   per indicare la creazione di una figura; successivamente 
   in essa verranno creati degli oggetti fino ad una nuova
   chiamata dello stesso tipo}
  \drgeoApiExample{(new-figure ``Figura 1'')}
\end{drgeoApi}


\subsection{Definizione di oggetti in una figura}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{costruzione di oggetti}{}{}

Un oggetto pu\`o essere definito ricorrendo a strutture
sintattiche assai diverse~:

\begin{itemize}

\item \texttt{(lets Point ``p1'' type args)}
  
  In questo modo viene creato un punto e il suo riferimento 
  \`e contenuto nella variabile \texttt{p1}. 
  Questo tipo di sintassi utilizza una macro di Scheme.
  
\item \texttt{(Point ``Nome'' type args)}

  In queto modo viene creato un punto senza che venga 
  conservato alcun riferimento.

\item \texttt{(define p1 (Point ``Nome'' type args))}
  
   In questo modo viene creato un punto e il suo riferimento 
  \`e contenuto nella variabile \texttt{p1}.
  
\item \texttt{(set! p1 (Point ``Nome'' type args))}
  
   In questo modo viene creato un punto e il suo riferimento 
   viene copiato nella variabile preesistente \texttt{p1}.

\end{itemize}

Se alcuni oggetti vengono creati nel corpo di una funzione 
\`e possibile utilizzare sia la forma 
\texttt{set!} che la forma speciale di Scheme \texttt{lets}. Ci\`o
che importa sottolineare \`e che la chiamata base
consiste in una chiamata ad una funzione che ritorna 
il riferimento all'oggetto creato.

\subsubsection{Punto}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{costruzione di oggetti:}{punto}{}

\begin{drgeoApi}{prototipo (Point nome free x y)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{x}{ascissa del punto}
  \drgeoApiIn{y}{ordinata del punto}
  \drgeoApiOut{riferimento per un punto libero nel piano
    con coordinate iniziali \texttt{x} e \texttt{y}.}
  \drgeoApiExample{(define p1 (Point ``A'' free 1.2 (acos -1)))}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Point nome on-curve linea x)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{linea}{riferimento ad una linea (retta, semiretta, segmento, ecc.)}
  \drgeoApiIn{x}{ascissa curvilinea di un punto libero il cui valore appartiene all'intervallo [0~;~1]}
  \drgeoApiOut{riferimento per un punto libero su una curva.}
  \drgeoApiExample{(Point ``M'' on-curve s1 0.5)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Point nome middle-2pts p1 p2)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{p1}{riferimento ad un punto}
  \drgeoApiIn{p2}{riferimento ad un punto}
  \drgeoApiOut{riferimento al punto medio tra due punti.}
  \drgeoApiExample{(lets Point ``A'' free 1 1)\\
(lets Point ``B'' free 4 4)\\
(Point ``I'' middle-2pts A B)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Point nome middle-segment s)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{s}{riferimento ad un segmento}
  \drgeoApiOut{riferimento al punto medio di un segmento.}
  \drgeoApiExample{(Point ``L'' middle-segment s)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Point nome intersection l1 l2)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{l1}{riferimento ad una linea}
  \drgeoApiIn{l2}{riferimento ad una linea}
  \drgeoApiOut{riferimento al punto di intersezione di due linee.}
  \drgeoApiExample{(Point ``I'' intersection line segment)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Point nome intersection2 l1 l2)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{l1}{riferimento ad una linea}
  \drgeoApiIn{l2}{riferimento ad una curva}
  \drgeoApiOut{riferimento al secondo punto d'intersezione di due curve quando una delle due \`e un arco o una circonferenza.}
  \drgeoApiExample{(Point ``I'' intersection2 line circle)}
\end{drgeoApi}


\subsubsection{Retta}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{costruzione di oggetti:}{retta}{}

\begin{drgeoApi}{prototipo (Line nome 2points p1 p2)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{p1}{riferimento ad un punto}
  \drgeoApiIn{p2}{riferimento ad un punto}
  \drgeoApiOut{riferimento ad una retta passante per due punti.}
  \drgeoApiExample{(lets Point ``A'' free 0 0)\\
(lets Point ``M'' free 1 2)\\
(Line ``'' 2points A M)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Line nome parallel p d)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{p}{riferimento ad un punto}
  \drgeoApiIn{d}{riferimento ad una direzione (retta, segmento, vettore ...)}
  \drgeoApiOut{riferimento ad una retta parallela alla direzione
    \texttt{d} e passante per \texttt{p}.}
  \drgeoApiExample{(lets Point ``A'' free  1 5)\\
(lets Line ``d1'' parallel A d)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Line nome orthogonal p d)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{p}{riferimento ad un punto}
  \drgeoApiIn{d}{riferimento ad una direzione (retta, segmento, vettore ...)}
  \drgeoApiOut{riferimento ad una retta perpendicolare alla direzione
    \texttt{d} e passante per \texttt{p}.}
  \drgeoApiExample{(lets Point ``A'' free  1 5)\\
(lets Line ``d1'' orthogonal A d)}
\end{drgeoApi}

\subsubsection{Semiretta}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{costruzione di oggetti:}{semiretta}{}


\begin{drgeoApi}{prototipo (Ray nome 2points o p)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{o}{riferimento ad un punto origine della semiretta}
  \drgeoApiIn{p}{riferimento ad un punto appartenente alla semiretta}
  \drgeoApiOut{riferimento ad una semiretta definita dall'origine e un punto.}
  \drgeoApiExample{(lets Point ``A'' free  1 5)\\
(lets Point ``O'' free 0 0)\\
(lets Ray ``dd1'' 2points A 0)}
\end{drgeoApi}

\subsubsection{Segmento}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{costruzione di oggetti:}{segmento}{}

\begin{drgeoApi}{prototipo (Segment nome extremities p1 p2)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{p1}{riferimento ad un punto estremo del segmento}
  \drgeoApiIn{p2}{riferimento ad un punto estremo del segmento}
  \drgeoApiOut{riferimento ad un segmento definito dai suoi estremi.}
  \drgeoApiExample{(lets Point ``A'' free  1 5)\\
(lets Point ``B'' free 10 4)\\
(lets Segment ``'' extremities A B)}
\end{drgeoApi}

\subsubsection{Circonferenza}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{costruzione di oggetti:}{circonferenza}{}

\begin{drgeoApi}{prototipo (Circle nome 2points c p)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{c}{riferimento ad un punto: centro della circonferenza}
  \drgeoApiIn{p}{riferimento ad un punto appartenente alla circonferenza}
  \drgeoApiOut{riferimento ad una circonferenza definita da centro e punto ad essa appartenente.}
  \drgeoApiExample{(lets Point ``A'' free  1 5)\\
(lets Point ``B'' free 10 4)\\
(lets Circle ``C1'' 2points A B)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Circle nome center-radius c r)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{c}{riferimento ad un punto: centro della circonferenza}
  \drgeoApiIn{r}{riferimento ad un valore numerico: raggio della circonferenza}
  \drgeoApiOut{riferimento ad una circonferenza definita da centro e raggio.}
  \drgeoApiExample{(lets Point ``A'' free  1 5)\\
(lets Numeric ``r'' free 10 4)\\
(lets Circle ``C1'' center-radius A r)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Circle nome center-segment c s)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{c}{riferimento ad un punto: centro della circonferenza}
  \drgeoApiIn{s}{riferimento ad un segmento la cui lunghezza definisce il raggio della circonferenza}
  \drgeoApiOut{riferimento ad una circonferenza definita da centro e raggio.}
  \drgeoApiExample{(lets Point ``A'' free  1 5)\\
(lets Point ``B'' free 10 4)\\
(lets Segment ``s'' extremities A B)\\
(lets Circle ``C1'' center-segment A s)}
\end{drgeoApi}

\subsubsection{Arco}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{costruzione di oggetti:}{arco}{}

\begin{drgeoApi}{prototipo (Arc nome 3points p1 p2 p3)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{p1}{riferimento ad un punto primo estremo del'arco}
  \drgeoApiIn{p2}{riferimento ad un punto centro dell'arco}
  \drgeoApiIn{p3}{riferimento ad un punto secondo estremo dell'arco}
  \drgeoApiOut{riferimento ad un arco di circonferenza definito dai suoi estremi e da un punto} 
  \drgeoApiExample{(lets Point ``A'' free  1 5)\\
(lets Point ``B'' free  0 5)\\
(lets Point ``C'' free  -1 -2)\\
(lets Arc ``arc'' 3points A B C)}
\end{drgeoApi}


\subsubsection{Poligono}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{costruzione di oggetti:}{poligono}{}

\begin{drgeoApi}{prototipo (Polygon nome npoints args)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{args}{una lista di riferimenti a punti che rappresentano i vertici del poligono}
  \drgeoApiOut{riferimento ad un poligono definito dai suoi vertici}
  \drgeoApiExample{(lets Point ``A'' free  1 1)\\
(lets Point ``B'' free  1 5)\\
(lets Point ``C'' free  5 1)\\
(lets Point ``D'' free  5 5)\\
(lets Polygon ``quad'' npoints A B C D)}
\end{drgeoApi}

\subsubsection{Trasformazioni geometriche}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{costruzione di oggetti:}{trasformazioni geometriche}{}

\drgeniusIndex{Trasformazioni:}{figure Scheme per \drgeo}{}{}

I prototipi relativi alle trasformazioni geometriche permettono
di eseguire trasformazioni geometriche di diversi oggetti.
Essi si applicano in riferimento agli oggetti punto,
segmento, retta, semiretta, vettore, circonferenza, arco e poligono. 

\begin{drgeoApi}{prototipo (TipoOggetto nome rotation oggetto centro angolo)}  
  \drgeoApiIn{TipoOggetto}{Point, Segment, Line, Ray,
    Vector, Circle, Arc, Polygon}   
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}  
  \drgeoApiIn{oggetto}{riferimento all'oggetto da trasformare}
  \drgeoApiIn{centro}{riferimento ad un punto: il centro di rotazione}
  \drgeoApiIn{angolo}{riferimento ad un valore: l'angolo di rotazione}
  \drgeoApiOut{riferimento all'oggetto trasformato.}
  \drgeoApiExample{(lets Point ``I1'' rotation I C a)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (TipoOggetto nome scale oggetto centro k)}  
  \drgeoApiIn{TipoOggetto}{Point, Segment, Line, Ray,
    Vector, Circle, Arc, Polygon}   
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}  
  \drgeoApiIn{oggetto}{riferimento all'oggetto da trasformare}
  \drgeoApiIn{centro}{riferimento ad un punto: il centro di omotetia}
  \drgeoApiIn{k}{riferimento ad un valore: rapporto di omotetia}
  \drgeoApiOut{riferimento all'oggetto trasformato.}
  \drgeoApiExample{(lets Polygon ``P1'' scale P C k1)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (TipoOggetto nome symmetry oggetto centro)}
  \drgeoApiIn{TipoOggetto}{Point, Segment, Line, Ray,
    Vector, Circle, Arc, Polygon}   
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}  
  \drgeoApiIn{oggetto}{riferimento all'oggetto da trasformare}
  \drgeoApiIn{centro}{riferimento ad un punto: il centro di simmetria}
  \drgeoApiOut{riferimento all'oggetto trasformato.}
  \drgeoApiExample{(lets Segment ``S1'' symmetry S C)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (TipoOggetto nome reflexion oggetto asse)}  
  \drgeoApiIn{TipoOggetto}{Point, Segment, Line, Ray,
    Vector, Circle, Arc, Polygon}   
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}  
  \drgeoApiIn{oggetto}{riferimento all'oggetto da trasformare}
  \drgeoApiIn{asse}{riferimento ad una retta: l'asse di riflessione}
  \drgeoApiOut{riferimento all'oggetto trasformato.}
  \drgeoApiExample{(lets Polygon ``P1'' reflexion P d1)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (TipoOggetto nome translation oggetto vettore)}
  \drgeoApiIn{TipoOggetto}{Point, Segment, Line, Ray,
    Vector, Circle, Arc, Polygon}   
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}  
  \drgeoApiIn{oggetto}{riferimento all'oggetto da trasformare}
  \drgeoApiIn{vettore}{riferimento ad un vettore: il vettore di traslazione}
  \drgeoApiOut{riferimento all'oggetto trasformato.}
  \drgeoApiExample{(lets Circle ``C1'' translation C v)}
\end{drgeoApi}

\subsubsection{Luogo geometrico}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{costruzione di oggetti:}{luogo}{}

\begin{drgeoApi}{prototipo (Locus nome 2points m c)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{m}{riferimento ad un punto mobile su una curva}
  \drgeoApiIn{c}{riferimento ad un punto fisso dipendente dal punto \texttt{m}}
  \drgeoApiOut{riferimento ad un luogo.}
  \drgeoApiExample{(Locus ``luogo'' 2points M I)}
\end{drgeoApi}

\subsubsection{Vettore}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{costruzione di oggetti:}{vettore}{}

\begin{drgeoApi}{prototipo (Vector nome 2points o e)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{o}{riferimento ad un punto: origine del vettore}
  \drgeoApiIn{e}{riferimento ad un punto: estremo del vettore}
  \drgeoApiOut{riferimento ad un vettore.}
  \drgeoApiExample{(lets Point ``B'' free  0 5)\\
(lets Point ``C'' free  -1 -2)\\
(Vector ``'' 2points C B)}
\end{drgeoApi}

\subsubsection{Numeri}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{costruzione di oggetti:}{numeri}{}

\begin{drgeoApi}{prototipo (Numeric nome free x y v)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{x,y}{le coordinate che determinano la posizione del numero}
  \drgeoApiIn{v}{il valore del numero}
  \drgeoApiOut{riferimento a un numero.}
  \drgeoApiExample{(lets Numeric ``pi'' free  5 5 (acos -1))}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Numeric nome segment-length x y s)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
   \drgeoApiIn{x,y}{le coordinate che determinano la posizione del numero}
  \drgeoApiIn{s}{riferimento ad un numero: la lunghezza di un segmento}
  \drgeoApiOut{riferimento alla lunghezza di un segmento.}
  \drgeoApiExample{(lets Numeric ``l'' segment-length  5 5 S)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Numeric nome vector-norm x y v)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
   \drgeoApiIn{x,y}{le coordinate che determinano la posizione del numero}
  \drgeoApiIn{v}{riferimento ad un vettore}
  \drgeoApiOut{riferimento alla norma di un vettore.}
  \drgeoApiExample{(lets Numeric ``l'' vector-norm  5 5 V)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Nombre nome point-circle x y p c)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
   \drgeoApiIn{x,y}{le coordinate che determinano la posizione del numero}
  \drgeoApiIn{p}{riferimento ad un punto}
  \drgeoApiIn{c}{riferimento ad una circonferenza}
  \drgeoApiOut{riferimento al valore che esprime la distanza tra punto e circonferenza.}
  \drgeoApiExample{(lets Numeric ``l'' point-circle  5 5 P C)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Numeric nome point-line x y p d)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
   \drgeoApiIn{x,y}{le coordinate che determinano la posizione del numero}
  \drgeoApiIn{p}{riferimento ad un punto}
  \drgeoApiIn{d}{riferimento ad una retta}
  \drgeoApiOut{riferimento al valore che esprime la distanza tra punto e retta.}
  \drgeoApiExample{(lets Numeric ``d'' point-line  5 5 M D1)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Numeric nome point-point x y p1 p2)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
   \drgeoApiIn{x,y}{le coordinate che determinano la posizione del numero}
  \drgeoApiIn{p1}{riferimento ad un punto}
  \drgeoApiIn{p2}{riferimento ad un punto}
  \drgeoApiOut{riferimento al valore che esprime la distanza tra i due punti.}
  \drgeoApiExample{(lets Numeric ``d'' point-point  5 5 A B)}
\end{drgeoApi}

\begin{drgeoApi}{prototipo (Numeric nome circle-length x y c)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
   \drgeoApiIn{x,y}{le coordinate che determinano la posizione del numero}
  \drgeoApiIn{c}{riferimento ad una circonferenza}
  \drgeoApiOut{riferimento alla lunghezza della circonferenza.}
  \drgeoApiExample{(lets Numeric ``p'' circle-length  5 5 C)}
\end{drgeoApi}


\subsubsection{Angolo}

\begin{drgeoApi}{prototipo (Angle nome geometric A B C)}
  \drgeoApiIn{nome}{stringa di caratteri che designa il nome dell'oggetto}
  \drgeoApiIn{A}{riferimento a un punto}
  \drgeoApiIn{B}{riferimento a un punto: vertice dell'angolo}
  \drgeoApiIn{C}{riferimento a un punto}
  \drgeoApiOut{riferimento ad un angolo geometrico.}
  \drgeoApiExample{(lets Angle ``a'' geometric  A B C)}
\end{drgeoApi}

\subsection{Modifiche agli attributi di un oggetto}

\drgeniusIndex{Figure Scheme per \drgeo\ :}{costruzione di oggetti:}{attributi oggetto}{}

Per modificare gli attributi di un oggetto creato in precedenza 
si utilizza un sistema di messaggi che vengono inviati direttamente
al prototipo che rappresenta l'oggetto in questione. Le modifiche
agli attributi si eseguono quindi a posteriori della costruzione
dei diversi oggetti.

\begin{drgeoApi}{(send oggetto color valore)}
  \drgeoApiIn{oggetto}{riferimento ad un oggetto} 
  \drgeoApiIn{valore}{un colore tra i seguenti: \texttt{black, dark-grey, grey, white, dark-green, green, dark-blue, bleu, red, yellow}}
  \drgeoApiExample{(lets Point ``A'' free  1 2)\\
(send A color green)}
\end{drgeoApi}

\begin{drgeoApi}{(send linea thickness valore)}
  \drgeoApiIn{linea}{riferimento ad una linea (retta,
    semiretta, circonferenza, luogo, ecc.)}  
  \drgeoApiIn{valore}{lo spessore i cui valori possibili sono:
    \texttt{dashed, normal, large}}
  \drgeoApiExample{(lets Point ``A'' free  1 2)\\
    (lets Point ``O'' free 0 0)\\
    (lets Line ``d'' 2points A B)\\
    (send d thickness dashed)}
\end{drgeoApi}

\begin{drgeoApi}{(send punto size valore)}
  \drgeoApiIn{punto}{riferimento ad un punto}    
  \drgeoApiIn{valore}{la dimensione di un punto i cui valori possibili sono:
    \texttt{small, normal, large}}
  \drgeoApiExample{(lets Point ``A'' free  1 2)\\
    (send A size small)}
\end{drgeoApi}

\begin{drgeoApi}{(send punto shape valore)}
  \drgeoApiIn{punto}{riferimento ad un punto}    
  \drgeoApiIn{valore}{la forma di un punto i cui valori possibibili sono:
    \texttt{round, cross, round-empty, rec-empty}}
  \drgeoApiExample{(lets Point ``A'' free  1 2)\\
    (send A shape rond)}
\end{drgeoApi}

\begin{drgeoApi}{(send oggetto masked)}
  \drgeoApiIn{oggetto}{riferimento ad un oggetto nascosto}    
  \drgeoApiExample{(lets Point ``A'' free  1 2)\\
    (send A masked)}
\end{drgeoApi}

\T \clearpage

\section{Galleria di esempi}
\drgeniusIndex{Figure Scheme per \drgeo\ :}{esempi}{}{}

Per illustrare l'utilizzo di Figure Scheme per \drgeo\ proponiamo
alcuni esempi. Gli esempi hanno lo scopo di mostrare le potenzialit\`a
delle FSD e allo stesso tempo ci auguriamo siano fonte di 
ispirazione per costruire altri esempi. Ogni esempio
\`e accompagnato dal codice Scheme che genera la figura
corrispondente. Il codice sorgente pu\`o essere copiato in un
editore di testo, salvato con estensione .scm
e quindi valutato in \drgeo.
Altri esempi, forse pi\`u semplici, sono disponibili al
\link{Capitolo 6}[ Capitolo \Ref, pagina \Pageref]{education}.

\subsection{Poligoni regolari}
\drgeniusIndex{Figure Scheme per \drgeo\ :}{esempi:}{poligono regolare}{}

La costruzione di un poligono regolare con un numero arbitrario di
lati, che non \`e prevista come costruzione base in \drgeo,  pu\`o essere eseguita attraverso una FSD che sfrutta alcune funzioni 
ricorsive del linguaggio Scheme.

\begin{verbatim}
(define pi (acos -1))
(define n 15)
(define x0 0)
(define y0 0)
(define p1 0)

(define (polygon center p a n)
  (if (> n 0)
      (begin
        (set! p1 (Point "" rotation p center a))
        (send p1 masked)
        (Segment "" extremities p p1)
        (polygon center p1 a (- n 1)))))

(new-figure "Poligono Regolare")
(lets Point "C" free x0 y0)
(lets Numeric "a" free 0 0 (* 2 (/ pi n)))
(send a masked)

(set! p1 (Point "I" free 5 0))

(lets Segment "S" extremities C p1)
(Segment ""  rotation S C a)

(polygon C p1 a n)
\end{verbatim}

\drgeniusFigureSize{Un poligono regolare con 15 lati}{fig59}{8}


\subsection{Frattali}
\drgeniusIndex{Figure Scheme per \drgeo\ :}{esempi:}{frattale}{}

La costruzione di una curva frattale a forma d'albero 
si pu\`o realizzare facilmente utilizzando una FSD.
Il codice sorgente della figura \`e incredibilmente 
compatto e incomparabilmente pi\`u efficiente 
rispetto all'esecuzione della figura attraverso
l'interfaccia grafica.

\begin{verbatim}
(new-figure "Albero")
(lets Numeric "A1" free 2 2 +3.4)
(lets Numeric "A2" free 2 3 -3.7)
(lets Numeric "S1" free 2 4 +0.5)
(lets Numeric "S2" free 2 5 +0.9)

(define (dec n)
  (- n 1))
(define (inc n)
  (+ n 1))
(define (invisible p)
  (send p masked)
  p)
(define (scalerot oP C a s)
  (let* ((sP (invisible (Point "" scale oP C s)))
         (rP (invisible (Point "" rotation sP C a))) )
    rP))
(define (Ramo p0 p1 n)
  (Segment "" extremities p0 p1)
  (let* ((left-scale (if (odd? n) S1 S2))
         (left-angle A1)
         (right-scale (if (odd? n) S2 S1))
         (right-angle A2) )
    (if (> n 0)
      (begin
        (Ramo p1 (scalerot p0 p1  left-angle  left-scale) (dec n))
        (Ramo p1 (scalerot p0 p1 right-angle right-scale) (dec n))))))
        
(lets Point "A" free -3 0)
(lets Point "B" free -3 2)
(Ramo A B 6)
\end{verbatim}

\drgeniusFigureSize{Curva frattale}{fig60}{10}

\chapter{Gestione Documenti}
Le costruzioni geometriche si possono salvare sia singolarmente 
sia a gruppi (salvataggio di una sessione di \drgenius).
Ricordiamo che le macro vengono salvate come file con
estensione .mgeo e le rimanenti costruzioni come
file con estensione .fgeo.

\section{Salvare una costruzione}

\drgeniusIndex{Figura:}{salva}{}{}

Partendo dal menu \drgeniusMenu{File -> Salva} o
\drgeniusMenu{File -> Salva come}
\`e possibile salvare come file una qualsiasi costruzione.
\drgeniusNote{\drgenius\ \`e in grado di lavorare contemporaneamente con 
pi\`u costruzioni. Si pu\`o passare da una all'altra cliccando con il mouse.}

Selezionando l'opzione \drgeniusMenu{File -> Salva come} 
\`e  possibile cambiare il nome di una costruzione salvata in precedenza.

\drgeniusNote{
Il nome del file proposto di default pu\`o essere modificato 
utilizzando il comando \drgeniusMenu{Modifica -> Preferenze}.
Per maggiori informazioni vedere la sezione relativa al
\link{funzionamento di default}[ Sezione \Ref, pagina \Pageref]{default_behaviour}.}

\section{Salvare una sessione}

\drgeniusIndex{Macro-costruzione:}{salva}{}{}
\drgeniusIndex{Sessione:}{salva}{}{}
Una sessione \`e un insieme di costruzioni di \drgenius\ 
che possono essere registrate tutte in un unico file. Il salvataggio di sessioni 
pu\`o essere particolarmente utile per l'organizzazione didattica di materiali.

Partendo dal menu
\drgeniusMenu{File -> Salvataggio multiplo},
possibile aprire la seguente finestra di dialogo.

\drgeniusFigureSize{La finestra di dialogo per una 
sessione di \drgenius}{fig51}{8}

La finestra di dialogo mostra la lista di tutte le costruzioni realizzate 
durante la sessione di lavoro e il loro genere (macro, costruzioni 
interattive, ecc...).

\drgeniusNote{Attualmente una sessione pu\`o contenere tre generi 
di costruzioni: figure piane costruite interattivamente, macro e testi.}

E' possibile selezionare una ad una le costruzioni utilizzando il comando 
\drgeniusMenu{Salva selezionato}
oppure salvare tutte le costruzioni utilizzando il comando
\drgeniusMenu{Salva tutto}.

\drgeniusNote{Il menu \drgeniusMenu{File -> Salvataggio multiplo}
 rappresenta l'unico mezzo disponibile per salvare una macro in un file.}

\section{Aprire un file}
\drgeniusIndex{Macro-costruzione:}{apri}{}{}
\drgeniusIndex{Sessione:}{apri}{}{}
\drgeniusIndex{Figura:}{apri}{}{}
Dal momento che costruzioni e sessioni vengono salvate sempre su un unico file. 
La procedura di apertura di una sessione o di una costruzione sono identiche 
in quanto si tratta sempre di aprire un file. 
A questo scopo si utilizza il comando  
\drgeniusMenu{File -> Apri}. 
Se si apre una sessione che contiene delle macro esse sono disponibili 
dopo l'apertura di tutte le costruzioni.

\chapter{Applicazioni didattiche}
\label{education}

Questo capitolo \`e di aiuto per chi vuole iniziare ad usare 
\drgeo\ studiando direttamente degli esempi didattici applicativi. 
Diversamente dai capitoli precedenti qui l'approccio \`e
pi\`u diretto e si analizzano situazioni concrete.  
I materiali contenuti in questo capitolo 
sono stati elaborati nell'ambito 
di alcuni periodi di attivit\`a didattica.

\section{Soluzione di esercizi}
Uno dei possibili utilizzi didattici di \drgenius\ 
consiste nella possibilit\`a di risolvere, ricorrendo
agli 
\link{script Guile}[ Sezione \Ref, pagina \Pageref]{script}
esercizi di geometria.
Come esempio mostriamo ora 
la soluzione di un classico problema di geometria, in cui 
si applica il teorema di Pitagora, e il cui testo 
\`e il seguente:

\begin{quote}{\em
Sia dato un trapezio rettangolo $ABCD$ di cui sono note
le lunghezze delle due basi e dell'altezza.
Calcolare perimetro e area del trapezio.}
\end{quote}

Non \`e difficile, sulla scia di quanto trattiamo,
sviluppare molti altri esempi non necessariamente
ristretti all'ambito della Matematica.

\textbf{Soluzione:}
Iniziamo costruendo con \drgeo\ la figura:

\drgeniusFigureSize{Trapezio rettangolo}{dafig1}{8}

Essa comprende i dati e da questi possiamo 
procedere per risolvere il problema. Innanzitutto
possiamo rispondere subito alla
domanda riguardante l'area. Per fare questo scriviamo 
il seguente script Guile che ha come parametri in 
ingresso basi e altezza del trapezio:

\drgeniusIndex{Script:}{\texttt{area trapezio}}{}{}

\begin{quote}{\begin{verbatim}
(define AB (getLength a1))
(define DC (getLength a2))
(define AD (getLength a3))
(/ ( * AD (+ AB DC )) 2 )
\end{verbatim}
}
\end{quote}

ci calcoliamo quindi la lunghezza del segmento $BH$ scrivendo
uno script in Guile i cui oggetti in ingresso
sono i segmenti $AB$ e $CD$:

\drgeniusIndex{Script:}{\texttt{segmento differenza}}{}{}

\begin{quote}{\begin{verbatim}
(define AB (getLength a1))
(define CD (getLength a2))
(- AB CD)
\end{verbatim}
}
\end{quote}

A questo punto possiamo applicare il teorema di 
Pitagora al triangolo rettangolo $CHB$. Anche qui usiamo 
uno script Guile che ha come oggetti in ingresso
il segmento $CH$ e lo script $BH$:

\drgeniusIndex{Script:}{\texttt{teorema di Pitagora}}{}{}

\begin{quote}
{
\begin{verbatim}
(define CH (getLength a1))
(define BH (getValue a2))
(+ (* CH CH) (* BH BH))
\end{verbatim}
}
\end{quote}

Finalmente possiamo ricavare la lunghezza del lato obliquo $BC$
calcolando la radice quadrata del valore restituito dallo
script precedente:

\drgeniusIndex{Script:}{\texttt{radice quadrata}}{}{}

\begin{quote}
{
\begin{verbatim}
(define q (getValue a1))
( sqrt q )
\end{verbatim}
}
\end{quote}
 
I due script precedenti potevano essere 
compendiati in un unico script, ma leggermente
pi\`u complesso. A questo punto possiamo 
concludere l'esercizio calcolando il perimetro
con lo script Guile:

\drgeniusIndex{Script:}{\texttt{perimetro}}{}{}

\begin{quote}
{
\begin{verbatim}
(define AB (getLength a1))
(define CB (getValue  a2))
(define DC (getLength a3))
(define AD (getLength a4))
(+ (+ AB CB )(+ DC AD ))
\end{verbatim}
}
\end{quote}
\section{Teoremi e congetture}
Gli \link{script Guile}[ Sezione \Ref, pagina \Pageref]{script}
permettono, altre alla soluzione di esercizi vista 
sopra, di comprendere con maggiore profondit\`a
gli enunciati di teoremi e di verificare congetture.

In questa sezione iniziamo analizzando, a titolo 
di esempio, il teorema di Tolomeo:

\begin{quote}{\em
Dato un quadrilatero inscritto in una circonferenza
la somma dei prodotti dei lati opposti \`e uguale
al prodotto delle diagonali.
}
\end{quote} 

Possiamo facilmente disegnare la figura con \drgeo\
ottenendo:

\drgeniusFigureSize{Teorema di Tolomeo: quadrilatero convesso}{dafig2}{9}

dove sono anche stati implementati due script 
che calcolano rispettivamente la somma dei prodotti
dei lati opposti del quadrilatero e il prodotto
delle diagonali. Lo script per 
il calcolo della somma dei prodotti dei lati opposti
\`e il seguente

\drgeniusIndex{Script:}{\texttt{teorema di Tolomeo}}{}{}

\begin{quote}
{
\begin{verbatim}
(define AB (getLength a1))
(define DC (getLength a2))
(define BC (getLength a3))
(define AD (getLength a4))
(+ (* AB DC )(* BC AD ))
\end{verbatim}
}
\end{quote}

mentre lo script per il calcolo del prodotto delle diagonali \`e:

\begin{quote}
{
\begin{verbatim}
( define DB (getLength a1))
( define AC (getLength a2))
( * DB AC )
\end{verbatim}
}
\end{quote}

Come si vede i valori restituiti
dagli script, in accordo con il teorema di Tolomeo,
coincidono. Se modifichiamo dinamicamente la figura 
gli script continuano a concidere a meno che non 
ci si imbatta nella seguente situazione:

\drgeniusFigureSize{Teorema di Tolomeo: quadrilatero non convesso}{dafig3}{9}
 
ossia quando il quadrilatero perde la convessit\`a.

In questo caso il teorema non vale e quindi l'enunciato 
precedente non \`e stato ben 
formulato e andrebbe precisato meglio scrivendolo come segue:

\begin{quote}{\em
Dato un quadrilatero CONVESSO inscritto in una circonferenza
la somma dei prodotti dei lati opposti \`e uguale
al prodotto delle diagonali.
}
\end{quote} 

A questo punto potrebbe venire spontanea la seguente congettura:
il teorema di Tolomeo rimane valido per un quadrilatero 
convesso non inscritto in una circonferenza?

Con \drgeo\ possiamo verificare immediatamente 
la falsit\`a di questa congettura come mostrato in figura:

\drgeniusFigureSize{Falsifichiamo una congettura}{dafig4}{8}

Il lettore non avr\`a difficolt\`a ad utilizzare il programma per
costruire esempi didattici, magari pi\`u conosciuti, 
relativamente ai teoremi di Pitagora e di Euclide.

\section{Numeri Irrazionali}
\drgeniusIndex{Figure Scheme per \drgeo\ :}{esempi:}{spirale di Teodoro}{}

Una costruzione classica riguardante i numeri irrazionali
e nota come Spirale di Teodoro
permette di costruire geometricamente le radici quadrate 
dei numeri interi a partire da un triangolo rettangolo isoscele
avente cateti di lunghezza unitaria.

Consideriamo il triangolo $OAB$ di figura in cui $OA=1$:

\drgeniusFigureSize{Costruzione di radice di 2}{dafig7}{8}

Per il teorema di Pitagora si ha allora che $OB$ ha lunghezza pari
a radice quadrata di 2. Se ora, come in figura, si costruisce un
nuovo triangolo rettangolo, retto in $B$,  con cateti $OB$ e
$BC$, di cui l'ultimo di lunghezza unitaria;  

\drgeniusFigureSize{Costruzione di radice di 3}{dafig8}{8}

sempre per il teorema di Pitagora \`e chiaro che l'ipotenusa
$OC$ di $OBC$ ha lunghezza radice quadrata di 3. Iterando 
il procedimento si ottengono 
facilmente tutte le radici quadrate dei numeri naturali.

La natura iterativa della costruzione si presta ad un trattamento 
tramite FSD. Consideriamo allora il seguente codice
Scheme:

\begin{quote}
{
\begin{verbatim}
(new-figure "Triangoli")

(define (triangle p1 p2 p3 n)
  
  (let* ((s1 (Segment "" extremities    p1 p2))
         (s2 (Segment "" extremities    p2 p3))
         (s3 (Segment "" extremities    p3 p1))
         (pe (Line    "" orthogonal     p3 s3))
         (ci (Circle  "" center-segment p3 s2))
         (p4 (Point   "" intersection2  pe ci)))

    (send pe masked)
    (send ci masked)
    (send p4 masked)

(if (> n 0)

    (triangle p1 p3 p4 (- n 1)))))


(lets Point "O" free  0  0)
(lets Point "A" free -1  0)
(lets Point "B" free -1  1)

(triangle O A B 15)
\end{verbatim}
}
\end{quote}

Il triangolo di partenza \`e definito attraverso 
le coordinate esclusivamente per comodit\`a. 
Il codice \`e la trascrizione
letterale del procedimento iterativo descritto sopra.
Una volta valutato da \drgeo\ viene restituita 
la figura seguente:

\drgeniusFigureSize{Spirale di Teodoro}{dafig9}{8} 

L'ipotenusa di ogni triangolo ha lunghezza eguale alla radice 
quadrata di un numero naturale compreso tra 2 e 17.

\section{Spirale di Baravelle}
\drgeniusIndex{Figure Scheme per \drgeo\ :}{esempi:}{spirale di Baravelle}{}

Come abbiamo visto in precedenza,
attraverso una FSD \`e possibile
costruire in modo semplice e intuitivo,
una figura che permette di ``visualizzare''
ci\`o che in programmazione \`e un ciclo.

Possiamo approfondire questo aspetto, 
modificando di poco il codice Scheme
utilizzato per la costruzione dei numeri irrazionali,
per ottenere una figura nota in 
letteratura come spirale di Baravelle. Il codice Scheme
che definisce la spirale 
\`e il seguente:

\begin{quote}
{
\begin{verbatim}
(new-figure "Baravelle")
 
 (define (triangle p1 p2 p3 n)
   
   (let* ((s1  (Segment "" extremities    p1 p2))
          (s2  (Segment "" extremities    p2 p3))
          (s3  (Segment "" extremities    p3 p1))
          (m   (Point   "" middle-2pts    p1 p3))
          (r   (Segment "" extremities    m  p3))
          (pe  (Line    "" orthogonal     p3 s3))
          (ci  (Circle  "" center-segment p3 r ))
          (p4  (Point   "" intersection2  pe ci)))
 
     (send pe  masked)
     (send ci  masked)
     (send p4  masked)
     (send m   masked)
 
 (if (> n 0)
 
     (triangle  m  p3  p4 (- n 1)))))
   
 
 (lets Point "A" free  0  5)
 (lets Point "B" free  5  5)
 (lets Point "C" free  5  0)
 
 (triangle A B C 9)
 
 (lets Point "D" free  0 -5)
 (lets Point "E" free -5 -5)
 (lets Point "F" free -5  0)
 
 (triangle D E F 9)
\end{verbatim}
}
\end{quote}

La figura nota come spirale di Baravelle \`e:

\drgeniusFigureSize{Spirale di Baravelle}{dafig10}{8}

Dalla figura e dal codice Scheme si intuisce la
struttura iterativa alla base della costruzione.

Un problema interessante, che lasciamo al lettore, 
consiste nello stabilire dove convergono i due rami 
della spirale.

Una variazione ulteriore del codice precedente: 

\begin{quote}
{
\begin{verbatim}
(new-figure "Spiral")

 (define (square p1 p2 p3 p4 n)

 (let* ((s1 (Segment "" extremities p1 p2))
 (s2 (Segment "" extremities p2 p3))
 (s3 (Segment "" extremities p3 p4))
 (s4 (Segment "" extremities p4 p1))
 (A (Point "" on-curve s1 1/10))
 (B (Point "" on-curve s2 1/10))
 (C (Point "" on-curve s3 1/10))
 (D (Point "" on-curve s4 1/10)))

 (send A masked)
 (send B masked)
 (send C masked)
 (send D masked)

 (if (> n 0)

 (square A B C D (- n 1)))))


 (lets Point "M" free 5 5)
 (lets Point "N" free -5 5)
 (lets Point "O" free -5 -5)
 (lets Point "P" free 5 -5)

(square M N O P 30)
\end{verbatim}
}
\end{quote}

conduce alla spirale rappresentata in figura:

\drgeniusFigureSize{Spirale}{dafig11}{8}

Il lettore \`e invitato a divertirsi creandone di nuove generalizzando
la costruzione precedente!

\section{Catena di Pappo}
\drgeniusIndex{Figure Scheme per \drgeo\ :}{esempi:}{catena di Pappo}{}

Un utilizzo base delle Figure Scheme per Dr. Geo
consiste nella riproduzione di figure di cui sono
note le caratteristiche analitiche. 

L'esempio di costruzione che proponiamo
è rappresentato dalla famosa catena di Pappo.

\drgeniusFigureSize{Catena di Pappo}{dafig12}{8}
 
Centri e raggi della successione di circonferenze che la formano
hanno un'espressione analitica nota ed quindi è molto
semplice implementarla per riprodurre la figura come FSD.

\begin{quote}
{
\begin{verbatim}
(new-figure "Pappo")

(define (circle n)
(let*(
(r (Numeric "" free 0 0 (/ 15 ( + 6 (* n n )))))
(c (Point   "" free (* 5 (/ 15 ( + 6 (* n n )))) 
(* 2 (* n (/ 15 ( + 6 (* n n )))))))
(p (Circle "" center-radius c r )))

(send r masked)

(if (> n 0)
    (circle (- n 1)))))

(circle 8)

(lets Point "A" free 5 0)
(lets Point "O" free 0   0)
(lets Point "B" free 15 0)
(lets Point "M" middle-2pts B O)
(lets Circle "" 2points M O)
(lets Circle "" 2points A O)
(lets Line   "" 2points A O)
\end{verbatim}
}
\end{quote}

Il significato del codice è molto intuitivo e
non ha bisogno di commenti.
Un esercizio, che fa leva sull'inversione
circolare, consiste nel determinare una costruzione con riga
e compasso che permetta di generare la catena. Il lettore
interessato a questo pu\`o consultare il libro di
Maria Ded\`o intitolato \textit{Trasformazioni Geometriche}. 

\section{Calcolo di Pigreco}

Il calcolo approssimato di pigreco riveste nella storia
della Matematica un ruolo importante. I metodi di approccio
a questo tipo di calcolo sono risultati tra i pi\`u diversi
e spesso contengono raffinatezze.
Qui proponiamo un approccio molto semplificato
al problema che chiamiamo, anche se non del tutto 
propriamente, \textbf{Metodo di esaustione} 
che contiene l'essenza della questione.

Iniziamo con la seguente costruzione di un esagono inscritto
in una circonferenza a partire dal lato $BC$. Notiamo di passaggio
che da questa costruzione \`e possibile costruire e memorizzare
una macro che possiamo chiamare \textit{Esagono}.

\drgeniusFigureSize{Esagono regolare inscritto}{dafig5}{9}

L'idea del metodo di esaustione consiste, 
al primo passo, nell'approssimare
la lunghezza della circonferenza con il perimetro 
$P_{0}$ dell'esagono e nel calcolare
un'approssimazione di Pigreco dividendo 
$P_{0}$ per il diametro della circonferenza.
Chiaramente l'approssimazione che si ottiene
per Pigreco \`e 3.

Al secondo passo possiamo, utilizzando Dr. Geo,
costruire il lato del dodecagono inscritto
nella circonferenza, calcolarci il perimetro
$P_{1}$, e calcolare una successiva approssimazione di
Pigreco dividendo $P_{1}$ per il diametro.


\drgeniusFigureSize{Approssimazione di Pigreco}{dafig6}{9}


Aumentando il numero di lati del poligono inscritto
si otterranno chiaramente approssimazioni sempre migliori.

\section{Esportazione di figure e testi}

Spesso per uso didattico \`e utile 
poter stampare le figure o esportarle 
come immagini in qualche formato
che permetta il loro inserimento
in documenti di altro genere.

\subsection{Stampa di una figura}

\drgeniusIndex{Figura:}{stampa}{}{}
\drgeniusIndex{Stampa:}{figura}{}{}

Il modo pi\`u semplice per stampare una figura consiste prima
nell'esportarla in PostScript e quindi
di utilizzare un sostware come Ghostview 
o un suo derivato per stamparla direttamente.
Naturalmente la figura esportata
pu\`o essere, se necessario, 
inserita in altri documenti come immagine.
Si ricorda che il formato PostScript garantisce all'immagine 
una qualit\`a vettoriale. 

Per gli utilizzatori di \TeX\ \`e 
disponibile l'esportazione di figure 
attraverso il pacchetto Pstrick. 
L'immagine che si ottiene si integra perfettamente
nel testo \TeX\ tuttavia di essa non si pu\`o
eseguire, o almeno sembra, alcun rididmensionamento.

Un ultimo tipo di esportazione, recentemente
introdotto in \drgeo, riguarda l'esportazione 
in formato PNG attraverso il pacchetto Image Magick.

In tutti questi casi l'utilizzatore pu\`o 
preventivamente selezionare,
attraverso il comando 
\drgeniusMenu{File -> Preferenze Esportazione -> Definisci l'area di stampa},
la porzione di figura da stampare e, successivamente,
attraverso il comando 
\drgeniusMenu{File -> Preferenze Esportazione -> Rimuovi l'area di stampa},
rimuovere l'area di stampa definita in precedenza.

\subsection{Inserire un testo in una figura}

\drgeniusIndex{Inserire}{Testo}{}{}
\drgeniusIndex{Figura}{Inserire}{Testo}{}

Per inserire un testo all'interno di una figura 
\`e possibile utilizzare l'utilit\`a
script -- \link{script Guile}[ Sezione \Ref, pagina \Pageref]{script} --
creando uno script senza passare ad esso alcun oggetto.
Per fare questo \`e sufficiente cliccare sul comando
che attiva la funzionalit\`a di script e cliccare
direttamente in un punto del foglio di lavoro dove
si desidera collocare il testo.

A questo punto comparir\`a la scritta
``Drgenius'' e potremo editare lo script
andando ad inserire tra le virgolette,
dove tipicamente viene inserito il codice
Guile/Scheme da eseguire, 
il testo desiderato.  

Nell'esempio che segue una tassellazione di Keplero 
viene accompagnata dal seguente richiamo:

\begin{verbatim}

"Il Motivo Z 
===========================

Tratto dall'Harmonice Mundi  di Johannes Kepler
si costruisce un pentagono formato da oggetti
a simmetria pentagonale."

\end{verbatim}

\drgeniusFigureSize{Un esempio di testo in una figura}{fig58}{9}

Come per ogni script \`e stato possibile 
modificare il colore del testo.

\W \chapter*{Indice Analitico} 
\W \htmlprintindex

\W \begin{iftex} 
\appendix 
\listoffigures 
\printindex 
\W \end{iftex}

\chapter{GNU Free Documentation License}
\input{../fdl}


\end{document}


% LocalWords:  Guile Homothétie homothétie macro-construction glisser-déposer
% LocalWords:  redessinée


