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

Assi cartesiani

Questa applicazione è particolarmente importante perché gli algoritmi utilizzati qui saranno inseriti in un nuovo componente Delphi (TOxy) a partire dalla prossima lezione e velocizzeranno molto la realizzazione dei programmi di grafica successivi.
Come si può vedere l'applicazione disegna un sistema di assi cartesiani con una scala variabile a scelta e le etichette con i numeri in corrispondenza delle unità: tutto ciò è basilare per un qualunque applicazione che debba rappresentare rette, curve, figure geometriche o grafici scientifici.

Il componente essenziale di questa applicazione è il PaintBox posto nella linguetta System. Rappresenta un'area delimitata in cui è possibile disegnare; possiede una proprietà Canvas, così come la fom. Tutto ciò che viene disegnato sulla sua Canvas rimane confinato all'interno della Width e dell'Height del PaintBox. Anche le coordinate per disegnare sono relative all'angolo superiore sinistro della PaintBox, indipendentemente da dove si trova nella form.

Collochiamo quindi un PaintBox nella posizione Top =0, Left = 0 e con Width = 401, Height = 401, chiamandolo appunto PaintBox. Alla sua destra inseriamo i controlli che si vedono in figura: 1 Panel (allineato a destra), 1 LabelSc (con la Caption = Scala), 1 EditSc, 1 UpDownSc (collegato a EditSc), 1 ButtonDisegna (con la Caption = Disegna).

Vediamo la procedura di disegno che viene associata sia all'evento OnClick del ButtonDisegna, sia all'evento OnChange di EditSc (non è più necessaria l'associazione ad un evento di UpDownScala).

  • Il PaintBox viene cancellato con Repaint;
  • vengono tracciati gli assi X e Y con le frecce;
  • il Brush viene impostato a Style = bsClear per far sì che lo sfondo (bianco, Brush.Color=clWhite) delle stringhe visualizzate con TextOut non venga disegnato e rimanga quello preesistente sulla form;
  • vengono scritti i nomi sugli assi;
  • vengono effettuati due cicli for che disegnano le lineette sugli assi e scrivono i numeri della scala.

Da notare, inoltre, l'uso dell'istruzione Pascal with do che permette di evitare di scrivere ogni volta PaintBox.Canvas. davanti ai metodi e alle proprietà del Canvas del PaintBox. Infatti, tutti i metodi e le proprietà che sono contenute nel blocco begin end di un with do vengono interpretate come riferite all'oggetto dichiarato dopo il with.

procedure TFormAssiCartesiani.ButtonDisegnaClick(Sender: TObject);
var
  sc, x, y: Integer;
begin
  sc:=StrToIntDef(EditSc.Text, 40);
  
  with PaintBox.Canvas do
  begin
    Repaint;
    
    MoveTo(0, 200); LineTo(400, 200);            // Asse X
    MoveTo(400, 200); LineTo(400-20, 200-10);
    MoveTo(400, 200); LineTo(400-20, 200+10);
    
    MoveTo(200, 400); LineTo(200, 0);            // Asse Y
    MoveTo(200, 0); LineTo(200-10, 20);
    MoveTo(200, 0); LineTo(200+10, 20);
    
    Brush.Style:=bsClear;
    
    TextOut(400-10, 200+10, 'X');                // Nomi assi
    TextOut(200-20, 5, 'Y');
    
    for x:=-200 div sc to 200 div sc-1 do        // Etichette asse X
    begin
      MoveTo(200+x*sc, 200-5); LineTo(200+x*sc, 200+6);
      TextOut(200+x*sc+2, 200+1, IntToStr(x));
    end;
    
    for y:=-200 div sc to 200 div sc-1 do        // Etichette asse Y
    begin
      MoveTo(200-5, 200-y*sc); LineTo(200+6, 200-y*sc);
      TextOut(200+2, 200-y*sc+1, IntToStr(y));
    end;
    
    Brush.Style:=bsSolid;
  end;
end;

Esercizio. Migliorare il programma allineando il PaintBox alla client (Align = alClient) e modificare la procedura di disegno in modo che si adatti automaticamente alle dimensioni Width e Height del PaintBox quando l'utente ridimensiona la finestra. Infine associare la procedura anche all'evento OnResize della form FormAssiCartesiani.

 3.05 - Assi cartesiani