Desenarea unui grafic funcțional în Delphi - articole

În acest articol, vom examina mai multe moduri de a desena un grafic al unei funcții. Vom desena graficul pe conturul componentei Imagine.

Desen Pixel







Puteți desena pe pânză în multe feluri. Prima opțiune este de a desena cu pixeli. Pentru aceasta, este utilizată proprietatea pixelilor. Această proprietate este o matrice bidimensională responsabilă de culorile panzei. De exemplu, Canvas.Pixels [10,20] - corespunde culorii pixelului cu coordonate (10,20). Cu o serie de pixeli, puteți trata ca orice proprietate: schimbați culoarea, dând pixelului o valoare nouă sau definiți culoarea sa, prin valoarea stocată în ea. În exemplul de mai jos, vom seta culoarea neagră la pixel cu coordonate (10,20):

Acum vom încerca să desenați un grafic al funcției F (x) dacă se cunoaște intervalul schimbărilor sale Ymax și Ymin. și intervalul de argumente Xmax și Xmin. Pentru a face acest lucru, vom scrie o funcție personalizată care va evalua valoarea funcției F la punctul x și va returna și valoarea maximă și minimă a funcției și a argumentului ei.

funcția Tform1.F (x: real; var Xmax, Xmin, Ymax, Ymin: real): real;
începe
F: Sin (x);
Xmax: = 4 * pi;
Xmin: = 0;
Ymax: = 1;
Ymin: = - 1;
End;

Nu uitați să indicați și titlul acestei funcții în secțiunea Public:

public

funcția F (x: real; var Xmax, Xmin, Ymax, Ymin: real): real;

Aici, pentru claritate, am indicat pur și simplu intervalul de schimbare a funcției Sin (x) și argumentul său, sub această funcție vor fi descrise în întregime. Parametrii Xmax, Xmin, Ymax, Ymin - sunt descriși cu cuvântul Var deoarece sunt intrări-ieșiri, adică prin intermediul acestora funcția va returna valorile calculelor acestor date în programul principal. Prin urmare, trebuie să declarați Xmax, Xmin, Ymax, Ymin ca variabile globale în secțiunea Implementare.

Acum puneți butonul pe formular și în procesatorul de evenimente OnClick scrieți următorul cod:

procedura TForm1.Button1Click (expeditor: TObject);
var x, y: real;
PX, PY: lung;
începe
pentru PX: = 0 la Image1.Width do
începe
x: = Xmin + PX * (Xmax-Xmin) / Image1.Width;
y: = F (x, Xmax, Xmin, Ymax, Ymin);
PY: = trunc (Image1.Height- (y-Ymin) * Image1.height / (Ymax-Ymin));
image1.Canvas.Pixeluri [PX, PY]: = clBlack;
se încheie;
se încheie;

În acest cod, introducem variabilele x și y, care sunt valorile argumentului și funcției, precum și variabilele PX și PY, care sunt coordonatele pixelilor corespunzând lui x și y. Procedura în sine constă într-o buclă peste toate valorile coordonatelor pixel orizontale PX ale componentei Image1. Mai întâi, valoarea PX selectată este recalculată în valoarea corespunzătoare a lui x. Apoi se numește funcția F (x) și se determină valoarea ei Y. Această valoare este convertită la coordonatele pixelului vertical PY







Desenați cu pixul Pen

Panza are proprietatea Pen - pen. Acest obiect, la rândul său, are un număr de proprietăți. Una dintre ele este proprietatea Color, culoarea prin care este aplicat desenul. A doua proprietate a lățimii este lățimea liniei, dată în pixeli (implicit este 1).

Proprietatea Style definește tipul liniei și poate lua următoarele valori:

Linie solidă, dar cu Lățime> 1 care permite alte culori decât paleta Windows

Toate stilurile cu liniuțe și liniuțe sunt disponibile numai cu grosimea liniilor egale cu 1. În caz contrar, aceste linii sunt desenate ca fiind solide.

