Home

A scuola di Delphi

www.gpeano.org 

Introduzione · Capitolo 1 · Capitolo 2 · Capitolo 3 · Capitolo 4 · Capitolo 5 · Download 

Sommario
Blocco note
Tavola gradi-rad
Primitive grafiche
Giochi grafici
Assi cartesiani
Retta esplicita
Fascio improprio
Circonferenza
Ellisse
Sistema solare
Parabola
Iperbole
 

Capitolo 3

Retta esplicita

Come si può constatare dall'applicazione precedente, disegnare in scala utilizzando solamente coordinate intere richiede un duro lavoro di programmazione.

Per sveltire lo sviluppo di questo e dei programmi seguenti faremo uso di un nuovo componente Delphi costruito appositamente per la rappresentazione di punti, segmenti, circonferenze, ellissi su di un grafico cartesiano, utilizzando coordinate reali, anziché intere.

Il nuovo componente visuale Oxy è stato progettato proprio con questo scopo: facilitare l'utilizzo della grafica e permettere a chi sviluppa il programma di concentrarsi sul problema da risolvere e di non perdersi in calcoli sulla scala di rappresentazione del grafico.

Vediamo come installare il nuovo componente nella palette di Delphi. Estrarre i due file contenuti nel file 3_06_toxy_scuola.zip nella cartella C:\Programmi\Borland\Delphi 2.0\LIB dove sono contenuti gli altri componenti di Delphi. Quindi in Delphi accedere al menu: Component - Install - Add - Browse - selezionare OxyScuola.pas dalla cartella suddetta - Apri - OK. Dopo pochi istanti il componente Oxy comparirà nella linguetta Samples visualizzando l'icona . Ora è il nuovo componente è disponibile come un qualsiasi altro componente di Delphi.

Vediamone le proprietà, i metodi e gli eventi.

