public void MU2c5pTest()
		{
			double[,] matrExpected = new double[5, 2];
			matrExpected[0,0] = 0.99362303;
			matrExpected[0,1] = 0.00637697;
			matrExpected[1,0] = 0.00113771;
			matrExpected[1,1] = 0.99886229;
			matrExpected[2,0] = 0.00093486;
			matrExpected[2,1] = 0.99906514;
			matrExpected[3,0] = 0.99770535;
			matrExpected[3,1] = 0.00229465;
			matrExpected[4,0] = 0.98516935;
			matrExpected[4,1] = 0.01483065;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[5];
			PointRGB[] c = new PointRGB[2];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
		public void MU2c6pTest()
		{
			double[,] matrExpected = new double[6, 2];
			matrExpected[0,0] = 0.00833090;
			matrExpected[0,1] = 0.99166910;
			matrExpected[1,0] = 0.98813468;
			matrExpected[1,1] = 0.01186532;
			matrExpected[2,0] = 0.99991329;
			matrExpected[2,1] = 0.00008671;
			matrExpected[3,0] = 0.00256154;
			matrExpected[3,1] = 0.99743846;
			matrExpected[4,0] = 0.01959954;
			matrExpected[4,1] = 0.98040046;
			matrExpected[5,0] = 0.98262987;
			matrExpected[5,1] = 0.01737013;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[6];
			PointRGB[] c = new PointRGB[2];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
        public PointRGB[] generateRandomPoints(int count)
        {
            PointRGB[] points = new PointRGB[count];

            for (int i = 0; i < count; i++)
            {
                PointRGB p = new PointRGB(rand.Next(20, 235), rand.Next(20, 235), rand.Next(20, 235));
                points[i] = p;
            }

            return points;
        }
        public double[,] distributeOverMatrixU(PointRGB[] arr, PointRGB[] centers, double m)
        {

            MatrixU = fillUMatrix(arr.Length, centers.Length);
     
            double previousDecisionValue = 0;
            double currentDecisionValue = 1;
            double sum;

            int pointsCount = arr.Length;
            int clustersCount = centers.Length;

            for (int a = 0; a < max_cycles_count && (Math.Abs(previousDecisionValue - currentDecisionValue) > e); a++)
            {
                previousDecisionValue = currentDecisionValue;
                centers = calculateCenters(MatrixU, m, arr);

                for (int i = 0; i < pointsCount; i++)
                {
                    for (int j = 0; j < clustersCount; j++)
                    {
                        double distance = evklidDistance3D(arr[i], centers[j]);
                        MatrixU[i, j] = Math.Pow(1 / distance, 2 / (m - 1));

                    }

                    sum = 0;

                    for (int j = 0; j < clustersCount; j++)
                    {
                        sum += MatrixU[i, j];
                    }

                    for (int j = 0; j < clustersCount; j++)
                    {
                        MatrixU[i, j] = MatrixU[i, j] / sum;
                    }

                }

                currentDecisionValue = calculateDecisionFunction(arr, centers, MatrixU);               
            }
            newCenters = centers;
            return MatrixU;
        }
		public void MU3c10pTest()
		{
			double[,] matrExpected = new double[10, 3];
			matrExpected[0,0] = 0.00207611;
			matrExpected[0,1] = 0.00211681;
			matrExpected[0,2] = 0.99580708;
			matrExpected[1,0] = 0.04862492;
			matrExpected[1,1] = 0.86031170;
			matrExpected[1,2] = 0.09106338;
			matrExpected[2,0] = 0.00279667;
			matrExpected[2,1] = 0.99480518;
			matrExpected[2,2] = 0.00239814;
			matrExpected[3,0] = 0.00302810;
			matrExpected[3,1] = 0.00455935;
			matrExpected[3,2] = 0.99241255;
			matrExpected[4,0] = 0.01634000;
			matrExpected[4,1] = 0.02473899;
			matrExpected[4,2] = 0.95892102;
			matrExpected[5,0] = 0.10414700;
			matrExpected[5,1] = 0.87619866;
			matrExpected[5,2] = 0.01965435;
			matrExpected[6,0] = 0.00237029;
			matrExpected[6,1] = 0.99606029;
			matrExpected[6,2] = 0.00156942;
			matrExpected[7,0] = 0.15594909;
			matrExpected[7,1] = 0.80011012;
			matrExpected[7,2] = 0.04394078;
			matrExpected[8,0] = 0.02205131;
			matrExpected[8,1] = 0.01168445;
			matrExpected[8,2] = 0.96626424;
			matrExpected[9,0] = 0.99983770;
			matrExpected[9,1] = 0.00010124;
			matrExpected[9,2] = 0.00006106;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[10];
			PointRGB[] c = new PointRGB[3];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			c[2] = new PointRGB(20, 25, 68);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			p[6] = new PointRGB(59, 153, 112);
			p[7] = new PointRGB(38, 121, 43);
			p[8] = new PointRGB(193, 144, 149);
			p[9] = new PointRGB(160, 45, 120);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
		public void MU3c9pTest()
		{
			double[,] matrExpected = new double[9, 3];
			matrExpected[0,0] = 0.00392690;
			matrExpected[0,1] = 0.00067333;
			matrExpected[0,2] = 0.99539977;
			matrExpected[1,0] = 0.97633035;
			matrExpected[1,1] = 0.01134808;
			matrExpected[1,2] = 0.01232157;
			matrExpected[2,0] = 0.99971304;
			matrExpected[2,1] = 0.00022717;
			matrExpected[2,2] = 0.00005979;
			matrExpected[3,0] = 0.00669097;
			matrExpected[3,1] = 0.00152497;
			matrExpected[3,2] = 0.99178406;
			matrExpected[4,0] = 0.02290245;
			matrExpected[4,1] = 0.01418927;
			matrExpected[4,2] = 0.96290828;
			matrExpected[5,0] = 0.90399009;
			matrExpected[5,1] = 0.07025695;
			matrExpected[5,2] = 0.02575295;
			matrExpected[6,0] = 0.18064114;
			matrExpected[6,1] = 0.81296270;
			matrExpected[6,2] = 0.00639616;
			matrExpected[7,0] = 0.00367131;
			matrExpected[7,1] = 0.99562017;
			matrExpected[7,2] = 0.00070852;
			matrExpected[8,0] = 0.01868184;
			matrExpected[8,1] = 0.00418239;
			matrExpected[8,2] = 0.97713577;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[9];
			PointRGB[] c = new PointRGB[3];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			c[2] = new PointRGB(20, 25, 68);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			p[6] = new PointRGB(59, 153, 112);
			p[7] = new PointRGB(38, 121, 43);
			p[8] = new PointRGB(193, 144, 149);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
 public double evklidDistance3D(PointRGB pointA, PointRGB pointB)
 {
     double distance1 = Math.Pow((pointA.R - pointB.R),2);
     double distance2 = Math.Pow((pointA.G - pointB.G),2);
     double distance3 = Math.Pow((pointA.B - pointB.B),2);
     double distance = distance1 + distance2 + distance3;
     return Math.Sqrt(distance);
 }
		public void MU4c10pTest()
		{
			double[,] matrExpected = new double[10, 4];
			matrExpected[0,0] = 0.00387958;
			matrExpected[0,1] = 0.00215156;
			matrExpected[0,2] = 0.00067191;
			matrExpected[0,3] = 0.99329695;
			matrExpected[1,0] = 0.97685574;
			matrExpected[1,1] = 0.00464232;
			matrExpected[1,2] = 0.00887049;
			matrExpected[1,3] = 0.00963144;
			matrExpected[2,0] = 0.99961964;
			matrExpected[2,1] = 0.00006380;
			matrExpected[2,2] = 0.00025060;
			matrExpected[2,3] = 0.00006596;
			matrExpected[3,0] = 0.00672350;
			matrExpected[3,1] = 0.00272701;
			matrExpected[3,2] = 0.00152073;
			matrExpected[3,3] = 0.98902876;
			matrExpected[4,0] = 0.02216181;
			matrExpected[4,1] = 0.01461795;
			matrExpected[4,2] = 0.01398775;
			matrExpected[4,3] = 0.94923249;
			matrExpected[5,0] = 0.78676442;
			matrExpected[5,1] = 0.10765810;
			matrExpected[5,2] = 0.07725820;
			matrExpected[5,3] = 0.02831929;
			matrExpected[6,0] = 0.16933353;
			matrExpected[6,1] = 0.00768052;
			matrExpected[6,2] = 0.81656147;
			matrExpected[6,3] = 0.00642447;
			matrExpected[7,0] = 0.00347393;
			matrExpected[7,1] = 0.00199645;
			matrExpected[7,2] = 0.99382238;
			matrExpected[7,3] = 0.00070724;
			matrExpected[8,0] = 0.01741314;
			matrExpected[8,1] = 0.02373964;
			matrExpected[8,2] = 0.00408662;
			matrExpected[8,3] = 0.95476060;
			matrExpected[9,0] = 0.00000049;
			matrExpected[9,1] = 0.99999885;
			matrExpected[9,2] = 0.00000032;
			matrExpected[9,3] = 0.00000033;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[10];
			PointRGB[] c = new PointRGB[4];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			c[2] = new PointRGB(20, 25, 68);
			c[3] = new PointRGB(125, 100, 30);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			p[6] = new PointRGB(59, 153, 112);
			p[7] = new PointRGB(38, 121, 43);
			p[8] = new PointRGB(193, 144, 149);
			p[9] = new PointRGB(160, 45, 120);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
		public void MU4c9pTest()
		{
			double[,] matrExpected = new double[9, 4];
			matrExpected[0,0] = 0.99379413;
			matrExpected[0,1] = 0.00312986;
			matrExpected[0,2] = 0.00268497;
			matrExpected[0,3] = 0.00039104;
			matrExpected[1,0] = 0.00076141;
			matrExpected[1,1] = 0.99446683;
			matrExpected[1,2] = 0.00445659;
			matrExpected[1,3] = 0.00031518;
			matrExpected[2,0] = 0.00149362;
			matrExpected[2,1] = 0.82210063;
			matrExpected[2,2] = 0.17460307;
			matrExpected[2,3] = 0.00180267;
			matrExpected[3,0] = 0.98836640;
			matrExpected[3,1] = 0.00610111;
			matrExpected[3,2] = 0.00462978;
			matrExpected[3,3] = 0.00090270;
			matrExpected[4,0] = 0.94361224;
			matrExpected[4,1] = 0.01690011;
			matrExpected[4,2] = 0.03066885;
			matrExpected[4,3] = 0.00881880;
			matrExpected[5,0] = 0.00524505;
			matrExpected[5,1] = 0.03630806;
			matrExpected[5,2] = 0.95317084;
			matrExpected[5,3] = 0.00527605;
			matrExpected[6,0] = 0.00286831;
			matrExpected[6,1] = 0.03732810;
			matrExpected[6,2] = 0.92023653;
			matrExpected[6,3] = 0.03956705;
			matrExpected[7,0] = 0.00000000;
			matrExpected[7,1] = 0.00000000;
			matrExpected[7,2] = 0.00000000;
			matrExpected[7,3] = NaN;
			matrExpected[8,0] = 0.96625578;
			matrExpected[8,1] = 0.01144212;
			matrExpected[8,2] = 0.01987430;
			matrExpected[8,3] = 0.00242780;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[9];
			PointRGB[] c = new PointRGB[4];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			c[2] = new PointRGB(20, 25, 68);
			c[3] = new PointRGB(125, 100, 30);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			p[6] = new PointRGB(59, 153, 112);
			p[7] = new PointRGB(38, 121, 43);
			p[8] = new PointRGB(193, 144, 149);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
		public void MU4c7pTest()
		{
			double[,] matrExpected = new double[7, 4];
			matrExpected[0,0] = 0.00052071;
			matrExpected[0,1] = 0.00239649;
			matrExpected[0,2] = 0.00047349;
			matrExpected[0,3] = 0.99660931;
			matrExpected[1,0] = 0.99999726;
			matrExpected[1,1] = 0.00000011;
			matrExpected[1,2] = 0.00000237;
			matrExpected[1,3] = 0.00000026;
			matrExpected[2,0] = 0.11996475;
			matrExpected[2,1] = 0.00113877;
			matrExpected[2,2] = 0.87730344;
			matrExpected[2,3] = 0.00159304;
			matrExpected[3,0] = 0.00043015;
			matrExpected[3,1] = 0.00405054;
			matrExpected[3,2] = 0.00032687;
			matrExpected[3,3] = 0.99519244;
			matrExpected[4,0] = 0.00000000;
			matrExpected[4,1] = 0.99999991;
			matrExpected[4,2] = 0.00000001;
			matrExpected[4,3] = 0.00000007;
			matrExpected[5,0] = 0.02377465;
			matrExpected[5,1] = 0.00445635;
			matrExpected[5,2] = 0.96650308;
			matrExpected[5,3] = 0.00526593;
			matrExpected[6,0] = 0.01743612;
			matrExpected[6,1] = 0.00326714;
			matrExpected[6,2] = 0.97720220;
			matrExpected[6,3] = 0.00209454;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[7];
			PointRGB[] c = new PointRGB[4];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			c[2] = new PointRGB(20, 25, 68);
			c[3] = new PointRGB(125, 100, 30);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			p[6] = new PointRGB(59, 153, 112);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
		public void MU2c10pTest()
		{
			double[,] matrExpected = new double[10, 2];
			matrExpected[0,0] = 0.99778699;
			matrExpected[0,1] = 0.00221301;
			matrExpected[1,0] = 0.15251194;
			matrExpected[1,1] = 0.84748806;
			matrExpected[2,0] = 0.00825304;
			matrExpected[2,1] = 0.99174696;
			matrExpected[3,0] = 0.99309844;
			matrExpected[3,1] = 0.00690156;
			matrExpected[4,0] = 0.96967201;
			matrExpected[4,1] = 0.03032799;
			matrExpected[5,0] = 0.00649101;
			matrExpected[5,1] = 0.99350899;
			matrExpected[6,0] = 0.00444359;
			matrExpected[6,1] = 0.99555641;
			matrExpected[7,0] = 0.04919440;
			matrExpected[7,1] = 0.95080560;
			matrExpected[8,0] = 0.99102517;
			matrExpected[8,1] = 0.00897483;
			matrExpected[9,0] = 0.29283491;
			matrExpected[9,1] = 0.70716509;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[10];
			PointRGB[] c = new PointRGB[2];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			p[6] = new PointRGB(59, 153, 112);
			p[7] = new PointRGB(38, 121, 43);
			p[8] = new PointRGB(193, 144, 149);
			p[9] = new PointRGB(160, 45, 120);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
		public void MU2c9pTest()
		{
			double[,] matrExpected = new double[9, 2];
			matrExpected[0,0] = 0.00205013;
			matrExpected[0,1] = 0.99794987;
			matrExpected[1,0] = 0.89007612;
			matrExpected[1,1] = 0.10992388;
			matrExpected[2,0] = 0.99641480;
			matrExpected[2,1] = 0.00358520;
			matrExpected[3,0] = 0.00442415;
			matrExpected[3,1] = 0.99557585;
			matrExpected[4,0] = 0.02523080;
			matrExpected[4,1] = 0.97476920;
			matrExpected[5,0] = 0.97843406;
			matrExpected[5,1] = 0.02156594;
			matrExpected[6,0] = 0.99877772;
			matrExpected[6,1] = 0.00122228;
			matrExpected[7,0] = 0.95357115;
			matrExpected[7,1] = 0.04642885;
			matrExpected[8,0] = 0.01179832;
			matrExpected[8,1] = 0.98820168;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[9];
			PointRGB[] c = new PointRGB[2];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			p[6] = new PointRGB(59, 153, 112);
			p[7] = new PointRGB(38, 121, 43);
			p[8] = new PointRGB(193, 144, 149);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
		public void MU2c8pTest()
		{
			double[,] matrExpected = new double[8, 2];
			matrExpected[0,0] = 0.00432479;
			matrExpected[0,1] = 0.99567521;
			matrExpected[1,0] = 0.90018885;
			matrExpected[1,1] = 0.09981115;
			matrExpected[2,0] = 0.99705224;
			matrExpected[2,1] = 0.00294776;
			matrExpected[3,0] = 0.00159266;
			matrExpected[3,1] = 0.99840734;
			matrExpected[4,0] = 0.01994903;
			matrExpected[4,1] = 0.98005097;
			matrExpected[5,0] = 0.98469110;
			matrExpected[5,1] = 0.01530890;
			matrExpected[6,0] = 0.99895262;
			matrExpected[6,1] = 0.00104738;
			matrExpected[7,0] = 0.95934073;
			matrExpected[7,1] = 0.04065927;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[8];
			PointRGB[] c = new PointRGB[2];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			p[6] = new PointRGB(59, 153, 112);
			p[7] = new PointRGB(38, 121, 43);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
        private PointRGB[] calculateCenters(double[,] MatrixU, double m, PointRGB[] points)
        {
            PointRGB[] MatrixCentroids = new PointRGB[MatrixU.GetLength(0)];
            int pointsCount = MatrixU.GetLength(0);
            int clustersCount = MatrixU.GetLength(1);

            for (int clusterIndex = 0; clusterIndex < clustersCount; clusterIndex++)
            {
                double tempAr = 0;
                double tempBr = 0;
                double tempAg = 0;
                double tempBg = 0;
                double tempAb = 0;
                double tempBb = 0;

                for (int j = 0; j < pointsCount; j++)
                {
                    tempAr += Math.Pow(MatrixU[j, clusterIndex], m);
                    tempBr += Math.Pow(MatrixU[j, clusterIndex], m) * points[j].R;

                    tempAg += Math.Pow(MatrixU[j, clusterIndex], m);
                    tempBg += Math.Pow(MatrixU[j, clusterIndex], m) * points[j].G;

                    tempAb += Math.Pow(MatrixU[j, clusterIndex], m);
                    tempBb += Math.Pow(MatrixU[j, clusterIndex], m) * points[j].B;
                }

                MatrixCentroids[clusterIndex] = new PointRGB((int)(tempBr / tempAr), (int)(tempBg / tempAg), (int)(tempBb / tempAb));
            }

            return MatrixCentroids;
        }
		public void MU4c5pTest()
		{
			double[,] matrExpected = new double[5, 4];
			matrExpected[0,0] = 0.00000001;
			matrExpected[0,1] = 0.00000006;
			matrExpected[0,2] = 0.99999845;
			matrExpected[0,3] = 0.00000148;
			matrExpected[1,0] = 0.99668012;
			matrExpected[1,1] = 0.00056964;
			matrExpected[1,2] = 0.00165252;
			matrExpected[1,3] = 0.00109771;
			matrExpected[2,0] = 0.99750703;
			matrExpected[2,1] = 0.00064009;
			matrExpected[2,2] = 0.00118449;
			matrExpected[2,3] = 0.00066839;
			matrExpected[3,0] = 0.00000001;
			matrExpected[3,1] = 0.00000008;
			matrExpected[3,2] = 0.00000119;
			matrExpected[3,3] = 0.99999873;
			matrExpected[4,0] = 0.00000001;
			matrExpected[4,1] = 0.99999986;
			matrExpected[4,2] = 0.00000006;
			matrExpected[4,3] = 0.00000008;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[5];
			PointRGB[] c = new PointRGB[4];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			c[2] = new PointRGB(20, 25, 68);
			c[3] = new PointRGB(125, 100, 30);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
		public void MU4c6pTest()
		{
			double[,] matrExpected = new double[6, 4];
			matrExpected[0,0] = 0.00054555;
			matrExpected[0,1] = 0.00077408;
			matrExpected[0,2] = 0.00239571;
			matrExpected[0,3] = 0.99628466;
			matrExpected[1,0] = 0.99394929;
			matrExpected[1,1] = 0.00468394;
			matrExpected[1,2] = 0.00040216;
			matrExpected[1,3] = 0.00096462;
			matrExpected[2,0] = 0.92651765;
			matrExpected[2,1] = 0.07146868;
			matrExpected[2,2] = 0.00083941;
			matrExpected[2,3] = 0.00117426;
			matrExpected[3,0] = 0.00041649;
			matrExpected[3,1] = 0.00040590;
			matrExpected[3,2] = 0.00405028;
			matrExpected[3,3] = 0.99512733;
			matrExpected[4,0] = 0.00000001;
			matrExpected[4,1] = 0.00000001;
			matrExpected[4,2] = 0.99999991;
			matrExpected[4,3] = 0.00000007;
			matrExpected[5,0] = 0.00000004;
			matrExpected[5,1] = 0.99999996;
			matrExpected[5,2] = 0.00000000;
			matrExpected[5,3] = 0.00000000;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[6];
			PointRGB[] c = new PointRGB[4];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			c[2] = new PointRGB(20, 25, 68);
			c[3] = new PointRGB(125, 100, 30);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
		public void MU3c5pTest()
		{
			double[,] matrExpected = new double[5, 3];
			matrExpected[0,0] = 0.00054491;
			matrExpected[0,1] = 0.99705121;
			matrExpected[0,2] = 0.00240388;
			matrExpected[1,0] = 0.99807063;
			matrExpected[1,1] = 0.00136826;
			matrExpected[1,2] = 0.00056111;
			matrExpected[2,0] = 0.99847600;
			matrExpected[2,1] = 0.00089631;
			matrExpected[2,2] = 0.00062769;
			matrExpected[3,0] = 0.00041257;
			matrExpected[3,1] = 0.99550742;
			matrExpected[3,2] = 0.00408001;
			matrExpected[4,0] = 0.00000000;
			matrExpected[4,1] = 0.00000002;
			matrExpected[4,2] = 0.99999998;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[5];
			PointRGB[] c = new PointRGB[3];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			c[2] = new PointRGB(20, 25, 68);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
		public void MU4c8pTest()
		{
			double[,] matrExpected = new double[8, 4];
			matrExpected[0,0] = 0.00589397;
			matrExpected[0,1] = 0.00073638;
			matrExpected[0,2] = 0.00497074;
			matrExpected[0,3] = 0.98839891;
			matrExpected[1,0] = 0.99444553;
			matrExpected[1,1] = 0.00031517;
			matrExpected[1,2] = 0.00454436;
			matrExpected[1,3] = 0.00069494;
			matrExpected[2,0] = 0.81493949;
			matrExpected[2,1] = 0.00178697;
			matrExpected[2,2] = 0.18203872;
			matrExpected[2,3] = 0.00123482;
			matrExpected[3,0] = 0.00207571;
			matrExpected[3,1] = 0.00030712;
			matrExpected[3,2] = 0.00156376;
			matrExpected[3,3] = 0.99605341;
			matrExpected[4,0] = 0.01484821;
			matrExpected[4,1] = 0.00774808;
			matrExpected[4,2] = 0.02677084;
			matrExpected[4,3] = 0.95063288;
			matrExpected[5,0] = 0.04218263;
			matrExpected[5,1] = 0.00612970;
			matrExpected[5,2] = 0.94728849;
			matrExpected[5,3] = 0.00439918;
			matrExpected[6,0] = 0.03266716;
			matrExpected[6,1] = 0.03462654;
			matrExpected[6,2] = 0.93055356;
			matrExpected[6,3] = 0.00215273;
			matrExpected[7,0] = 0.00000000;
			matrExpected[7,1] = NaN;
			matrExpected[7,2] = 0.00000000;
			matrExpected[7,3] = 0.00000000;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[8];
			PointRGB[] c = new PointRGB[4];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			c[2] = new PointRGB(20, 25, 68);
			c[3] = new PointRGB(125, 100, 30);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			p[6] = new PointRGB(59, 153, 112);
			p[7] = new PointRGB(38, 121, 43);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
		public void MU3c6pTest()
		{
			double[,] matrExpected = new double[6, 3];
			matrExpected[0,0] = 0.99691133;
			matrExpected[0,1] = 0.00239722;
			matrExpected[0,2] = 0.00069145;
			matrExpected[1,0] = 0.01389251;
			matrExpected[1,1] = 0.00579189;
			matrExpected[1,2] = 0.98031560;
			matrExpected[2,0] = 0.00006546;
			matrExpected[2,1] = 0.00004679;
			matrExpected[2,2] = 0.99988775;
			matrExpected[3,0] = 0.99549822;
			matrExpected[3,1] = 0.00405179;
			matrExpected[3,2] = 0.00044999;
			matrExpected[4,0] = 0.00000007;
			matrExpected[4,1] = 0.99999992;
			matrExpected[4,2] = 0.00000001;
			matrExpected[5,0] = 0.01568172;
			matrExpected[5,1] = 0.01327082;
			matrExpected[5,2] = 0.97104746;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[6];
			PointRGB[] c = new PointRGB[3];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			c[2] = new PointRGB(20, 25, 68);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
		public void MU2c7pTest()
		{
			double[,] matrExpected = new double[7, 2];
			matrExpected[0,0] = 0.00644397;
			matrExpected[0,1] = 0.99355603;
			matrExpected[1,0] = 0.97325628;
			matrExpected[1,1] = 0.02674372;
			matrExpected[2,0] = 0.99998356;
			matrExpected[2,1] = 0.00001644;
			matrExpected[3,0] = 0.00213306;
			matrExpected[3,1] = 0.99786694;
			matrExpected[4,0] = 0.02069683;
			matrExpected[4,1] = 0.97930317;
			matrExpected[5,0] = 0.98555014;
			matrExpected[5,1] = 0.01444986;
			matrExpected[6,0] = 0.99023803;
			matrExpected[6,1] = 0.00976197;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[7];
			PointRGB[] c = new PointRGB[2];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			p[6] = new PointRGB(59, 153, 112);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
		public void MU3c7pTest()
		{
			double[,] matrExpected = new double[7, 3];
			matrExpected[0,0] = 0.98843361;
			matrExpected[0,1] = 0.00521983;
			matrExpected[0,2] = 0.00634656;
			matrExpected[1,0] = 0.00068811;
			matrExpected[1,1] = 0.00456865;
			matrExpected[1,2] = 0.99474323;
			matrExpected[2,0] = 0.00123014;
			matrExpected[2,1] = 0.18585713;
			matrExpected[2,2] = 0.81291273;
			matrExpected[3,0] = 0.99598016;
			matrExpected[3,1] = 0.00170797;
			matrExpected[3,2] = 0.00231187;
			matrExpected[4,0] = 0.96117425;
			matrExpected[4,1] = 0.02477243;
			matrExpected[4,2] = 0.01405332;
			matrExpected[5,0] = 0.00481470;
			matrExpected[5,1] = 0.94922143;
			matrExpected[5,2] = 0.04596387;
			matrExpected[6,0] = 0.00207998;
			matrExpected[6,1] = 0.96659160;
			matrExpected[6,2] = 0.03132843;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[7];
			PointRGB[] c = new PointRGB[3];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			c[2] = new PointRGB(20, 25, 68);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			p[6] = new PointRGB(59, 153, 112);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
		public void MU3c8pTest()
		{
			double[,] matrExpected = new double[8, 3];
			matrExpected[0,0] = 0.00788824;
			matrExpected[0,1] = 0.00135257;
			matrExpected[0,2] = 0.99075919;
			matrExpected[1,0] = 0.97776544;
			matrExpected[1,1] = 0.01136476;
			matrExpected[1,2] = 0.01086980;
			matrExpected[2,0] = 0.99972441;
			matrExpected[2,1] = 0.00022717;
			matrExpected[2,2] = 0.00004841;
			matrExpected[3,0] = 0.00247573;
			matrExpected[3,1] = 0.00056425;
			matrExpected[3,2] = 0.99696002;
			matrExpected[4,0] = 0.01887481;
			matrExpected[4,1] = 0.01169394;
			matrExpected[4,2] = 0.96943125;
			matrExpected[5,0] = 0.91088105;
			matrExpected[5,1] = 0.07079251;
			matrExpected[5,2] = 0.01832645;
			matrExpected[6,0] = 0.18082271;
			matrExpected[6,1] = 0.81377982;
			matrExpected[6,2] = 0.00539746;
			matrExpected[7,0] = 0.00367166;
			matrExpected[7,1] = 0.99571614;
			matrExpected[7,2] = 0.00061219;
			FuzzyCMean fcm = new FuzzyCMean();
			PointRGB[] p = new PointRGB[8];
			PointRGB[] c = new PointRGB[3];
			c[0] = new PointRGB(245, 14, 45);
			c[1] = new PointRGB(56, 78, 134);
			c[2] = new PointRGB(20, 25, 68);
			p[0] = new PointRGB(203, 171, 184);
			p[1] = new PointRGB(72, 162, 213);
			p[2] = new PointRGB(73, 143, 165);
			p[3] = new PointRGB(210, 212, 187);
			p[4] = new PointRGB(198, 214, 103);
			p[5] = new PointRGB(107, 113, 140);
			p[6] = new PointRGB(59, 153, 112);
			p[7] = new PointRGB(38, 121, 43);
			double[,] matr = fcm.distributeOverMatrixU(p, c, 1.5);
			for (int i = 0; i < p.Length; i++)
			{
				for (int j = 0; j < c.Length; j++)
				{
					Assert.IsTrue((matr[i, j] - matrExpected[i, j] < 0.0001) || (Math.Abs(matr[i, j] + matrExpected[i, j] - 1) < 0.0001));
				}
			}
		}
        private double calculateDecisionFunction(PointRGB[] MatrixPointX, PointRGB[] MatrixCentroids, double[,] MatrixU)
        {
            double sum = 0;
            
            for (int i = 0; i < MatrixU.GetLength(0); i++)
            {
                for (int j = 0; j < MatrixU.GetLength(1); j++)
                {
                    sum += MatrixU[i,j] * evklidDistance3D(MatrixCentroids[j], MatrixPointX[i]);
                }
            }

            return sum;
        }