Universit a tea Alexandr u Io an Cuza din Ia³i [602301]

Universit a tea Alexandr u Io an Cuza  din Ia³i
F a cul t a tea de Ma tema tic 
Aplica µii grafice în
limbajul C#
Lucrare de licenµ 
Conduc tor ³tiinµic:
Conf. dr. Mihai NECULACandidat: [anonimizat], 2018
Ia³i

Cuprins
1 F acilit µile grace ale lim ba jului C# 2
1.1 A³area grac  . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Structurile P oin t ³i P oin tF . . . . . . . . . . . . . . . . . . . . 4
1.3 Structurile Size ³i SizeF . . . . . . . . . . . . . . . . . . . . . 4
1.4 Structurile Rectangle ³i RectangleF . . . . . . . . . . . . . . . 4
1.5 Utilizarea culorilor ³i a fon turilor . . . . . . . . . . . . . . . . 4
1.6 Clasa P en . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.7 Obiecte Brush . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.8 Clasa Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.9 Clasa Bitmap . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.10 Clasa Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2 Soft w are p en tru graca 2D 12
2.1 Prezen tarea aplicaµiei . . . . . . . . . . . . . . . . . . . . . . . 12
2.2 Exemple de utilizare . . . . . . . . . . . . . . . . . . . . . . . 18
Bibliograe 23
1

Capitolul 1
F acilit µile grace ale
lim ba jului C#
1.1 A³area grac 
Subsistem ul care trateaz  a³area grac  în Microsoft Visual Studio se n umeste
GDI+. GDI (Graphical Device In terface) a fost mo delul grac din Win-
do ws începând cu Windo ws 3.0. De-a lungul timpului, acesta a fost m ult
îm bun t µit p en tru cadrul de lucru .NET, astfel explicându-se ad ugarea
semn ului +. GDI+ ofer  o bibliotec  de clase p en tru efectuarea de op eraµii
grace. F uncµionalitatea in terfeµei GDI+ se în tinde p este mai m ulte spaµii
de n ume:
 System.Dra wing  asigur  funcµionalitatea de baz ;
 System.Dra wing.Dra wing2D  pune la disp oziµie funcµiile grace bidi-
mensionale ³i v ectoriale mai a v ansate;
 System.Dra wing.Imaging  asigur  funcµionalitatea p en tru prelucrarea
de imagini;
 System.Dra wing.T ext  ofer  funcµii tip ograce suplimen tare;
 System.Dra wing.Prin ting  trateaz  op eraµiile de tip rire.
2

F acilit µile gr ac e ale limb ajului C#
Spaµiile de n ume System.Dra wing.
Principalele clase din System.Dra wing sun t:
Clasa Descrierea
Bitmap Reprezin t  un obicet bitmap. A ceast  clas  p oate lucra cu
câtev a formate standard, prin tre care: BMP , GIF si JPG
Brush Clasa care prezin t  "p ensulele" p en tru umplerea in te-
rioarelor div erselor forme
Brushes O colecµie de p ensoane
Color Structur  care reprezin t  o culoare
F on t Reprezin t  un fon t
F on tF amily Reprezin t  o familie de fon turi
Graphics Reprezin t  o suprafaµ  de desen
Icon Reprezin t  un obiect icon
Image Clas  abstract  care st  la baza altor clase, prin tre care
Bitmap ³i Metale
P en Clas  ale c rei obiecte reprezin t  "creioanele" folosite p en tru
desenarea formelor ³i con tururilor
P ens O colecµie de p ensoane
P oin t, P oin tF Clase folosite p en tru reprezen tarea punctelor ce au co ordo-
natele X,Y în tregi sau în virgul  mobil 
Rectangle, RectangleF Clase folosite p en tru reprezen tarea dreptunghiurilor (v alori
în tregi sau în virgul  mobil )
Region Reprezin t  o regiune (n u neap rat dreptunghiular )
Size, SizeF Structurile de timp în treg sau în virgul  mobil  care reprez-
in t  o dimensiune
SolidBrush O p ensul  care utilizeaz  o culoare p en tru a umple formele
StringF ormat Încapsuleaz  un set de informaµii de macetare a textelor,
cum ar : alinierea ³i spaµierea liniilor
T extureBrush O p ensul  care utilizeaz  o imagine p en tru a umple formele
3