Proprietà pubblicate (modificabili dall'Object Inspector):

  • Align: TAlign = alNone, alTop, alBottom, alLeft, alRight, alClient
  • Left, Top, Width, Height: Integer = definiscono posizione e dimensioni
  • XScale, YScale: Integer = definiscono i fattori di scala per gli assi
  • XCenter, YCenter: Integer = definiscono la posizione del centro
  • XGrid, YGrid: Boolean = definiscono se vengono visualizzate le griglie
  • XMin, XMax, YMin, YMax: Double (read only) = limiti visibili degli assi
  • Copyright: string (read only) = informazioni sull'autore e la versione

Proprietà pubbliche (modificabile sono da programma):

  • Bitmap: TBitmap = contiene l'immagine sulla quale si disegna
  • Canvas: TCanvas = Canvas della Bitmap sulla quale si disegna
  • Pen, Brush, Font = proprietà della Canvas

Metodi:

  • Clear
  • GetPixel(X, Y: Double): TColor (function)
  • SetPixel(X, Y: Double; C: TColor)
  • MoveTo(X, Y: Double)
  • LineTo(X, Y: Double)
  • Line(X1, Y1, X2, Y2: Double)
  • Rectangle(X1, Y1, X2, Y2: Double)
  • Circle(X, Y, R: Double)
  • Ellipse(X, Y, A, B: Double)
  • TextOut(X, Y: Double; const Text: string)

Eventi:

  • OnClick, OnDblClick
  • OnDragDrop, OnDragOver, OnEndDrag, OnStartDrag
  • OnMouseDown, OnMouseMove, OnMouseUp
  • OnResize

Come si può vedere i nomi o sono autoesplicativi o ricalcano esattamente quelli dei metodi e delle proprietà dell'oggetto standard Canvas di Delphi. Oxy possiede anch'esso un Canvas, che però opera con coordinate reali (Double) invece che intere.

Inoltre ciò che viene disegnato su di esso è permanente, quindi anche se la form viene momentaneamente coperta da altre finestre, l'immagine non viene cancellata. Per cancellare è necessario chiamare il metodo Clear.

L'accesso in lettura ai pixel avviene tramite la funzione GetPixel, che restituisce il colore del pixel posto alle coordinate reali (x,y), e in scrittura tramite la procedura SetPixel, che imposta il colore passato come terzo parametro del punto posto alle coordinate reali (x,y).

I metodi MoveTo e LineTo funzionano come i loro equivalenti interi, mentre Line, che disegna il segmento che va dal punto (x1,y1) al punto (x2,y2), è un metodo nuovo.

La sintassi di Rectangle è la stessa, anche se questa volta il rettangolo non è 1 pixel più piccolo per ogni dimensione.

Vi è il nuovo metodo Circle, che disegna un cerchio con centro (x,y) e raggio r, mentre il metodo Ellipse  è stato modificato perché ora disegna un ellisse di centro (x,y) e di semiassi a e b.

Infine TextOut funziona come il suo equivalente intero.

Le proprietà Pen, Brush e Font sono identiche a quelle del Canvas standard di Delphi.

La proprietà Bitmap permette di utilizzare tutti i metodi associati all'oggetto omonimo; per esempio il grafico può essere così facilmente salvato su disco con l'istruzione:

Oxy.Bitmap.SaveToFile('nomefile.bmp');

o caricato in memoria con:

Oxy.Bitmap.LoadFromFile('nomefile.bmp');

Passiamo ora alla realizzazione della prima applicazione per lo studio della retta in geometria analitica, utilizzando il nuovo componente Oxy appena visto.

La form  è costituita da un Panel allineato a sinistra (Align = alLeft) contenente una Label  di commento con l'equazione della retta in forma esplicita, altre due Label "m" e "q" con a fianco due Edit, che conterranno rispettivamente il coefficiente angolare e il termine noto della retta, e 2 Button che serviranno a cancellare e a disegnare il grafico.

A destra inseriamo il componente Oxy allineato all'area client (Align = alClient) in modo che occupi tutto lo spazio disponibile. Impostiamo ora le proprietà: vediamo che cambiando i valori (e premendo Invio) il componente modifica immediatamente il suo aspetto visualizzando in anteprima quale sarà il suo aspetto finale in base ai valori scelti per la scala, etc.

  • object PanelControlli: TPanel
      Align = alLeft
      BevelInner = bvRaised
      BevelOuter = bvLowered
  • object LabelEq: TLabel
      Caption = 'y = m x + q'
  • object LabelM: TLabel
      Caption = 'm'
  • object EditM: TEdit
      Text = '1'
  • object LabelQ: TLabel
      Caption = 'q'
  • object EditQ: TEdit
      Text = '1'
  • object ButtonCancella: TButton
      Caption = '&Cancella'
      OnClick = ButtonCancellaClick
  • object ButtonDisegna: TButton
      Caption = '&Disegna'
      Default = True
      OnClick = ButtonDisegnaClick
  • object Oxy: TOxy
      Align = alClient
      XCenter = 0
      XGrid = True
      XScale = 40
      YCenter = 0
      YGrid = True
      YScale = 40

Passiamo ora al listato, che è di una semplicità quasi incredibile considerando l'output grafico che è in grado di fornire.

procedure TFormRettaEsplicita.ButtonDisegnaClick(Sender: TObject);
var
  m, q, x1, y1, x2, y2: Double;
begin
  m:=StrToFloat(EditM.Text);
  q:=StrToFloat(EditQ.Text);
  
  x1:=Oxy.xMin; y1:=m*x1+q;
  x2:=Oxy.xMax; y2:=m*x2+q;
  
  Oxy.Pen.Color:=clBlue;
  Oxy.Line(x1, y1, x2, y2);
end;

Vengono letti i valori di m e q; vengono assegnati ad x1 e x2 i limiti sinistro e destro della finestra grafica visualizzata da Oxy; con questi valori vengono calcolati i valori corrispondenti di y1 e y2; infine viene tracciato il segmento che va da (x1,y1) a (x2,y2) in colore blu.

Segue poi la procedura associata al bottone Cancella, che si spiega da sola.

procedure TFormRettaEsplicita.ButtonCancellaClick(Sender: TObject);
begin
  Oxy.Clear;
end;

 3.06 - Retta esplicita (*)

 

(*) TOxy (deve essere installato in Delphi prima di aprire il progetto: seguire le istruzioni contenute nel commento del file zip oppure all'interno del file OxyScuola.pas)