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 = (xmax xmin )=(imax imin );
dydj = (ymax ymin )=(jmax jmin );
didx = (imax imin )=(xmax xmin );
djdy = (jmax jmin )=(ymax ymin );
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 + (x xmin )didx);
j= (int)(jmin + (y ymin )djdy);
iar trecerea in v ers de form ulele:
x= (double )(xmin + (xmin + (i imin )dxdi);
y= (double )(ymin + (ymin + (j jmin )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
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Universit a tea Alexandr u Io an Cuza din Ia³i [602301] (ID: 602301)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