F acilit µile gr ac e ale limb ajului C#
1.2 Structurile P oin t ³i P oin tF
Structurile P oin t ³i P oin tF reprezin t  o p erec he ordonat  de în tregi n n umere
în virgul  mobil , ce denesc un punct în plan.
A ccesul la aceste co ordonate se face prin in termediul propriet µilor X ³i Y .
Exemplul 1
Point P1=new Point(25,100);
PointF P2=new PointF(23.7F, 7.23F);
1.3 Structurile Size ³i SizeF
Structurile Size ³i SizeF reprezin t  o p erec he ordonat  de în tregi n n umere în
virgul  mobil , ce denesc, de obicei, l µimea ³i în lµimea un ui dreptunghi.
A ccesul la aceste co ordonate se face prin in termediul propriet µilor Width ³i
Height .
Exemplul 2
Size S1= new Size(25,100),S2=new Size(P1);
SizeF S3=new SizeF(23.7f, 7.23F), S4=new SizeF(P2);
1.4 Structurile Rectangle ³i RectangleF
Structurile Rectangle ³i RectangleF reµin un set de patru în tregi n n umere
în virgul  mobil  care reprezin t  lo caµia ³i dimensiunea un ui dreptunghi.
A ccesul la aceste v alori se face prin in termediul propriet µilor X , Y , Width ,
Height .
Exemplul 3
Rectangle R1= new Rectangle(0,25,100,100), R2=new Rectangle(P1,S1);
Rectangle R3=new Rectangle(24.5F,23.7F,7.23F,5.2F), R4=new RectangleF(P2,S3);
1.5 Utilizarea culorilor ³i a fon turilor
Culorile sun t reprezen tate de structura System.Dr awing.Color ³i sun t for-
mate din patru comp onen te: R e d, Gr e en, Blue ³i A lpha .
Red, Green ³i Blue (R GB) reprezin t  can tit µile de ro³u, v erde ³i albastru
(v alori cuprinse în tre 0 ³i 255). Can titatea Alpha reprezin t  transparenµa
culorii ³i p oate v aria în tre 0 (complet transparen t) ³i 255 (complet opac).
Structura Color dene³te un n um r mare de propriet µi care reprezin t  cu-
lorile denite de sistem, începând cu A lic eBlue ³i terminând cu Y el lowGr e en .
Nu exist  constructor denit dar se p ot utiliza meto dele statice F r omA r gb
F r omKnownColor, F r omName p en tru a crea obiecte Color.
4

F acilit µile gr ac e ale limb ajului C#
 F r omA r gb  creeaz  o culoare din tr-un set de v alori Alpha, Red, Green,
Blue;
 F r omKnownColor  creeaz  un obiect Color din tr-un mem bru al en u-
mer rii Kno wnColor;
 F r omName  creeaz  un obiect p ornind de la un n ume.
Exemplul 4
Color rosu=Color.FromArgb(255,0,0);// o culoare opaca
Color c=Color.FromArgb(110,33,66,99);// o culoare semi-transparenta
Color rosu_semitransparent=Color.FromArgb(127,rosu.R, rosu.G,
rosu.B)// o culoare semitransparenta
Observ aµia 1 Pr opriet µile A,R,G ³i B p ot  utilizate p entru a ac c esa c om-
p onentele obie ctului Color.
F on turile sun t reprezen tate de structura System.Dr awing.F ont . Un fon t
se p oate deni sp ecicând familia (ex. Times New Roman), dimensiunea ³i
stilul. Prin tre constructorii clasei a v em:
 public Font(Font, FontStyle);
-construie³te un nou fon t utilizând un fon t existen t ³i o en umerare
F on tSt yle.
 public Font(String, Single);
-construie³te un nou fon t p ornind de la o familie de fon turi ³i de la o
dimensiune sp ecicat .
 public Font(String, Single, FontStyle);
-construie³te un nou fon t pronind de la o familie de fon turi, de la o
dimensiune sp ecicat  ³i de la o en umerare F on tSt yle
Propriet µi sp ecice
Nume Descriere
Bold D  o v aloare care indic  dac  fon tul are aplicat stilul b old
F on tF amily D  v aloarea F on tF amily aso ciat  fon tului
Italic D  o v aloare care indic  dac  fon tul are aplicat stilul italic
Name D  n ume fon tului
Strik eout D  o v aloare care indic  dac  textul care v a  scris utilizând
acest fon t este t iat cu o linie orizon tal 
St yle D  informaµii despre stilul fon tului
Underline D  o v aloare care indic  dac  fon tul are aplicat stilul under-
line
5

F acilit µile gr ac e ale limb ajului C#
Observ aµia 2 Pentru a determina dimensiunile unui anumit text într-un
c ontext gr ac se p o ate folosi meto da Me asur eString din clasa Gr aphics, c a în
exemplul de mai jos:
Exemplul 5
Graphics g;
SizeF ms;
Font f;

f=new System.Drawing.Font("Arial", 12);
ms=g.MeasureString("text",f);
float a=ms.Width;//latimea textului
float b= ms.Height;//inaltimea textului
1.6 Clasa P en
Obiectele clasei P en sun t utilizate p en tru a reprezen ta "creioanele" utilizate
p en tru desenarea formelor ³i con tururilor. Obiectele P en simple sun t create
prin sp ecicarea unei l µimi de linie ( în pixeli) ³i a unei culori.
Exemplul 6
Pen pen1= new Pen(Color.Black);//creeaza un creion negru cu
latimea prestabilita de un pixel
Pen pen2=new Pen(Color.Red, 2.0F);//creeaza un creion rosu cu
latimea de doi pixeli
Se p ot crea ³i obiecte P en mai a v ansate, sp ecicând un argumen t Brush în
lo c de Color. Astfel, se p ot umple liniile cu imagini sau mo dele.
Observ aµia 3 Clasa Pen ar e pr opriet µi c ar e denesc p este 140 de cr eio ane
c e
r epr ezint  gama c omplet  de culori denite de sistem. Fie c ar e dintr e ac este a
ar e l µime a de un pixel.
1.7 Obiecte Brush
Obiectele Brush sun t de mai m ulte feluri, toate pro v enind din clasa de baz 
Brush. Cel mai simplu obiect este SolidBrush , care umple o suprafaµ  cu o
culoare omogen .
Exemplul 7
TextureBrush br2=new TextureBrush(new Bitmap("brush.bmp"),
System.Drawing.Drawing2D.WrapMode.Tile);//creaza un obiect TextureBrush
care va fi multiplicat de toata suprafata formei
Observ aµia 4 Clasa Brushes ar e pr opriet µi c ar e denesc p ensule denite
de sistem.
6

F acilit µile gr ac e ale limb ajului C#
1.8 Clasa Image
Clasa Image este o clas  abstract  care st  la baza claselor Bitmap ³i Metale.
Propriet µi
Heigh t D  în lµimea obiectului Image .
Horizon talResolution D  rezoluµia orizon tal ( pixeli-p e-inc h) a obiectului Image
P alette D  sau seteaz  paleta de culori utilizat  de obiectul Image
Ra wF ormat D  formatul obiectului Image : Bmp, Gif, Icon, Jp eg, W mf,
etc
Size D  sau seteaz  l µimea ³i în lµimea, în pixeli, a imaginii
V erticalResolution D  rezoluµia v ertical (pixeli-p e-inc h) a obiectului Image
Width D  l µimea obiectului Image
Meto de
Clone Creeaz  o copie a obiectului Image
F romeFile Creeaz  o imagine din tr-un ³ier sp ecicat
F romStream Ov erloaded. Creeaz  o imagine din tr-un sistem
GetF rameCoun t D  n um rul de frame-uri ale obiectului
GetPixelF ormatSize D  adâncimea culorii (n um rul de biµi p e pixel) p en tru for-
matul sp ecicat
RotateFlip F olosit  p en tru rotiri ³i simetrii ale imaginii
Sa v e Salv eaz  imaginea în formatul sp ecicat
SelectA ctiv eF rame Selecteaz  frame-ul sp ecicat prin dimensiune ³i index
Exemplul 8
img.Save("C:\\poza.bmp");
img.Save("C:\\poza.bmp",System.Drawing.Imaging.ImageFormat.Bmp);
1.9 Clasa Bitmap
Un obiect Bitmap reprezin t  o imagine graca(reprezen tat  prin pixeli) îm-
preuna cu atributele sale.P en tru crearea obiectelor Bitmap putem folosi con-
structorii:
public Bitmap(Image); creeaz  un obiect Bitmap din tr-un obiect Image existen t
public Bitmap(Stream); creeaz  un obiect Bitmap din tr-un ux dat
public Bitmap(String); creeaz  un obiect Bitmap a v ând la baz  ³ierul aat la adresa
sp ecicat 
public Bitmap(Image,Size); creeaz  un obiect Bitmap( de dimensiuni sp ecicate)
public Bitmap(Image,in t,in t); din tr-un obiect Image existen t
public Bitmap(in t,in t) creeaz  un obiect Bitmap de dimensiuni sp ecicate
7

F acilit µile gr ac e ale limb ajului C#
Meto de sp ecice
GetPixel D  culoare pixelului sp ecicat
Mak eT ransparen t Culoarea sp ecicat  devine transparen t 
SetPixel Seteaz  culoarea pixelului sp ecicat
SetResolution Seteaz  rezoluµia obiectului Bitmap
Exemplul 9 Exemplu în c ar e vom înc  r c a imagine a aat  la adr esa " r esurse nn p oza.jp g",
ap oi a³ m al tur at imagine a iniµial  ³i imagine a mo dic at  (pixelii c ar e au
iniµial culo ar e a e gal  cu c e a a pixelului aat în p oziµia (2;2) devin tr ans-
p ar enµi).
Graphics g=p.CreateGraphics();
Bitmap bm=new Bitmap("resurse\\poza.jpg");
bm=new Bitmap(bm,200,200); //redimensionam g.DrawImage(bm,0,0,300,250);
Color c=bm.GetPixel(2,2);
bm.MakeTransparent(c);
g.DrawImage(bm,300,0,300,250);
1.10 Clasa Graphics
Clasa Graphics sup ort  op eraµii de desenare, iar un obiect al clasei Graph-
ics reprezin t  lo caµia c tre care se trimite a³area grac , dar p oate oferi ³i
informaµii despre disp ozitivul utilizat. Un obiect al clasei Graphics reprez-
in t  o structur  de date fundamen tal  din Windo ws, den umit  con text de
disp ozitiv, ind de fapt un in termediar în tre utilizator ³i disp ozitivul de
ie³ire. Obiectele clasei Graphics n u sun t create direc,t ci se obµin cu a jutorul
meto dei Cr e ateGr aphics() .
Exemplul 10
Graphics g= formularulMeu.CreateGraphics();
Un obiect Graphics utilizeaza resurse de sistem care v or  elib erate din mem-
orie atunci când obiectul este colectat la gunoi. Cum n u se cunoa³te momen-
tul în care se colecteaz  gunoiul, este recomandat ca dup  utilizare, resursele
s  e elib erate, ap elând meto da Disp ose .
Exemplul 11
g.Dispose();
8

F acilit µile gr ac e ale limb ajului C#
Clasa Graphics include m ulte meto de, cele mai des utilizate ind prezen-
tate în tab elul urm tor:
Clear Umple în treaga suprafaµ  de desenare cu o culoare
Disp ose Elib ereaz  resursele utilizate de obiectul Graphics
Dra wArc Deseneaz  un arc de elips 
Dra wBezier Deseneaz  o curb  Bézier denit  prin patru puncte
Dra wBeziers Deseneaz  o curb  Bézier denit  prin tr-un tablou de puncte
Dra wClosedCurv e Deseneaz  o curb  înc his  denit  de un tablou de puncte
Dra wCurv e Deseneaz  o curb  a v ând la baz  un tablou de puncte
Dra wElipse Deseneaz  o elips  denit  de un dreptunghi delimitator
Dra wIcon Deseneaz  o pictogram 
Dra wImage Deseneaz  imaginea sp ecicat  în lo caµia precizat 
Dra wLine Deseneaz  o linie în tre dou  puncte precizate
Dra wLines Deseneaz  o serie de segmen te ce unesc punctele precizate
în tr-un tablou de puncte
Dra wP ath Deseneaz  un obiect GraphicsP ath
Dra wPie Deseneaz  un sector de cerc denit de o elips  ³i dou  linii
radiale
Dra wP olygon Deseneaz  un p oligon denit de un tablou de puncte
Dra wRectangle Deseneaz  un dreptunghi
Dra wString Scrie textul sp ecicat în lo caµia sp ecicat , folosind câte un
obiect Brush ³i F on t
FillClosedCurv e Umple in teriorul unei curb e înc hise denit  de un tablou de
puncte
FillEllipse Umple in teriorul unei elipse denit  de un dreptunghi delim-
itator
FillP ath Umple in terioriul un ui obiect GraphicsP ath
FillPie Umple in teriorul un ui sector de cerc denit de o elips  ³i
dou  linii radiale
FillP olygon Umple in teriorul un ui p oligon denit de un tablou de puncte
FillRectangle Umple in teriorul un ui dreptunghi
F romImage Creeaz  un obiect Graphics nou din tr-un obiect Image
MeasureString D  dimensiunile un ui text, precizându-se fon tul folosit
RotateT ransform Aplic  o rotaµie dat  de o matrice
Sa v e Salv eaz  con textul grac reprezen tat de obiectul curen t
9

F acilit µile gr ac e ale limb ajului C#
Exemplul 12 În ac est exemplu, vom r e aliza desenar e a unui c er c p e c ar e se
va mi³c a c ontinuu un punct.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace exemplul1
{
public partial class Form1 : Form
{
Graphics gr;
SolidBrush myBrush = new SolidBrush(Color.White);
Brush myBrush2 = new SolidBrush(Color.Black);
bool seDeseneaza = false;
public Form1()
{
InitializeComponent();
gr = this.CreateGraphics();
}
private void button1_Click(object sender, EventArgs e)
{
button2.Select();
if (seDeseneaza) return;
this.Invalidate();
seDeseneaza = true;
for (double i = 0; seDeseneaza && i < 100; i += 0.001)
{
float x = (float)(130 + 100 * Math.Sin(i));
float y = (float)(130 + 100 * Math.Cos(i));
gr.DrawLine(new Pen(myBrush2), x, y, (float)(130 +
100 * Math.Sin(i + 0.001)),(float)(130 + 100 *
Math.Cos(i + 0.001)));
gr.FillRectangle(myBrush, x, y, 2, 2);
Application.DoEvents();
gr.DrawEllipse(new Pen(myBrush2), x, y, 3, 3);
}
if (!seDeseneaza) return;
seDeseneaza = false;
10

F acilit µile gr ac e ale limb ajului C#
button1.Select();
}
private void button2_Click(object sender, EventArgs e)
{
seDeseneaza = false;
button1.Select();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
seDeseneaza = false;
}
}
}
În urma execut rii program ului se v a a³a:
Figura 1.1: Exemplul 1
11

Capitolul 2
Soft w are p en tru graca 2D
2.1 Prezen tarea aplicaµiei
Prezen t m aici un program sp ecial conceput p en tru realizarea de desene,
statice sau animate, în lim ba jul C# . F aµ  de ab ordarea din capitolul prece-
den t, acum imaginile sun t p ersisten te, p ot  memorate p e dis, ³i sun t real-
izate pixel cu pixel.
Program ul a³eaz  o form  cu dimensiuni xe p e care se a  o suprafaµ 
de desenare (de tip PictureBo x), colorat  iniµial în negru ³i un meniu cu cinci
in tr ri: Start, Stop, Sa v e, Ab out ³i Exit . Un clic k p e Start declan³eaz 
trasarea desen ului, Stop opre³te desenarea, Sa v e p ermite salv area imaginii
obµin ute în format bitmap, iar Exit înc hide program ul. Submeniul Ab out
a³eaz  c suµa de dialog corespunz toare. Bitmap-ul bmp este folosit p en tru
p strarea în memorie a pixelilor desenaµi in program: p en tru a dev eni vizibil,
el este atribuit propriet µii Image a picture-b o x-ului prin instrucµiunea
picBox.Image=bmp;
A tribuirea este f cut  o dat  cu iniµializarea uneltelor grace la înc r-
carea formei, în handler-ul de ev enimen t. Pixelii bitmap-ului sun t setaµi cu
a jutorul meto dei
bmp.SetPixel(int i, int j, Color c);
iar reîmprosp tarea imaginii p e ecran se obµine cu ap elul
picBox.Invalidate();
efectuat de meto da
ResetScreen();
12

Softwar e p entru gr ac a 2D
În orice program de grac  2D a v em dou  sisteme de referinµ : cel al
punctelor din plan, de co ordonate (x; y) ,x ³iy n umere reale ³i cel al pix-
elilor de p e ecran, de co ordonate (i; j) ,i ³ij n umere în tregi. P e ecran apar
n umai pixelii din dreptunghiul delimitat de imin, imax, jmin, jmax , care
conµine imaginea din plan aat  în dreptunghiul delimitat de xmin, xmax,
ymin, ymax . T ransform rile ane care suprapun cele dou  dreptunghiuri
folosesc factorii de scalare dxdi, dydj, didx, djdy , calculaµi astfel:
dxdi = (xmaxxmin )=(imaximin );
dydj = (ymaxymin )=(jmaxjmin );
didx = (imaximin )=(xmaxxmin );
djdy = (jmaxjmin )=(ymaxymin );
Dreptunghiul pixelilor este xat din start, la declararea câmpurilor core-
spunz toare:
public const int imin=0,ima=dimPicBmp-1, jmin=0,jmax=dimPicBmp-1;
în timp ce dreptunghiul din plan ul xOy p oate  setat de programator cu
meto da
void setXminXmaxYminYmax(double xm,double XM, double ym, double YM);
T recerea la co ordonatele ( x,y ) la ( i,j ) este dat  de form ulele:
i= (int)(imin + (xxmin )didx);
j= (int)(jmin + (yymin )djdy);
iar trecerea in v ers  de form ulele:
x= (double )(xmin + (xmin + (iimin )dxdi);
y= (double )(ymin + (ymin + (jjmin )dydj);
Culorile utilizate în aplicaµiile p ot  iniµializate prin instrucµiuni de forma:
Color c1,c2,c3;
c1=Color.Azure;
c2=Color.FormArgb(128,255,17);
c3=PenColor;
unde ultima viarian t  folose³te proprietatea P enColor care returneaz  un
obiect Color iniµializat la declararea clasei formei:
private Color penColor=Color.White;
13

Softwar e p entru gr ac a 2D
sau prin utilizarea paletei de culori
private Color[] paleta;
care este setat  în constructorul formei prin secv enµa:
this.paleta=new Color[dimPaleta];
for(int k=0;k<fimPslets;k++)
{
double tcol=56.123+2.0*Math.PI*k/(double)dimPaleta;
int rcol=(int)(128+128*Math.Sin(tcol));
int gcol=(int)(128+128*Math.Sin(2*tcol));
int bcol=(int)(128+128*MathCos(3*tcol));
paleta[k]=Color.FormArgb(rcol %256,gcol%256, bcol%256);
}
A ccesul public la culorile din palet  este p ermis n umai prin in termediul
meto dei:
public Color getColor(int k) //k pozitiv
{
return paleta[k% dimPaleta];
}
Câmpul priv ate b o ol doW ork al clasei GraphicF orm are rolul de a indica
dac  program ul trebuie sau n u s  stop eze desenarea. La selectarea item ului
Start , se seteaz  doW ork cu v aloarea true ³i este lansat  în execuµie funcµia
de desenare makeImage() . Ap sarea lui Stop sau Exit seteaz  doW ork la
false.
Desenarea este de obicei o op eraµie de lung  durat  care µine pro cesorul
o cupat un timp nep ermis de lung ³i din acest motiv în timpul desen rii tre-
buie consultat , din când în când, v aloarea v ariabilei doW ork prin ap elarea
funcµiei:
public bool resetScreen()
{
picBox.Invalidate(); \\pentru re-pictarea ferestrei
Application.DoEvents();\\pentru procesarea mesajelor
return dowork; \\pentru semnalizarea opririi desenarii
}
În cazul în care rezultatul are v aloarea false , desenarea trebuie în trerupt .
14

Softwar e p entru gr ac a 2D
Observ  m c  r esetScr e en() are un triplu rol:
1. actualizar e a imaginii : in v alideaz  imaginea obiectului picBo x pro v o când
astfel re-pictarea sa (astfel, pixelii setaµi de noi în bitmap-ul din memorie
apar p e ecran);
2. pr o c esar e a mesajelor : p ermite sistem ului de op erare s  trateze ev eni-
men te ap rute în tre timp ³i s  mo dice, ev en tual, v aloarea lui doW ork (dac 
utilizatorul a ap sat item ul Stop , de exemplu). F r  ap elul meto dei Do-
Events() , program ul nostru ar blo ca activitatea calculatorului pân  la sfâr³i-
tul desen rii;
3. semnalizar e : informeaz  funcµia ap elat , prin in termediul v alorii lui
doW ork , dac  s-a ap sat Stop sau Exit , caz în care trebuie oprit  desenarea.
Mo dul standard de lucru este urm torul:
public override void makeImage() //in clasa Sablon
{
setXminXmaxYminYmax(-1.0, 1.0, -1.0, 1.0);

for (int k = 0; k<1000000; k++) //desenam o serie de figuri
{
col = getColor(k);
for ( …) //formam o figura intreaga
{

setPixel(x,y, col); // coloram punct cu punct

}
if (!resetScreen()) return; //aratam ce am mai desenat,
// vedem daca trebuie sa stopam desenarea
}
}
Meto dele grace puse la disp oziµia programatorului au un caracter minimal
(clasa Bitmap dispune n umai de funcµia SetPixel, spre deosebire de clasa
Graphics, sp ecial conceput  p en tru graca 2D, dar care ar  impus o ab or-
dare mai lab orioas ). Mai precis, au fost implemen tate n umai funcµiile:
protected void setPixel(int i, int j, Color c);
protected void setPixel(double x, double y, Color c);
protected void setPixel(Complex z, Color c);
protected void setLine(int i0, int j0, int i1, int j1, Color c);
protected void setLine(double x0, double y0, double x1, double y1, Color c);
protected void setLine(Complex z0, Complex z1, Color c);
În sfâr³it, p en tru trasarea rapid  a acelor co ordonate se p oate ap ela meto da:
15

Softwar e p entru gr ac a 2D
protected void setAxis()
{
setLine(xmin, 0.0, xmax, 0.0, penColor);
setLine(0.0, ymin, 0.0, ymax, penColor);
}
Clasa GraphicF orm are rolul de a  clas  de baz  p en tru aplicaµii de
grac  2D. P en tru a facilita dezv oltarea acestora, clasa GraphicF orm a fost
prev  zut  cu meto da virtual :
public virtual void makeImage()…
care p oate  suprascris  în clasele descenden te. De fapt, o clas  deriv at  care
execut  un desen oarecare în plan se p oate rezuma n umai la suprascrierea
acestei meto de.
De exemplu, p en tru a desena celebrele curb e Lissa jouss, obµin ute prin
compunerea a dou  oscilaµii armonice, una v ertical  ³i alta orizon tal , de
ecuaµii parametrice(
x(t) = sin( !1t);
y(t) = sin( !2t+');
v om suprascrie meto da mak eImage() astfel:
public class CurbeLissajous : GraphicForm
{
public override void makeImage()
{
setXminXmaxYminYmax(-1.3, 1.3, -1.3, 1.3);
const double omega1 = 0.001;
const double omega2 = 1.5007 * omega1;
setAxis();
for (int t = 0; ; t++)
{
double x = Math.Sin(omega1 * t);
double y = Math.Sin(omega2 * t + 0.1);
setPixel(x, y, getColor(t / 5000));
if (t % 10000 == 0 && !resetScreen()) return;
}
}
}
16

Softwar e p entru gr ac a 2D
Program ul principal în care punem în execuµie clasa Curb eLissa jous
este:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
namespace GraphicExplorer
{
static class Program
{ [STAThread]
public static void Main()
{
Application.Run(new CurbeLissajous());
}
}}
În urma execut rii program ului se v a a³a:
Figura 2.1: Curb e Lissa jous
17

Softwar e p entru gr ac a 2D
2.2 Exemple de utilizare
V om evidenµia ecacitatea aplicaµiei prezen tate prin câtev a exemple. P en tru
început, iat  clasa care deseneaz  o serie de p en tagoane regulate incluse un ul
în altul:
public class Pentagrama : GraphicForm
{
static Complex i = new Complex(0, 1);
static double alfa = 2 * Math.PI / 5;
static Complex rot = Complex.setRoTheta(1, alfa);
// static Color col = Color.Red;
public static bool esteInStanga(Complex z, Complex a, Complex b)
{
if (((z – a) / (b – a)).Theta >= 0) return true;
return false;
}
//testare daca z este in triunghiul abc
public static bool esteInTriunghi(Complex z, Complex a,
Complex b, Complex c)
{
bool ab = esteInStanga(z, a, b);
bool bc = esteInStanga(z, b, c);
bool ca = esteInStanga(z, c, a);
return ab == bc && bc == ca;
}
public void umple3Gon(Complex a, Complex b, Complex c, Color col)
{
int i1 = getI(a.Re), i2 = getI(b.Re), i3 = getI(c.Re);
int j1 = getJ(a.Im), j2 = getJ(b.Im), j3 = getJ(c.Im);
int mini = (i1 < i2 ? i1 : i2);
mini = (mini < i3 ? mini : i3);
int maxi = (i1 > i2 ? i1 : i2);
maxi = (maxi > i3 ? maxi : i3);
int minj = (j1 < j2 ? j1 : j2);
minj = (minj < j3 ? minj : j3);
int maxj = (j1 > j2 ? j1 : j2);
maxj = (maxj > j3 ? maxj : j3);
for (int ii = mini; ii <= maxi; ii++)
for (int jj = minj; jj <= maxj; jj++)
{
Complex z = getZ(ii, jj);
18

Softwar e p entru gr ac a 2D
if (esteInTriunghi(z, a, b, c)) setPixel(ii, jj, col);
}
}
public void umple4Gon(Complex a, Complex b,
Complex c, Complex d, Color col)
{
umple3Gon(a, b, c, col);
umple3Gon(a, d, c, col);
}
void transformaPentagon(ref Complex a, ref Complex b, ref Complex c,
ref Complex d, ref Complex e, Color col)
{
Complex aa = (a + b) / 2;
Complex bb = (b + c) / 2;
Complex cc = (c + d) / 2;
Complex dd = (d + e) / 2;
Complex ee = (e + a) / 2;
Complex aaa = aa + ee – a;
Complex bbb = bb + aa – b;
Complex ccc = cc + bb – c;
Complex ddd = dd + cc – d;
Complex eee = ee + dd – e;
umple4Gon(a, aa, aaa, ee, col);
umple4Gon(b, bb, bbb, aa, col);
umple4Gon(c, cc, ccc, bb, col);
umple4Gon(d, dd, ddd, cc, col);
umple4Gon(e, ee, eee, dd, col);
a = aaa;
b = bbb;
c = ccc;
d = ddd;
e = eee;
}
public override void makeImage()
{
setXminXmaxYminYmax(-1, 1, -1, 1);
ScreenColor = Color.White;
Complex[] c = new Complex[10];
for (int k = 0; k < 5; k++)
{
c[k] = Complex.setRoTheta(1, k * alfa + alfa / 4);
}
19

Softwar e p entru gr ac a 2D
for (int k = 0; k < 10; k++)
{
transformaPentagon(ref c[0], ref c[1], ref c[2],
ref c[3], ref c[4], getColor(350 + 50 * k));
}
resetScreen();
}
}
În urma execut rii program ului se v a a³a:
Figura 2.2: class P en tagrama
În nal, un program care deseneaz  un fo c de articii:
public class Artificii : GraphicForm
{
Complex i = new Complex(0, 1);
Random zar = new Random();
void oMorisca(Complex q, Complex delta)
{
int N = zar.Next(25) + 25;
Complex omega = Complex.setRoTheta(1, 2 * Math.PI / N);
Complex omega0 = Complex.setRoTheta(0.99,
20

Softwar e p entru gr ac a 2D
(zar.NextDouble() – 0.5) / 5);
int kol = zar.Next(1000);
for (int k = 0; k < N; k++)
{
Complex delta0 = delta;
for (int h = 0; h < 300; h++)
{
setPixel(q + delta0, getColor(kol + h / 5));
delta0 *= omega0;
}
delta *= omega;
}
}
public override void makeImage()
{
setXminXmaxYminYmax(0, 1, 0, 1);
for (; ; )
{
Complex q = new Complex(zar.NextDouble(), zar.NextDouble());
Complex delta = new Complex((-0.5 + zar.NextDouble()) / 5,
(-0.5 + zar.NextDouble()) / 5);
oMorisca(q, delta);
if (!resetScreen()) break;
}
resetScreen();
}
}
În urma execut rii program ului se v a a³a:
21

Softwar e p entru gr ac a 2D
Figura 2.3: class Articii
22

Bibliograe
[1] Marius Ap etrii, Pr o gr amar e orientat  p e obie cte ,
http://www.math.uaic.ro/  mapetrii
[2] Microsoft Corp oration, C#L anguage Sp e cic ation , Microsoft Press,
Seattle, 2007.
[3] John Sharp, Micr osoft Visual C#2008 Step by Step 3r d Edition , Mi-
crosoft Press, Seattle, 2008.
23

Similar Posts