classdef prostokat

    properties

        a; %Długość podstawy

        b; %Wysokość

        x; %Punkt x przekatnej

        y; %Punkt y przekatnej

        R=0; %Czerwony

        G=0; %Zielony

        B=0; %Niebieski

        Rk=0; %Czerwony, krawedz

        Gk=0; %Zielony, krawedz

        Bk=0; %Niebieski, krawedz

        P;   %Pole

        O;   %Obwod

        alfa; %Kąt pomiędzy bokiem a a osią x

        grubosc_linii;

        kolor=[0,0,0];

        kolor_krawedzi=[0,0,0];

    end

    

    properties(Constant = true)

        xmin= -20;

        ymin= -20;

        xmax= 20;

        ymax= 20;

    end

    

    methods

        function obj=prostokat(varargin)

            switch nargin

                case 4

                    if((isa(varargin{3},'double'))&&(isa(varargin{4},'double'))&&(isa(varargin{1},'double'))&&(isa(varargin{2},'double')))

                        if(varargin{1}>=0)&&(varargin{2}>=0)

                            obj.a = varargin{1};

                            obj.b = varargin{2};

                            obj.x = varargin{3};

                            obj.y = varargin{4}; 

                            obj.kolor = rand(1,3);

                            obj.kolor_krawedzi = rand(1,3);


                        end

                    end

                    if((isa(varargin{3},'char'))||(isa(varargin{4},'char'))||(isa(varargin{1},'char'))||(isa(varargin{2},'char')))

                        error('Zmienne a, b, x, y nie moze byc typu znakowego')

                    end

                    if((varargin{1}<=0)||(varargin{2}<=0))

                        error('Boki nie moga miec ujemnej badz zerowej wartosci')     

                    end

                    

                case 2

                    if((isa(varargin{1},'double'))&&(isa(varargin{2},'double')))

                        if(varargin{1}>=0)&&(varargin{2}>=0)

                            obj.a=varargin{1};

                            obj.b=varargin{2};

                            obj.x=rand*10;

                            obj.y=rand*10;

                            obj.kolor=rand(1,3);

                            obj.kolor_krawedzi=rand(1,3);

                        end

                    end

                    if((isa(varargin{1},'char'))||(isa(varargin{2},'char')))

                        error('Zmienne a, b nie moze byc typu znakowego')

                    end

                    if((varargin{1}<=0)||(varargin{2}<=0))

                        error('Boki nie moga miec ujemnej badz zerowej wartosci')     

                    end

                    

                case 0

                    obj.a=rand*100;

                    obj.b=rand*100;

                    obj.x=rand*10;

                    obj.y=rand*10;

                    obj.kolor=rand(1,3);

                    obj.kolor_krawedzi=rand(1,3);


                case 5

                    if((isa(varargin{3},'double'))&&(isa(varargin{4},'double'))&&(isa(varargin{1},'double'))&&(isa(varargin{2},'double')))

                        if(varargin{1}>=0)&&(varargin{2}>=0)

                            obj.kolor=varargin{5};

                            if((1>=obj.R)&&(obj.R>=0)&&(obj.G>=obj.G)&&(obj.G>=0)&&(1>=obj.B)&&(obj.B>=0)) 

                                obj.a=varargin{1};

                                obj.b=varargin{2};

                                obj.x=varargin{3};

                                obj.y=varargin{4};

                                obj.kolor=varargin{5};

                                obj.kolor_krawedzi=rand(1,3);

                            end

                        end

                    end

                    if((isa(varargin{3},'char'))||(isa(varargin{4},'char'))||(isa(varargin{1},'char'))||(isa(varargin{2},'char')))

                        error('Zmienne a, b, x, y nie moze byc typu znakowego')

                    end

                    if((varargin{1}<=0)||(varargin{2}<=0))

                        error('Boki nie moga miec ujemnej badz zerowej wartosci')     

                    end

                    if((1<obj.R)&&(obj.R<0)&&(1<obj.G)&&(obj.G<0)&&(1<obj.B)&&(obj.B<0))

                        error('Kolor {R, G, B} musi być podany w przedzialach od 0 do 1')

                    end

                case 6

                    if((isa(varargin{3},'double'))&&(isa(varargin{4},'double'))&&(isa(varargin{1},'double'))&&(isa(varargin{2},'double')))

                        if(varargin{1}>=0)&&(varargin{2}>=0)

                            obj.kolor=varargin{5};

                            if((1>=obj.R)&&(obj.R>=0)&&(1>=obj.G)&&(obj.G>=0)&&(1>=obj.B)&&(obj.B>=0))

                                obj.kolor_krawedzi=varargin{6};

                                if((1>=obj.Rk)&&(obj.Rk>=0)&&(1>=obj.Gk)&&(obj.Gk>=0)&&(1>=obj.Bk)&&(obj.Bk>=0))

                                    obj.a=varargin{1};

                                    obj.b=varargin{2};

                                    obj.x=varargin{3};

                                    obj.y=varargin{4};

                                    obj.kolor=varargin{5};

                                    obj.kolor_krawedzi=varargin{6};

                                end

                            end

                        end

                    end

                    if((isa(varargin{3},'char'))||(isa(varargin{4},'char'))||(isa(varargin{1},'char'))||(isa(varargin{2},'char')))

                        error('Zmienne a, b, x, y nie moze byc typu znakowego')

                    end

                    if((varargin{1}<=0)||(varargin{2}<=0))

                        error('Boki nie moga miec ujemnej badz zerowej wartosci')     

                    end

                    if((1<obj.R)&&(obj.R<0)&&(1<obj.G)&&(obj.G<0)&&(1<obj.B)&&(obj.B<0))

                        error('Kolor {R, G, B} musi być podany w przedzialach od 0 do 1')

                    end

                    if((1<obj.Rk)&&(obj.Rk<0)&&(1<obj.Gk)&&(obj.Gk<0)&&(1<obj.Bk)&&(obj.Bk<0))

                        error('Kolor krawedzi {Rk, Gk, Bk} musi być podany w przedzialach od 0 do 1')

                    end

                    

                otherwise

                    error('Prosze podac 0, 2, 4, 5, lub 6 argumentow wejsciowych')

            end

            

        end

        

        function obj=display(obj)

            lancuch=sprintf('Obiekt klasy prostokat, o bokach a=%4.2f, b=%4.2f, środku w punkcie (%4.2f, %4.2f)',obj.a, obj.b, obj.x, obj.y);

            disp(lancuch);

        end

        

        function obw=get.O(obj)

            obw=(2*obj.a)+(2*obj.b);

        end

        

        function pol=get.P(obj)

            pol=obj.a*obj.b;

        end

        

        function obj=set.O(obj,~)

            disp('Nie mozna zmienic wartosci obwodu obiektu');

        end

        

        function obj=set.P(obj,wartosc)

            disp('Nie mozna zmienic wartosci pola obiektu');

        end

        

        function obj=set.a(obj,wartosc)

            if(wartosc<=0)

               disp('Wartosc boku nie moze byc ujemna'); 

            else

               obj.a=wartosc;

            end

        end 

        

        function obj = plus(obj1,obj2)

                obj.a = obj1.a + obj2.a;

                obj.b = obj1.b + obj2.b;

                obj.x = (obj1.x + obj2.x)/2;

                obj.y = (obj1.y + obj2.y)/2;

                obj.kolor = (obj1.kolor + obj2.kolor)/2;

                obj.kolor_krawedzi = (obj1.kolor_krawedzi + obj2.kolor_krawedzi)/2;

                

                obj = prostokat(obj.a, obj.b, obj.x, obj.y, obj.kolor, obj.kolor_krawedzi);

        end

                

        function rysuj(obj)

            x1 = obj.x - (obj.a/2);

            x2 = obj.x + (obj.a/2);

            x3 = x1;

            x4 = x2;

            X = [x1, x2, x4, x3];

            

            y1 = obj.y - (obj.b/2);

            y2 = y1;

            y3 = obj.y + (obj.b/2);

            y4 = y3;

            Y = [y1, y2, y4, y3];

            

            fill(X, Y, obj.kolor);

            hold on;

            X = [x1, x2, x4, x3, x1];

            Y = [y1, y2, y4, y3, y1];

            

            plot(X, Y, 'Color', obj.kolor_krawedzi, 'LineWidth', 2);

        end    

    end

        

    methods(Static = true)

        function wyjscie = zmianaStatyczna(dane)

            persistent zmienna;

            if nargin>0

                zmienna = dane;

            end

            wyjscie = zmienna;

        end   

    end   

end