Panza are o proprietate PenPos, cum ar fi TPoint. Această proprietate determină poziția actuală a pixului în coordonatele panzei. Deplasarea stiloului fără desen se face folosind metoda MoveTo (x, y). După apelarea acestei metode de panza, punctul cu coordonatele (x, y) devine originalul, din care metoda LineTo (x, y) poate trasa o linie în orice punct cu coordonatele (x, y).

Să încercăm acum să desenați un grafic sinus cu un pix. Pentru a face acest lucru, adăugați înaintea buclă instrucțiunea:

Image1.Canvas.MoveTo (0, Image1.height Div 2);

Și înainte de sfârșitul final al buclă, adăugați următoarea declarație:

Deci, ar trebui să obțineți acest cod:

procedura TForm1.Button1Click (expeditor: TObject);
var x, y: real;
PX, PY: lung;
începe
Image1.Canvas.MoveTo (0, Image1.height Div 2);
pentru PX: = 0 la Image1.Width do
începe
x: = Xmin + PX * (Xmax-Xmin) / Image1.Width;
y: = F (x, Xmax, Xmin, Ymax, Ymin);
PY: = trunc (Image1.Height- (y-Ymin) * Image1.height / (Ymax-Ymin));
image1.Canvas.Pixeluri [PX, PY]: = clBlack;
Image1.Canvas.LineTo (PX, PY);
se încheie;
se încheie;

Așa cum ați observat deja, dacă executați programul, calitatea desenării grafice cu un pix este mult mai bună decât desenarea cu pixel.

După cum am promis acum, voi scrie un exemplu de program care găsește valoarea maximă și minimă a unei funcții. Am schimbat structura procedurilor și am funcționat puțin pentru ao face mai clară. Aici este codul de program gata:

.
tip
TForm1 = clasa (TForm)
Buton1: TButton;
Image1: TImage;
procedura Button1Click (expeditor: TObject);
privat

public
funcția F (x: reală): reală;
Procedură Extrem1 (Xmax, Xmin: real; Var Ymin: real);
Procedura Extrem2 (Xmax, Xmin: real; Var Ymax: real);

se încheie;

punerea în aplicare
Const e = 1e-4; // o mie de precizie
var Xmax, Xmin, Ymax, Ymin: real;

funcția Tform1.F (x: reală): reală;
începe
F: Sin (x);
End;

// găsiți minimul funcției
Procedura TForm1.Extrem1 (Xmax, Xmin: real; Var Ymin: real);
Var x, h: real; j, n: întreg;
începe
n: = 10;
repeta
x: = Xmin;
n: = n * 2;
h: = (Xmax-Xmin) / n;
Ymin: = F (Xmin);
Pentru j: = 1 până la n începe
dacă f (x)x: = x + h;
se încheie;
Până la abs (f (Ymin) -f (Ymin + h))End;

// găsiți funcția maximă
Procedura TForm1.Extrem2 (Xmax, Xmin: real; Var Ymax: real);
Var x, h: real; j, n: întreg;
începe
n: = 10;
repeta
x: = Xmin;
n: = n * 2;
h: = (Xmax-Xmin) / n;
Ymax: = F (Xmin);
Pentru j: = 1 până la n începe
dacă f (x)> = Ymax atunci Ymax: = f (x);
x: = x + h;
se încheie;
Până la abs (f (Ymax) -f (Ymax + h))End;


procedura TForm1.Button1Click (expeditor: TObject);
var x, y: real;
PX, PY: lung;
începe
// aici trebuie să specificați intervalul modificării x
Xmax: = 8 * pi;
Xmin: = 0;

// calculați extremele funcției
Extrem1 (Xmax, Xmin, Ymin);
Extrem2 (Xmax, Xmin, Ymax);

// trageți un grafic de funcții
Image1.Canvas.MoveTo (0, Image1.height Div 2);
pentru PX: = 0 la Image1.Width do
începe
x: = Xmin + PX * (Xmax-Xmin) / Image1.Width;
y: = F (x);
PY: = trunc (Image1.Height- (y-Ymin) * Image1.height / (Ymax-Ymin));
image1.Canvas.Pixeluri [PX, PY]: = clBlack;
Image1.Canvas.LineTo (PX, PY);
se încheie;
se încheie;
end.







Articole similare

Trimiteți-le prietenilor: