Elemente de programare orientata obiect
Concepte de baza ale programarii orientata pe obiecte

    S-au utilizat pe parcursul capitolelor anterioare diverse de tipuri de date. Pentru a utiliza o anumita variabila, in prealabil a trebuit precizat tipul variabilei, dupa care se putea trece la initializarea si utilizarea ei. Astfel pentru a utiliza o variabila de tip intreg i, am declarat int i; In momentul precizarii tipului variabilei (int), s-a precizat un concept general in care se incadreaza variabila cu alte cuvinte s-a precizat clasa de care apartine variabila. Clasele implementeaza tipuri de date. Am definit si am utilizat apoi variabile mai complexe prin intermediul structurilor de date. Structurile de date ne-au permis sa definim entitati complexe numite obiecte. Obiectele sunt componente software care modeleaza fenomene din lumea reala. Obiectele care reprezinta aceeasi idee sau concept sunt de acelasi tip si pot fi grupate în clase. Obiectele inglobeaza datele cat si procedurile care actioneaza asupra datelor. Dupa declararea unei variabile, se poate face initializarea ei.
    Astfel dupa declaratia int i; se poate face initializarea variabilei i astfel: i=0; . Identic se procedeaza si cu obiectele. Pentru a crea un obiect, se declarara clasa, apoi se face instantierea clasei. Un obiect este o instanta a unei clase.

  • Definirea conceptelor
        In capitolele anterioare au mai fost prezentate notiunile si conceptele utilizate in POO, acum insa suntem in masura sa definim complet conceptele utilizate in OOP.
    Programare orientata pe obiecte OOP

        Programarea orientata pe obiecte OOP ("Object Oriented Programming") este programararea care utilizeaza obiecte. OOP permite modelarea obiectelor, proprietatilor si a relatiilor dintre ele. OOP ofera posibilitatea descompunerii programului în componente deschizand calea reutilizarii codului.

  • Principiile OOP

  • Aplicatii OOP

        Aplicatiile OOP reusesc sa atinga un nivel ridicat de complexitate prin reutilizarea codului scris anterior. Odata definite clasele, acestea pot fi reutilizate in diverse aplicatii fara nici un fel de modificare sau adaptare. Problema cea mai complicata este definirea claselor astfel incat ele sa fie utile in diverse aplicatii.

    Clase realizate in C++

  • Definirea claselor

        Partea cea mai dificila o reprezinta realizarea claselor. Cu cat clasa este mai generala, cu atat ea va putea fi reutilizata de mai multe ori in diverse aplicatii. Vom realiza deci clasa "ap_electric" de forma:

    class ap_electric {
    	private:
    		double u_n;
    		double i_n;
    	public:
    		void set_u(double tens) {
    			if (tens < 0)
    				u_n=0;
    			else 
    				u_n=tens;
    		}
    
    		int vezi_u(){
    			return u_n;
    		}
    		void set_i(double crnt){
    			if (crnt < 0)
    				i_n=0;
    			else 
    				i_n=crnt;
    		}
    
    		double vezi_i() {
    			return i_n;
    		}
    
    		double vezi_p() {
    			return i_n*u_n;
    		}
    
    };
    

  • Crearea obiectelor:

         - In aplicatia finala, vom obiectul "a" prin instantierea clasei "ap_electric".
         - Valoarea curentului si a tensiunii au fost setate prin invocarea metodei "set_u" respectiv "set_i".
         - Valoarea puterii nominale a fost calculata prin invocarea metodei "vezi_p".

    #include "stdafx.h"
    #include < iostream >
    #include < string >
    using namespace std ;
    // definire clasa
    class ap_electric {
    	private:
    		double u_n;
    		double i_n;
    	public:
    		void set_u(double tens) {
    			if (tens < 0)
    				u_n=0;
    			else 
    				u_n=tens;
    		}
    
    		int vezi_u(){
    			return u_n;
    		}
    		void set_i(double crnt){
    			if (crnt < 0)
    				i_n=0;
    			else 
    				i_n=crnt;
    		}
    
    		double vezi_i() {
    			return i_n;
    		}
    
    		double vezi_p() {
    			return i_n*u_n;
    		}
    
    };
    int main(void)
    {
    	system("TITLE  Aplicatie oop");// Titlul ferestrei consola
    	system("COLOR F9"); // Fundal alb caractere albastre
    	ap_electric a;
    	double u,i;
    	cout <<"Introduceti tensiunea: ";
    	cin >> u;
    	cout <<"\nIntroduceti curentul: ";
    	cin >> i;
    	a.set_u(u);
    	a.set_i(i);
    	cout <<"\nPuterea este: "<< a.vezi_p();
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    

         In aplicatia de sus s-a creat obiectul "a" prin instantierea clasei "ap_electric".
         - Valoarea curentului si a tensiunii au fost setate prin invocarea metodei "set_u" respectiv "set_i".
         - Valoarea puterii nominale a fost calculata prin invocarea metodei "vezi_p".
         - Folosind metoda de sus obiectul "a" este creat in memoria statica.
         - Pentru a crea un obiect in memoria dinamica va trebui sa declaram "a" de tip pointer adica ap_electric* a; iar pentru crearea obiectului "a" sa folosim peratorul new operator, care face alocarea memoriei in mod dinamic.
         - Daca aparatul electric a fost definit sub forma: ap_electric* a , functia main va deveni:

    int main(void)
    {
    	ap_electric* a;
    	a=new ap_electric;
    	double u,i;
    	cout <<"Introduceti tensiunea: ";
    	cin >> u;
    	cout <<"\nIntroduceti curentul: ";
    	cin >> i;
    	a->set_u(u);
    	a->set_i(i);
    	cout <<"\nPuterea este: "<< a->vezi_p();
    	cin.ignore();
    	cin.get();
    	return 0;
    }


    Clase realizate in C#

        In aplicatiile anterioare am creat o clasa numita "ap_electric". Vom crea o aplicatie C# "Windows Forms Application" in care se va defini clasa "ap_electric". Aplicatia va clacula puterea consumata de un aparat electric prin instantierea clasei "ap_electric" si invocarea metodei vezi_p().
        Generam un nou proiect de tipul Windows Forms Application numit "oop_v0" .
    namespace oop_v0
    {
    
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                ap_electric a = new ap_electric();
    		    a.set_u(System.Convert.ToDouble(this.numericUpDown1.Value));
    		    a.set_i(System.Convert.ToDouble(this.numericUpDown2.Value));
    		    this.label1.Text=System.Convert.ToString(a.vezi_p());
            }
        }
        public class ap_electric
        {
            private double u_n;
            private double i_n;
            public  void set_u(double tens)
            {
                if (tens < 0)
                    u_n = 0;
                else
                    u_n = tens;
            }
             public double vezi_u()
            {
                return u_n;
            }
             public void set_i(double crnt)
            {
                if (crnt < 0)
                    i_n = 0;
                else
                    i_n = crnt;
            }
    
             public double vezi_i()
            {
                return i_n;
            }
    
             public double vezi_p()
            {
                return i_n * u_n;
            }
        }
    }
    





    Obiecte grafice realizate in C# Windows Forms Application

        La fel cum au fost create clase si obiecte in aplicatiile anterioare, vom realiza in continuare clase si obiecte grafice folosind C# Windows Forms Application. Aceste obiecte afiseaza elemente grafice pe form-ul deschis.

  • Realizarea unui obiect grafic sub forma a doua dreptunghiuri concentrice "drcon"

        Vom realiza in continuare o alicatie grafica in care este utilizat un obiect pe care il vom denumi "drc" obiect care este reprezentat grafic sub forma a doua dreptunghiuri concentrice, are numeroase metode printre care cea mai importanda este metoda "desenez" metoda cu care se afiseaza dreptunghiulexterior si metoda setdr cu care desenam un dreptunghi interior concentric de diverse dimensiuni.
        Generam un nou proiect de tipul Windows Forms Application numit "oop_00".
        Metoda "setdr" va fi invocata la intervale regulate de timp mentru a putea afisa dreptunghiul interior de dimensiuni variabile. Vom plasa deci un obiect de tip timer numit timer1 si setam proprietatea interval la 10 ms si Enabled la "true".
        Vom scrie in C# aplicatia "oop_00" care contine clasa "drcon".

    namespace oop_00
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public System.Drawing.Graphics desen;
            public System.Drawing.Pen creion_albastru;
            public System.Drawing.Pen creion_rosu;
            public System.Drawing.SolidBrush radiera;
            public drcon drc;
            System.Random nr;
            private void Form1_Load(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                creion_rosu = new System.Drawing.Pen(System.Drawing.Color.Red);
                radiera = new System.Drawing.SolidBrush(this.BackColor);
                nr = new System.Random();
                drc = new drcon();
                drc.init_dr(desen, 100, 50, 100, 75);
            }
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                drc.desenez(creion_albastru);
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                drc.sterg(radiera);
                drc.setdr(creion_rosu, nr.Next(100-3), nr.Next(75-3));
            }
        }
        public class drcon
        {
            int x0,y0,w0,h0;
            System.Drawing.Graphics zona_des;
            public void desenez(System.Drawing.Pen creion_a)
            {
                zona_des.DrawRectangle(creion_a, x0, y0, w0, h0);
            }
            public void sterg(System.Drawing.Brush rad)
            {
                zona_des.FillRectangle(rad, x0 + 1, y0 + 1, w0 - 1, h0 - 1);
            }
            public void setdr(System.Drawing.Pen creion,int w,int h)
            {
                int x = System.Convert.ToInt16(System.Convert.ToDouble(x0) + System.Convert.ToDouble(w0-w) / 2);
                int y = System.Convert.ToInt16(System.Convert.ToDouble(y0) + System.Convert.ToDouble(h0-h) / 2);
                zona_des.DrawRectangle(creion, x+1, y+1, w, h);
            }
            public void init_dr(System.Drawing.Graphics des,int pozx, int pozy, int lat, int inalt)
            {
                zona_des = des;
                x0 = pozx;
                y0 = pozy;
                w0 = lat;
                h0 = inalt;
            }
        }
    }
    



         Putem simplifica clasa "drcon" prin utilizarea unui constructor. Inacest caz numai este nevoie de metoda "init_dr"aceasta fiind inlocuita de constructorul:
    public drcon(System.Drawing.Graphics des, int pozx, int pozy, int lat, int inalt)
    In acest caz instantierea clase "drcon" se va face: drc = new drcon(desen, 100, 100, 100, 75);. Am renuntat de asemenea la metodele "desenez" si "sterg", acestea fiind preluate de metoda "setdr";

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    namespace oop_10
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public System.Drawing.Graphics desen;
            public System.Drawing.Pen creion_albastru;
            public System.Drawing.Pen creion_rosu;
            public System.Drawing.SolidBrush radiera;
            public drcon drc;
            System.Random nr;
            private void Form1_Load(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                creion_rosu = new System.Drawing.Pen(System.Drawing.Color.Red);
                radiera = new System.Drawing.SolidBrush(this.BackColor);
                nr = new System.Random();
                drc = new drcon(desen, 100, 100, 100, 75);
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                drc.setdr(creion_rosu, creion_albastru, radiera, nr.Next(100 - 3), nr.Next(75 - 3));
            }
            public class drcon
            {
                int x0, y0, w0, h0;
                System.Drawing.Graphics zona_des;
                public void setdr(System.Drawing.Pen creion, System.Drawing.Pen creion_a, System.Drawing.Brush rad, int w, int h)
                {
                    zona_des.FillRectangle(rad, x0 + 1, y0 + 1, w0 - 1, h0 - 1);
                    zona_des.DrawRectangle(creion_a, x0, y0, w0, h0);
                    int x = System.Convert.ToInt16(System.Convert.ToDouble(x0) + System.Convert.ToDouble(w0 - w) / 2);
                    int y = System.Convert.ToInt16(System.Convert.ToDouble(y0) + System.Convert.ToDouble(h0 - h) / 2);
                    zona_des.DrawRectangle(creion, x + 1, y + 1, w, h);
                }
                public drcon(System.Drawing.Graphics des, int pozx, int pozy, int lat, int inalt)
                {
                    zona_des = des;
                    x0 = pozx;
                    y0 = pozy;
                    w0 = lat;
                    h0 = inalt;
                }
            }
        }
    }
    


    C# Aplicatia "oop_01"

    - mai multe obiecte : dreptunghiuri concentrice

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    namespace oop_01
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public System.Drawing.Graphics desen;
            public System.Drawing.Pen creion_albastru;
            public System.Drawing.Pen creion_rosu;
            public System.Drawing.SolidBrush radiera;
            public drcon drc1;
            public drcon drc2;
            public drcon drc3;
            System.Random nr;
            private void Form1_Load(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                creion_rosu = new System.Drawing.Pen(System.Drawing.Color.Red);
                radiera = new System.Drawing.SolidBrush(this.BackColor);
                nr = new System.Random();
                drc1 = new drcon(desen, 100, 50, 100, 75);
                drc2 = new drcon(desen, 300, 50, 100, 175);
                drc3 = new drcon(desen, 130, 150, 50, 55);
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                drc1.setdr(creion_rosu, creion_albastru, radiera, nr.Next(100 - 3), nr.Next(75 - 3));
                drc2.setdr(creion_rosu, creion_albastru, radiera, nr.Next(100 - 3), nr.Next(175 - 3));
                drc3.setdr(creion_rosu, creion_albastru, radiera, nr.Next(50 - 3), nr.Next(55 - 3));
            }
        }
        public class drcon
        {
            int x0, y0, w0, h0;
            System.Drawing.Graphics zona_des;
            public void setdr(System.Drawing.Pen creion, System.Drawing.Pen creion_a, System.Drawing.Brush rad, int w, int h)
            {
                zona_des.FillRectangle(rad, x0 + 1, y0 + 1, w0 - 1, h0 - 1);
                zona_des.DrawRectangle(creion_a, x0, y0, w0, h0);
                int x = System.Convert.ToInt16(System.Convert.ToDouble(x0) + System.Convert.ToDouble(w0 - w) / 2);
                int y = System.Convert.ToInt16(System.Convert.ToDouble(y0) + System.Convert.ToDouble(h0 - h) / 2);
                zona_des.DrawRectangle(creion, x + 1, y + 1, w, h);
            }
            public drcon(System.Drawing.Graphics des, int pozx, int pozy, int lat, int inalt)
            {
                zona_des = des;
                x0 = pozx;
                y0 = pozy;
                w0 = lat;
                h0 = inalt;
            }
        }
    }
    




    C# Aplicatia "oop_02"

    - obiect : cercuri concentrice

    namespace oop_02
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public System.Drawing.Graphics desen;
            public System.Drawing.Pen creion_albastru;
            public System.Drawing.Pen creion_rosu;
            public System.Drawing.SolidBrush radiera;
            public ccon cc;
            System.Random nr;
            private void Form1_Load(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                creion_rosu = new System.Drawing.Pen(System.Drawing.Color.Red);
                radiera = new System.Drawing.SolidBrush(this.BackColor);
                nr = new System.Random();
                cc = new ccon();
                cc.init_c(desen, 100, 100, 100);
            }
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                cc.desenez(creion_albastru);
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                cc.sterg(radiera);
                cc.setc(creion_rosu, nr.Next(100 - 3));
                cc.setc(creion_albastru, nr.Next(100 - 3));
                cc.setc(creion_rosu, nr.Next(100 - 3));
            }
        }
        public class ccon
        {
            int x0, y0, r0;
            System.Drawing.Graphics zona_des; 
            public void desenez(System.Drawing.Pen creion_a)
            {
                zona_des.DrawEllipse(creion_a, x0, y0, r0+2, r0+2);
            }
            public void sterg(System.Drawing.Brush rad)
            {
                zona_des.FillEllipse(rad, x0 + 1, y0 + 1, r0 - 1, r0 - 1);
            }
            public void setc(System.Drawing.Pen creion, int r)
            {
                int x = System.Convert.ToInt16(System.Convert.ToDouble(x0) + System.Convert.ToDouble(r0 - r) / 2);
                int y = System.Convert.ToInt16(System.Convert.ToDouble(y0) + System.Convert.ToDouble(r0 - r) / 2);
                zona_des.DrawEllipse(creion, x + 1, y + 1, r, r);
            }
            public void init_c(System.Drawing.Graphics des, int pozx, int pozy, int raza)
            {
                zona_des = des;
                x0 = pozx;
                y0 = pozy;
                r0 = raza;
            }
        }
    }
    




    C# Aplicatia "oop_03"

    - mai multe obiecte : cercuri concentrice

    namespace oop_03
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public System.Drawing.Graphics desen;
            public System.Drawing.Pen creion_albastru;
            public System.Drawing.Pen creion_rosu;
            public System.Drawing.SolidBrush radiera;
            public ccon cc1;
            public ccon cc2;
            public ccon cc3;
            System.Random nr;
            private void Form1_Load(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                creion_rosu = new System.Drawing.Pen(System.Drawing.Color.Red);
                radiera = new System.Drawing.SolidBrush(this.BackColor);
                nr = new System.Random();
                cc1 = new ccon();
                cc1.init_c(desen, 10, 10, 100);
                cc2 = new ccon();
                cc2.init_c(desen, 250, 20, 200);
                cc3 = new ccon();
                cc3.init_c(desen, 10, 200, 50);
            }
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                cc1.desenez(creion_albastru);
                cc2.desenez(creion_albastru);
                cc3.desenez(creion_albastru);
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                cc1.sterg(radiera);
                cc1.setc(creion_rosu, nr.Next(100 - 3));
                cc1.setc(creion_albastru, nr.Next(100 - 3));
                cc1.setc(creion_rosu, nr.Next(100 - 3));
                cc2.sterg(radiera);
                cc2.setc(creion_rosu, nr.Next(200 - 3));
                cc2.setc(creion_albastru, nr.Next(200 - 3));
                cc2.setc(creion_rosu, nr.Next(200 - 3));
                cc3.sterg(radiera);
                cc3.setc(creion_rosu, nr.Next(50 - 3));
                cc3.setc(creion_albastru, nr.Next(50 - 3));
                cc3.setc(creion_rosu, nr.Next(50 - 3));
            }
        }
        public class ccon
        {
            int x0, y0, r0;
            System.Drawing.Graphics zona_des; 
            public void desenez(System.Drawing.Pen creion_a)
            {
                zona_des.DrawEllipse(creion_a, x0, y0, r0 + 2, r0 + 2);
            }
            public void sterg(System.Drawing.Brush rad)
            {
                zona_des.FillEllipse(rad, x0 + 1, y0 + 1, r0 - 1, r0 - 1);
            }
            public void setc(System.Drawing.Pen creion, int r)
            {
                int x = System.Convert.ToInt16(System.Convert.ToDouble(x0) + System.Convert.ToDouble(r0 - r) / 2);
                int y = System.Convert.ToInt16(System.Convert.ToDouble(y0) + System.Convert.ToDouble(r0 - r) / 2);
                zona_des.DrawEllipse(creion, x + 1, y + 1, r, r);
            }
            public void init_c(System.Drawing.Graphics des, int pozx, int pozy, int raza)
            {
                zona_des = des;
                x0 = pozx;
                y0 = pozy;
                r0 = raza;
            }
        }
    }
    




    C# Aplicatia "ceas"

    Vom raliza in continuare clasa numita ceas dupa care vom instantia clasa ceas si vom plasa mai multe obiecte "ceas":

    namespace oop_09
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            System.Drawing.Graphics desen;
            System.Drawing.SolidBrush pens_back;
            public ceas ceas1;
            public ceas ceas2;
            public ceas ceas3;
            private void Form1_Load(object sender, EventArgs e)
            {
                pens_back = new System.Drawing.SolidBrush(this.BackColor);
                desen = this.CreateGraphics();
                ceas1 = new ceas(desen, 50, 10, 150);
                ceas2 = new ceas(desen, 10, 125, 300);
                ceas3 = new ceas(desen, 200, 50, 200);
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                ceas1.setval(pens_back);
                ceas2.setval(pens_back);
                ceas3.setval(pens_back);
            }
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                ceas1.des_ceas(pens_back);
                ceas2.des_ceas(pens_back);
                ceas3.des_ceas(pens_back);
            }
        }
        public class ceas
        {
            System.Drawing.Graphics zona_des; 
            int x0;
            int y0;
            int w;
            public void des_ceas(System.Drawing.SolidBrush radiera)
            {
                int x = x0 + w / 5;
                int y = y0 + w / 5;
                int d = w / 2;
                int x1 = x + d / 2;
                int y1 = y + d / 2;
                double g;
                System.Drawing.Pen c_min = new System.Drawing.Pen(System.Drawing.Color.Blue);
                System.Drawing.Pen c_5min = new System.Drawing.Pen(System.Drawing.Color.Red);
                zona_des.DrawEllipse(c_5min, x, y, d, d);
                for (g = 0; g < 360; g += 6)
                {
                    double r = 2 * System.Math.PI * g / 360;
                    int x2 = Convert.ToInt16(x1 + (d / 2) * System.Math.Cos(r));
                    int y2 = Convert.ToInt16(y1 - (d / 2) * System.Math.Sin(r));
                    zona_des.DrawLine(c_min, x1, y1, x2, y2);
                    if (g % 30 == 0)
                        zona_des.DrawLine(c_5min, x1, y1, x2, y2);
                    else
                        zona_des.DrawLine(c_min, x1, y1, x2, y2);
                }
                zona_des.FillEllipse(radiera, x + 5, y + 5, d - 10, d - 10);
            }
            public void setval(System.Drawing.SolidBrush radiera)
            {
                System.Drawing.Pen c_sec = new System.Drawing.Pen(System.Drawing.Color.Purple);
                System.Drawing.Pen c_min = new System.Drawing.Pen(System.Drawing.Color.Blue);
                System.Drawing.Pen c_ore = new System.Drawing.Pen(System.Drawing.Color.Red);
                int x = x0 + w / 5;
                int y = y0 + w / 5;
                int d = w / 2;
                int x1 = x + d / 2;
                int y1 = y + d / 2;
                int i, x3, y3;
                double r;
                //secundar
                i = 90 - 6 * System.DateTime.Now.Second;
                r = (2 * System.Math.PI * i) / 360;
                x3 = Convert.ToInt16(x1 + (d / 2 - 6) * System.Math.Cos(r));
                y3 = Convert.ToInt16(y1 - (d / 2 - 6) * System.Math.Sin(r));
                zona_des.FillEllipse(radiera, x + 5, y + 5, d - 10, d - 10);
                zona_des.DrawLine(c_sec, x1, y1, x3, y3);
                //minutar
                i = 90 - 6 * System.DateTime.Now.Minute;
                r = (2 * System.Math.PI * i) / 360;
                x3 = Convert.ToInt16(x1 + (d / 2 - 10) * System.Math.Cos(r));
                y3 = Convert.ToInt16(y1 - (d / 2 - 10) * System.Math.Sin(r));
                zona_des.DrawLine(c_min, x1, y1, x3, y3);
                //ora
                i = 90 - (30 * System.Convert.ToInt16(System.DateTime.Now.Hour) + System.Convert.ToInt16(System.DateTime.Now.Minute) / 2);
                r = (2 * System.Math.PI * i) / 360;
                x3 = Convert.ToInt16(x1 + (d / 2 - 15) * System.Math.Cos(r));
                y3 = Convert.ToInt16(y1 - (d / 2 - 15) * System.Math.Sin(r));
                zona_des.DrawLine(c_ore, x1, y1, x3, y3);
                zona_des.DrawEllipse(c_ore, x1 - 2, y1 - 2, 4, 4);
            }
            public ceas(System.Drawing.Graphics des, int pozx, int pozy, int lat)
            {
                zona_des = des;
                x0 = pozx;
                y0 = pozy;
                w = lat;
            }
        }
    }
    




    Obiecte cu parametrii tablouri

    C# Aplicatia "Oop_instr_10"

    - Afisaj grafic x-t

    namespace Oop_instr_10
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public System.Drawing.Graphics desen;
            public afisor_xt instr;
            System.Random nr;
            int np = 35;
            int v_max = 300;
            static double[] valori = new double[0];
            private void Form1_Load(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                nr = new System.Random();
                instr = new afisor_xt(desen,10, 10, np, 200, v_max);
            }
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                instr.desenez(Color.Blue);
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                int nr_max, val_max;
                nr_max = np;
                val_max = v_max;
                instr.sterg(Color.White);
                Array.Resize(ref valori, nr_max + 1);
                 for(int i=1;i<=nr_max;i++){
                     valori[i]=nr.Next(val_max);
                 }
                 instr.setval(Color.Red, valori);
            }
        }
        public class afisor_xt
        {
            System.Drawing.Graphics zona_des;
            int x0;
            int y0;
            int w;
            int h;
            double val_max;
            int nrv;
            public void desenez(Color culoare_contur)
            {
                zona_des.DrawRectangle(new Pen(culoare_contur), x0 - 1, y0 - 1, w + 2, h + 2);
            }
            public void sterg(Color culoare_fundal)
            {
                zona_des.FillRectangle(new SolidBrush(culoare_fundal), x0 + 1, y0 + 1, w - 2, h - 2);
            }
            public void setval(Color cul, double[] vals)
            {
                float val_v, val;
                val_v = 0;
                for (int i = 1; i < nrv; i++)
                {
                    val = System.Convert.ToInt16(System.Convert.ToDouble(vals[i]) * (System.Convert.ToDouble(h) / System.Convert.ToDouble(val_max))); //scalare
                    zona_des.DrawLine(new Pen(cul), x0 + (i - 1) * 10, y0 + h - val_v, x0 + i * 10, y0 + h - val);
                    val_v = val;
                }
            }
            public afisor_xt(System.Drawing.Graphics desen, int pozx, int pozy, int nr_valori, int inaltime, double vmax)
            {
                zona_des = desen;
                x0 = pozx;
                y0 = pozy;
                w = nr_valori * 10;
                h = inaltime;
                nrv = nr_valori;
                val_max = vmax;
                desenez(Color.Blue);
            }
        }
    }
    




    - In mod normal aceste valori ar trebui afisate sub forma de histograma.

    Aplicatia "Oop_instr_10_h" foloseste clasa histo pentru a afisa valorile generata random sub forma de histograma.

    namespace Oop_instr_10_h
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public System.Drawing.Graphics desen;
            System.Random nr;
            int np = 35;
            int v_max = 300;
            double[] valori;
            public histo h1;
            private void Form1_Load(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                nr = new System.Random();
                valori = new double[np];
                h1 = new histo(desen, 10, 10, np, 250, 0, v_max);
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                for (int i = 0; i < np; i++)
                {
                    valori[i] = nr.Next(v_max);
                }
                h1.setval(valori, Color.Lime, Color.Black);
            }
        }
        public class histo
        {
            System.Drawing.Graphics zona_des;
            System.Drawing.SolidBrush rad = new System.Drawing.SolidBrush(Color.Black);
            int x0;
            int y0;
            int w;
            int h;
            double val_max, val_min;
            int nrv;
            public void setval(double[] vals, Color culoare_afisare, Color culoare_fundal)
            {
                System.Drawing.Pen creion = new System.Drawing.Pen(culoare_afisare, 4);
                System.Drawing.SolidBrush rad = new System.Drawing.SolidBrush(culoare_fundal);
                int val;
                // sterg
                zona_des.FillRectangle(rad, x0 + 1, y0 + 1, w + 10, h + 2);
                //desenez
                double factor_s = System.Convert.ToDouble(h) / (val_max - val_min); // factor de scala
                for (int i = 0; i < nrv; i++)
                {
                    val = System.Convert.ToInt16((vals[i] - val_min) * factor_s); //scalare
                    zona_des.DrawLine(creion, x0 + (i + 1) * 10, y0 + h + Convert.ToInt16(val_min * factor_s), x0 + (i + 1) * 10, y0 + h - val);
                }
            }
            public histo(System.Drawing.Graphics desen, int pozx, int pozy, int nr_valori, int inaltime, double vmin, double vmax)
            {
                nrv = nr_valori;
                zona_des = desen;
                x0 = pozx;
                y0 = pozy;
                w = nr_valori * 10;
                h = inaltime;
                val_max = vmax;
                val_min = vmin;
            }
        }
    }
    




    - Daca am dori sa afisam graficul diverselor functii ar trebui sa realizam o noua clasa pentru afisare in coordonate x-t care sa afiseza cate o valoare la distanta de un pixel.

    Aplicatia "Oop_instr_11" foloseste clasa afis_xt pentru a afisa functia sin(x).

    namespace Oop_instr_11
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public System.Drawing.Graphics desen;
            public afis_xt instr;
            int nr_p = 400;// numarul de puncte afisate
            int val_max = 200;
            double[] valori;
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
    
                desen = this.CreateGraphics();
                instr = new afis_xt(desen, 10, 10, nr_p, val_max, val_max);
                valori = new double[nr_p];
                double alfa = 0;
                for (int i = 0; i < nr_p; i++)
                {
                    valori[i] = System.Convert.ToUInt16(val_max / 6 + ((val_max / 3) * (1 - Math.Sin(alfa))));
                    alfa += 0.07;
                }
                instr.sterg(Color.Black);
                instr.setval(Color.Lime, valori, nr_p);
            }
        }
        public class afis_xt
        {
            public System.Drawing.Graphics zona_des;
            public System.Drawing.Pen c_contur = new System.Drawing.Pen(System.Drawing.Color.Tomato, 2);
            int x0;
            int y0;
            int w;
            int h;
            double val_max;
    
            public void sterg(Color culoare_fundal)
            {
                zona_des.FillRectangle(new SolidBrush(culoare_fundal), x0 + 2, y0 + 2, w - 2, h - 2);
            }
    
            public void setval(Color culoare_grafic, double[] vals, int nrv)
            {
                int val_v, val;
                val_v = 0;
                for (int i = 0; i < nrv; i++)
                {
                    val = System.Convert.ToInt16(System.Convert.ToDouble(vals[i]) * (System.Convert.ToDouble(h) / System.Convert.ToDouble(val_max))); //scalare
                    zona_des.DrawLine(new Pen(culoare_grafic), x0 + (i - 1), y0 + val_v, x0 + i, y0 + val);
                    val_v = val;
                }
                zona_des.DrawRectangle(c_contur, x0 + 1, y0 + 1, w, h);
            }
            public afis_xt(System.Drawing.Graphics desen, int pozx, int pozy, int nr_valori, int inaltime, double vmax)
            {
                zona_des = desen;
                x0 = pozx;
                y0 = pozy;
                w = nr_valori;
                h = inaltime;
                val_max = vmax;
            }
        }
    }
    






    C# Aplicatia "Oop_instr_30"

    - Afisaj grafic x-y

    namespace Oop_instr_30
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public System.Drawing.Graphics desen;
            int  x0,y0,val_maxx, val_maxy,w,h,nr_max;
            System.Random nr;
            static double[] valorix = new double[0];
            static double[] valoriy = new double[0];
            public afisor_xy instr;
            private void Form1_Load(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                nr = new System.Random();
                nr_max = 10;
                val_maxx = 300;
                val_maxy = 500;
                x0 = 200;
                y0 = 20;
                w = 200;
                h = 175;
                instr = new afisor_xy(desen,x0, y0, w, h, val_maxx,val_maxy);
            }
    
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                instr.desenez(Color.Blue);
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                instr.sterg(Color.White);
                Array.Resize(ref valorix, nr_max + 1);
                Array.Resize(ref valoriy, nr_max + 1);
                for (int i = 1; i <= nr_max; i++)
                {
                    valorix[i] = nr.Next(System.Convert.ToInt32(val_maxx));
                    valoriy[i] = nr.Next(System.Convert.ToInt32(val_maxy));
                }
                instr.setval(Color.Red, valorix, valoriy, nr_max);
            }
        }
        public class afisor_xy
        {
            System.Drawing.Graphics zona_des;
            int x0, y0, w, h, val_maxx, val_maxy;
            public void desenez(Color culoare_contur)
            {
                zona_des.DrawRectangle(new Pen(culoare_contur), x0 - 1, y0 - 1, w + 2, h + 2);
            }
            public void sterg(Color culoare_fundal)
            {
                zona_des.FillRectangle(new SolidBrush(culoare_fundal), x0, y0, w + 1, h + 1);
            }
            public void setval(Color culoare_grafic, double[] valsx, double[] valsy, int nrv)
            {
                int val_vx, valx, val_vy, valy;
                val_vx = System.Convert.ToInt16(System.Convert.ToDouble(valsx[0]) * (System.Convert.ToDouble(w) / System.Convert.ToDouble(val_maxx)));
                val_vy = System.Convert.ToInt16(System.Convert.ToDouble(valsy[0]) * (System.Convert.ToDouble(h) / System.Convert.ToDouble(val_maxy)));
                for (int i = 0; i < nrv; i++)
                {
                    valx = System.Convert.ToInt16(System.Convert.ToDouble(valsx[i]) * (System.Convert.ToDouble(w) / System.Convert.ToDouble(val_maxx))); //scalare
                    valy = System.Convert.ToInt16(System.Convert.ToDouble(valsy[i]) * (System.Convert.ToDouble(h) / System.Convert.ToDouble(val_maxy))); //scalare
                    zona_des.DrawLine(new Pen(culoare_grafic), x0 + val_vx, y0 + val_vy, x0 + valx, y0 + valy);
                    val_vx = valx;
                    val_vy = valy;
                }
            }
            public afisor_xy(System.Drawing.Graphics desen, int pozx, int pozy, int lat, int inalt, int vmaxx, int vmaxy)
            {
                zona_des = desen;
                x0 = pozx;
                y0 = pozy;
                w = lat;
                h = inalt;
                val_maxx = vmaxx;
                val_maxy = vmaxy;
            }
        }
    }
    




    C# Aplicatia "Oop_instr_31"

    - Afisaj grafic x-y functia sin(i) cos(k*i)

    namespace Oop_instr_31
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public System.Drawing.Graphics desen;
            int x0, y0, val_maxx, val_maxy, w, h,nr_max;
            System.Random nr;
            static double[] valorix = new double[0];
            static double[] valoriy = new double[0];
            public afisor_xy instr;
            
            private void Form1_Load(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                nr = new System.Random();
                nr_max = 500;
                val_maxx = 100;
                val_maxy = 100;
                x0 = 10;
                y0 = 10;
                w = 200;
                h = 200;
                instr = new afisor_xy(desen, x0, y0, w, h, val_maxx, val_maxy);
            }
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                instr.desenez(Color.Blue);
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                instr.sterg(Color.White);
                Array.Resize(ref valorix, nr_max + 1);
                Array.Resize(ref valoriy, nr_max + 1);
    
                int k = System.Convert.ToInt32(nr.Next(15));
                double f = 10;
                //double f = nr.Next(100);
                // Lisajou
                //int k = 7;
                //double f = 0.01*nr.Next(10);
                for (int i = 1; i <= nr_max; i++)
                {
                    //valorix[i] = System.Convert.ToInt32(val_maxx));
                    valorix[i] = System.Convert.ToInt32(50*(1-Math.Sin(f*i)));
                    
                    valoriy[i] = System.Convert.ToInt32(50*(1-Math.Cos(f*k * i)));
                }
                instr.setval(Color.Red, valorix, valoriy, nr_max);
            }
        }
        public class afisor_xy
        {
            System.Drawing.Graphics zona_des;
            int x0, y0, w, h, val_maxx, val_maxy;
            public void desenez(Color culoare_contur)
            {
                zona_des.DrawRectangle(new Pen(culoare_contur), x0 - 1, y0 - 1, w + 2, h + 2);
            }
            public void sterg(Color culoare_fundal)
            {
                zona_des.FillRectangle(new SolidBrush(culoare_fundal), x0, y0, w + 1, h + 1);
            }
            public void setval(Color culoare_grafic, double[] valsx, double[] valsy, int nrv)
            {
                int val_vx, valx, val_vy, valy;
                val_vx = System.Convert.ToInt16(System.Convert.ToDouble(valsx[0]) * (System.Convert.ToDouble(w) / System.Convert.ToDouble(val_maxx)));
                val_vy = System.Convert.ToInt16(System.Convert.ToDouble(valsy[0]) * (System.Convert.ToDouble(h) / System.Convert.ToDouble(val_maxy)));
                for (int i = 0; i < nrv; i++)
                {
                    valx = System.Convert.ToInt16(System.Convert.ToDouble(valsx[i]) * (System.Convert.ToDouble(w) / System.Convert.ToDouble(val_maxx))); //scalare
                    valy = System.Convert.ToInt16(System.Convert.ToDouble(valsy[i]) * (System.Convert.ToDouble(h) / System.Convert.ToDouble(val_maxy))); //scalare
                    zona_des.DrawLine(new Pen(culoare_grafic), x0 + val_vx, y0 + val_vy, x0 + valx, y0 + valy);
                    val_vx = valx;
                    val_vy = valy;
                }
            }
            public afisor_xy(System.Drawing.Graphics desen, int pozx, int pozy, int lat, int inalt, int vmaxx, int vmaxy)
            {
                zona_des = desen;
                x0 = pozx;
                y0 = pozy;
                w = lat;
                h = inalt;
                val_maxx = vmaxx;
                val_maxy = vmaxy;
            }
        }
    }
    




    C# Aplicatia "Oop_instr_32"

    - mai multe obiecte : Afisaj grafic x-y

    namespace Oop_instr_32
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public System.Drawing.Graphics desen;
            int x0, y0, val_maxx, val_maxy, w, h,nr_max;
            System.Random nr;
            static double[] valorix = new double[0];
            static double[] valoriy = new double[0];
            public afisor_xy instr1,instr2,instr3;
            private void Form1_Load(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                nr = new System.Random();
                nr_max = 500;
                val_maxx = 100;
                val_maxy = 100;
                x0 = 10;
                y0 = 10;
                w = 200;
                h = 200;
                instr1 = new afisor_xy(desen,x0, y0, w, h, val_maxx, val_maxy);
                instr2 = new afisor_xy(desen, 400, 100, 150, 170, val_maxx, val_maxy);
                instr3 = new afisor_xy(desen,250, 120, 120, 120, val_maxx, val_maxy);
            }
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                instr1.desenez(Color.Blue);
                instr2.desenez(Color.Blue);
                instr3.desenez(Color.Blue);
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                int i, k;
                Array.Resize(ref valorix, nr_max + 1);
                Array.Resize(ref valoriy, nr_max + 1);
                double f = 10;
                k = System.Convert.ToInt32(1 + nr.Next(15));
                for (i = 1; i <= nr_max; i++)
                {
                    valorix[i] = System.Convert.ToInt32(50 * (1 - Math.Sin(f * i)));
                    valoriy[i] = System.Convert.ToInt32(50 * (1 - Math.Cos(f * k * i)));
                }
                instr1.sterg(Color.White);
                instr1.setval(Color.Red, valorix, valoriy,nr_max);
                k = System.Convert.ToInt32(1 + nr.Next(15));
                for (i = 1; i <= nr_max; i++)
                {
                    valorix[i] = System.Convert.ToInt32(50 * (1 - Math.Sin(f * i)));
                    valoriy[i] = System.Convert.ToInt32(50 * (1 - Math.Cos(f * k * i)));
                }
                instr2.sterg(Color.White);
                instr2.setval(Color.Red, valorix, valoriy, nr_max);
                k = System.Convert.ToInt32(1 + nr.Next(15));
                for (i = 1; i <= nr_max; i++)
                {
                    valorix[i] = System.Convert.ToInt32(50 * (1 - Math.Sin(f * i)));
                    valoriy[i] = System.Convert.ToInt32(50 * (1 - Math.Cos(f * k * i)));
                }
                instr3.sterg(Color.White);
                instr3.setval(Color.Red, valorix, valoriy, nr_max);
            }
        }
        public class afisor_xy
        {
            System.Drawing.Graphics zona_des;
            int x0, y0, w, h, val_maxx, val_maxy;
            public void desenez(Color culoare_contur)
            {
                zona_des.DrawRectangle(new Pen(culoare_contur), x0 - 1, y0 - 1, w + 2, h + 2);
            }
            public void sterg(Color culoare_fundal)
            {
                zona_des.FillRectangle(new SolidBrush(culoare_fundal), x0, y0, w + 1, h + 1);
            }
            public void setval(Color culoare_grafic, double[] valsx, double[] valsy, int nrv)
            {
                int val_vx, valx, val_vy, valy;
                val_vx = System.Convert.ToInt16(System.Convert.ToDouble(valsx[0]) * (System.Convert.ToDouble(w) / System.Convert.ToDouble(val_maxx)));
                val_vy = System.Convert.ToInt16(System.Convert.ToDouble(valsy[0]) * (System.Convert.ToDouble(h) / System.Convert.ToDouble(val_maxy)));
                for (int i = 0; i < nrv; i++)
                {
                    valx = System.Convert.ToInt16(System.Convert.ToDouble(valsx[i]) * (System.Convert.ToDouble(w) / System.Convert.ToDouble(val_maxx))); //scalare
                    valy = System.Convert.ToInt16(System.Convert.ToDouble(valsy[i]) * (System.Convert.ToDouble(h) / System.Convert.ToDouble(val_maxy))); //scalare
                    zona_des.DrawLine(new Pen(culoare_grafic), x0 + val_vx, y0 + val_vy, x0 + valx, y0 + valy);
                    val_vx = valx;
                    val_vy = valy;
                }
            }
            public afisor_xy(System.Drawing.Graphics desen, int pozx, int pozy, int lat, int inalt, int vmaxx, int vmaxy)
            {
                zona_des = desen;
                x0 = pozx;
                y0 = pozy;
                w = lat;
                h = inalt;
                val_maxx = vmaxx;
                val_maxy = vmaxy;
            }
        }
    }
    




    Tablouri de obiecte

        Clasele create anterior se instantia de cate ori dorim obtinandu-se unul sau mai multe obiecte. Se pot crea chiar tablouri de obiecte in vederea gestionarii mai usoare a acestora. In continuare vom crea noi obiecte si vom crea tablouri cu aceste obiecte.

  • Realizarea unui obiect grafic-dreptungi "dr"

        Vom realiza in continuare o alicatie grafica in care este utilizat un obiect pe care il vom denumi "dr" obiect care este reprezentat grafic sub forma unui dreptunghi, are numeroase metode printre care cea mai importanda este metoda "deplasez" metoda cu care dreptunghiul se afiseaza in alta pozitie. Folosind aceasta metoda vom putea realiza o aplicatie in care vom simula miscarea unui dreptunhi la apasarea unui buton.
        Generam un nou proiect de tipul Windows Forms Application numit "oop_v30" in care vom simula deplasarea dreptunghiului la apasarea unui buton.

    namespace oop_v30
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public System.Drawing.Graphics desen;
            public dr d;
            private void button1_Click(object sender, EventArgs e)
            {        
                d.deplasez();
                d.desenez(desen);
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                d = new dr();
            }
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                d.desenez(desen);
            }
        }
        public class dr
        {
            float pozX;
            float pozY;
            float vX;
            float w;
            System.Drawing.Pen creion_a;
            System.Random nr;
            public void desenez(System.Drawing.Graphics zona_des)
            {
                zona_des.Clear(System.Drawing.Color.White);
                zona_des.DrawRectangle(creion_a, pozX, pozY, w, w);
            }
    
            public void deplasez()
            {
                pozX += vX;
                if (pozX > 440 - w)
                {
                    vX = -vX;
                    w = nr.Next(40) + 2;
                    pozX = 440 - w;
                }
                if (pozX < 0)
                {
                    vX = -vX;
                    w = nr.Next(40) + 2;
                    pozX = 0;
                }
            }
            public dr()
            {
                nr = new System.Random();
                //pozX = nr.Next(400);
                //pozY = nr.Next(300);
                //vX = nr.Next(10) + 1;
                pozX = 10;
                pozY = 100;
                vX = 27;
                w = nr.Next(30)+10;
                creion_a = new System.Drawing.Pen(System.Drawing.Color.Blue);
            }
        }
    }
    



        Dupa cum se obbserva clasa "dr" are o serie de functii membru cum ar fi:

    C# Aplicatia "oop_v31"

    - deplasarea dreptunghiului la intervale prestabilite

    namespace oop_v31
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public System.Drawing.Graphics desen;
            public System.Drawing.Pen creion_a;
            public dr d;
            private void Form1_Load(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                creion_a = new System.Drawing.Pen(System.Drawing.Color.Blue);
                d = new dr();
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                desen.Clear(System.Drawing.Color.White);
                d.deplasez();
                d.desenez(desen, creion_a);
            }
        }
        public class dr
        {
            int pozX,pozY,vX,w;
            System.Random nr;
            public void desenez(System.Drawing.Graphics zona_des, System.Drawing.Pen creion)
            {
                zona_des.DrawRectangle(creion, pozX, pozY, w, w);
            }
            public void deplasez()
            {
                pozX += vX;
                if (pozX > 440 - w)
                {
                    vX = -vX;
                    w = nr.Next(40) + 2;
                    pozX = 440 - w;
                }
                if (pozX < 0)
                {
                    vX = -vX;
                    w = nr.Next(40) + 2;
                    pozX = 0;
                }
            }
            public dr()
            {
                nr = new System.Random();
                pozX = nr.Next(400);
                pozY = nr.Next(200);
                vX = nr.Next(50) + 1;
                w = nr.Next(40);
            }
        }
    }
    


  • Utilizarea clasei grafice "dr" pentru a afisa mai multe dreptunghiuri

        Vom modifica aplicatia anterioara "oop_v31" realizand o noua aplicatie Windows Forms Application numit "oop_v4" .
        Noua aplicatie difera de prima prin faptul ca vom genera mai multe dreptungiuri care se vor deplasa pe form-ul curent.

    namespace oop_v4
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            System.Drawing.Graphics desen;
            dr[] drr;
            int nr_c, i;
            void sterg_desen()
            {
                desen.Clear(this.BackColor);
            }
            void creare_drr()
            {
                nr_c = 20;
                drr = new dr[nr_c];
                for (i = 0; i < nr_c; i++)
                {
                    drr[i] = new dr(i, this.Width - 50, this.Height - 80);
                }
            }
            void trasez_drr()
            {
                for (i = 0; i < nr_c; i++)
                    drr[i].desenez(desen, this.Width - 20, this.Height - 45);
            }
            void depl_drr()
            {
                for (i = 0; i < nr_c; i++)
                    drr[i].deplasez(this.Width - 20, this.Height - 45);
            }
            private void Form1_Activated(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                creare_drr();
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                sterg_desen();
                trasez_drr();
                depl_drr();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                creare_drr();
    
            }
            private void trackBar1_Scroll(object sender, EventArgs e)
            {
                this.timer1.Interval = this.trackBar1.Value;
            }
    
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                desen = this.CreateGraphics();
                creare_drr();
            }
        }
        public class dr
        {
            public Int32 pozX, pozY, vX, vY, accX, accY, raza;
            public System.Drawing.Pen creion_a;
    
            public int desenez(System.Drawing.Graphics zona_des, int lung, int lat)
            {
                zona_des.DrawRectangle(creion_a, pozX, pozY, raza, raza);
                return 1;
            }
            public void deplasez(int lung, int lat)
            {
                System.Random nr = new System.Random();
                pozX += vX;
                if ((pozX > lung - raza - 40) || (pozX < 0))
                {
                    raza = 10 + nr.Next(40);
                    vX = -vX;
                }
            }
            public dr(int r, int lung, int lat)
            {
                System.Random nr = new System.Random(r);
                pozX = 5 + nr.Next(lung - 50);
                pozY = 50 + nr.Next(lat - 70);
                vX = 10 + nr.Next(20);
                raza = 10 + nr.Next(40);
                creion_a = new System.Drawing.Pen(System.Drawing.Color.Blue);
            }
        }
    }
    


        Se observa ca de data aceasta am creat un tablou de obiecte cu declaratia "drr = new dr[nr_c]" si a trebuit sa scriem functii noi care sa creeze, deplaseze si initializeza un tablou de obiecte de tip "dr". Functiile scrise vor invoca metode ale ale clase "dr".
        Dupa activarea form-ului curent trebuie sa creem tabloul de obiectele "drr" si obiectul "desen". Vom completa procedura deschisa pe eveniment "activated" al form-ului cu:

                desen = this.CreateGraphics();
                creare_drr();
    

        Completam procedura deschisa pe eveniment tick al obiectului timer1 cu:

                sterg_desen();
                trasez_drr();
                depl_drr();

        Rulam aplicatia si obtinem o serie de dreptungiuri care se deplaseaza cu diverse viteze, schimbandu-si directia la marginile form-ului.



  • Realizarea unui obiect grafic-"cerc"

        Asemanator cu aplicatiile anterioare, vom realiza in continuare o alicatie grafica in care este utilizat un obiect pe care il vom denumi "cerc" obiect care este reprezentat grafic sub forma unui cerc. Metoda "deplasez", este mai complexa de data aceasta, fiind scrisa in vederea simularii deplasarii unei mingi care cade intr-o camera si se reflecta din pardoseala sau din peretii laterali.
        Generam un nou proiect de tipul Windows Forms Application numit "oop_v1" .
        Metoda "deplasez" va fi invocata la intervale regulate de timp mentru a putea simula miscarea unei mingi. Vom plasa deci un obiect de tip timer numit timer1 si setam proprietatea interval la 10 ms si Enabled la "true".
        Sariturile mingii vor fi amortizate. Pentru a "arunca" din nou mingea vom plasa un obiect de tip button numit button1. Actionand acest buton, mingea va porni iar din starea initiala.

    C# Aplicatia "oop_v1"

    namespace oop_v1
    {
        public partial class Form1 : Form
        {
            System.Drawing.Graphics desen;
            cerc c;      
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Activated(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
    		    c = new cerc(this.Width-50,this.Height-80);
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                desen.Clear(this.BackColor);
    		    c.desenez(desen);
                c.deplasez(this.Width - 20, this.Height - 45);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                c = new cerc(this.Width - 50, this.Height - 80);
            }
        }
        public class cerc {
    	public float pozX, pozY, vX, vY, accX, accY, raza;
    	public System.Drawing.Pen creion_a;
    	public int desenez (System.Drawing.Graphics zona_des)
    	{
    		zona_des.DrawEllipse(creion_a,pozX,pozY,raza,raza);
    		return 1;
    	}
    	public void deplasez (int lung,int lat)
    	{
    		pozX += vX;
    		pozY += vY;
    		vX = vX + accX;
    		vY = vY + accY;
    		vY -= vY/100;
    		if((pozX>lung-raza)||(pozX<0))
    		{
    			vX = -vX;
    		}
    		if((pozY>lat-raza)||(pozY<0))
    		{
    			vY = -vY;
    		}
    	}
    	public cerc (int lung,int lat)
    	{
    		System.Random nr = new System.Random();
    		pozX = nr.Next(lung);
    		pozY = nr.Next(lat);
    		//vX = nr.Next(5);
    		//vY = nr.Next(1);
            vX = 2;
            vY = 1;
    		accX = 1/2;
            accY = 1;
    		//raza = 10+nr.Next(50);
            raza = 35;
    		creion_a =new System.Drawing.Pen(System.Drawing.Color.Blue);
    	}
      }
    }
    


        Rulam aplicatia si obtinem un cerc care se deplaseazaza imitand sariturile unei mingi intr-o camera.


        Dupa cum se obbserva clasa "cerc" are o serie de functii membru cum ar fi:     Pentru simplitate, zona de desenare a fost fixata la 400 X 300 si raza maxima 40. Aplicatia poate fi generalizata pentru dimensiunile curente ale form-ului curent.
        Miscarea mingii (desenarea cercului pe o noua pozitie se va face pe fiecare eveniment tick al obiectului timer1.
        Vom completa deci procedura deschisa pe eveniment tick al obiectului timer1 cu:

            desen.Clear(this.BackColor);
            c.desenez(desen);
            c.deplasez();
    

        Sariturile mingii vor fi amortizate. Pentru a "arunca" din nou mingea vom actiona butonul "Arunca", astfel mingea va porni iar din starea initiala.
        Procedura deschisa pe eveniment click al obiectului button1 e completata cu:

            c.init_cerc(1);
    


  • Utilizarea clasei grafice "cerc" pentru a afisa mai multe cercuri care se deplaseaza

        Vom modifica aplicatia anterioara "oop_v1" realizand o noua aplicatie Windows Forms Application numit "oop_v2" .
        Noua aplicatie difera de prima prin faptul ca vom genera mai multe cercuri care se vor deplasa pe form-ul curent imitand sariturile mai multor mingi aruncate intr-o camera.

    C# Aplicatia "oop_v2"

    namespace oop_v2
    {
        public partial class Form1 : Form
        {
            System.Drawing.Graphics desen;
            cerc[] cercuri;
            int nr_c, i;
            void sterg_desen()
            {
                desen.Clear(this.BackColor);
            }
            void creare_cercuri()
            {
                nr_c = 20;
                cercuri = new cerc[nr_c];
                for (i = 0; i < nr_c; i++)
                {      
                    cercuri[i] = new cerc(i,this.Width-50,this.Height-80);
                }
            }
            void trasez_cercuri()
            {
                for (i = 0; i < nr_c; i++)
                    cercuri[i].desenez(desen,this.Width-20,this.Height-45);
            }
            void depl_cercuri()
            {
                for (i = 0; i < nr_c; i++)
                    cercuri[i].deplasez(this.Width-20, this.Height-45);
            }
            public Form1()
            {
                InitializeComponent();
            }
            private void Form1_Activated(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                creare_cercuri();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                creare_cercuri();
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                sterg_desen();
    		    trasez_cercuri();
    		    depl_cercuri();
            }
            private void trackBar1_Scroll(object sender, EventArgs e)
            {
                this.timer1.Interval = this.trackBar1.Value;
            }
        }
        public class cerc
        {
            public float pozX, pozY, vX, vY, accX, accY, raza;
            public System.Drawing.Pen creion_a;
            public int desenez(System.Drawing.Graphics zona_des,int lung,int lat)
            {
                zona_des.DrawEllipse(creion_a, pozX, pozY, raza, raza);
                return 1;
            }
            public void deplasez(int lung,int lat)
            {
                pozX += vX;
                pozY += vY;
                vX = vX + accX;
                vY = vY + accY;
                vY -= vY / 100;
                if ((pozX > lung - raza) || (pozX < 0))
                {
                    vX = -vX;
                }
                if ((pozY > lat - raza) || (pozY < 0))
                {
                    vY = -vY;
                }
            }
            public cerc(int r,int lung,int lat)
            {
                System.Random nr = new System.Random(r);
                pozX = nr.Next(lung);
                pozY = nr.Next(lat);
                //vX = nr.Next(5);
                //vY = nr.Next(1);
                vX = 3;
                vY = 1;
                accX = 1 / 2;
                accY = 1;
                raza = 10+nr.Next(40);
                creion_a = new System.Drawing.Pen(System.Drawing.Color.Blue);
            }
        }
    }
    

        Se observa ca de data aceasta am creat un tablou de obiecte cu declaratia "cercuri = new cerc[nr_c];" si a trebuit sa sctiem functii noi care sa creeze, deplaseze si initializeze un tablou de obiecte de tip "cerc". Functiile scrise invoca metode ale ale clasei "cercuri".
        Dupa activarea form-ului curent trebuie sa creem tabloul de obiectele "cercuri" si obiectul "desen". Vom completa procedura deschisa pe eveniment "activated" al form-ului cu:

    		desen = this.CreateGraphics();
    		creare_cercuri();
    

        Completam procedura deschisa pe eveniment tick al obiectului timer1 cu:

     		sterg_desen();
    		trasez_cercuri();
    		depl_cercuri();
    

        Completam procedura deschisa pe eveniment click al obiectului button1 cu:

    		creare_cercuri();
    

        Rulam aplicatia si obtinem o serie de cercuri care se deplaseaza si imita sariturile mai multor mingi aruncate intr-o camera.