private void DetermineClaster(ConnectedField field)
        {
            var cl1 = clasters[1];
            var cl2 = clasters[2];

            var euclidMetric1 = Math.Pow(Math.Pow(field.Area - cl1.Area, 2) +
                       Math.Pow(field.Perimeter - cl1.Perimeter, 2) +
                       Math.Pow(field.Density - cl1.Density, 2) +
                       Math.Pow(field.Elongation - cl1.Elongation, 2), 0.5);
            var euclidMetric2 = Math.Pow(Math.Pow(field.Area - cl2.Area, 2) +
                       Math.Pow(field.Perimeter - cl2.Perimeter, 2) +
                       Math.Pow(field.Density - cl2.Density, 2) +
                       Math.Pow(field.Elongation - cl2.Elongation, 2), 0.5);

            var clasterNumber = euclidMetric1 < euclidMetric2 ? 1 : 2;

            if (field.ClasterNumber != clasterNumber)
            {
                clasterizationReady = false;
            }

            field.ClasterNumber = clasterNumber;
        }
        private void UpdateClastersCenter(ConnectedField claster, int clasterNumber)
        {
            var clasterFields = 0;
            var tempArea = 0;
            var tempPerimeter = 0;
            var tempDensity = 0d;
            var tempElongation = 0d;

            foreach (var i in connectedFields)
            {
                if (i.ClasterNumber != clasterNumber) continue;

                clasterFields++;
                tempArea += i.Area;
                tempPerimeter += i.Perimeter;
                tempDensity += i.Density;
                tempElongation += i.Elongation;
            }

            if (clasterFields == 0) return;

            claster.Area = tempArea / clasterFields;
            claster.Perimeter = tempPerimeter / clasterFields;
            claster.Density = tempDensity / clasterFields;
            claster.Elongation = tempElongation / clasterFields;
        }
        private void CalculatePerimeter(ConnectedField field)
        {
            var perimeterBuf = 0;
            var xs = field.XStart;
            var ys = field.YStart;

            for (var i = xs; i < field.XEnd - 1; i++)
            {
                for (var j = ys; j < field.YEnd - 1; j++)
                {
                    if ((Image.GetPixel(i - 1, j).R > 250 ||
                        Image.GetPixel(i + 1, j).R > 250
                        || Image.GetPixel(i, j - 1).R > 250 ||
                        Image.GetPixel(i, j + 1).R > 250) &&
                        Image.GetPixel(i, j).R < 250)
                    {
                        perimeterBuf++;
                    }
                }
            }

            field.Perimeter = perimeterBuf;
        }
        private void CalculateWeightCenters(ConnectedField field)
        {
            if (field.Area == 0)
            {
                throw new ArgumentException("First calculate area of object");
            }

            var tempX = 1;
            var tempY = 1;

            for (var i = field.XStart; i < field.XEnd; i++)
            {
                for (var j = field.YStart; j < field.YEnd; j++)
                {
                    if (imageMap[i, j] != 1) continue;

                    tempX += i - field.XStart;
                    tempY += j - field.YStart;
                }
            }

            // ReSharper disable once PossibleLossOfFraction
            field.WeightCenterX = tempX / field.Area;

            // ReSharper disable once PossibleLossOfFraction
            field.WeightCenterY = tempY / field.Area;
        }
        private void CalculateElongationAndMainAxisOrientation(ConnectedField field)
        {
            double m11 = 0;
            double m20 = 0;
            double m02 = 0;

            for (var i = field.XStart; i < field.XEnd; i++)
            {
                for (var j = field.YStart; j < field.YEnd; j++)
                {
                    if (imageMap[i, j] != 1) continue;

                    m11 += (i - field.WeightCenterX - field.XStart) *
                        (j - field.WeightCenterY - field.YStart);
                    m20 += Math.Pow((i - field.WeightCenterX - field.XStart), 2);
                    m02 += Math.Pow((j - field.WeightCenterY - field.YStart), 2);
                }
            }

            field.Elongation = (m20 + m02 + Math.Pow(Math.Pow(m20 - m02, 2) +
                                                     4*Math.Pow(m11, 2), 0.5))/
                               (m20 + m02 - Math.Pow(Math.Pow(m20 - m02, 2) +
                                                     4*Math.Pow(m11, 2), 0.5));

            field.MainAxisOrientation = 0.5*Math.Atan(2*m11/(m20 - m02));
        }
        private void CalculateArea(ConnectedField field)
        {
            var area = 0;

            for (var i = field.XStart; i < field.XEnd; i++)
            {
                for (var j = field.YStart; j < field.YEnd; j++)
                {
                    if (imageMap[i, j] == 1)
                    {
                        area++;
                    }
                }
            }

            field.Area = area;
        }
 private static void SetRandomValuesToField(ConnectedField field, int key)
 {
     if (key == 1)
     {
         field.Area = 1;
         field.Perimeter = 1;
         field.Density = 1;
         field.Elongation = 1;
     }
     if (key == 2)
     {
         field.Area = 2;
         field.Perimeter = 2;
         field.Density = 2;
         field.Elongation = 2;
     }
 }
 private static void CalculateDensity(ConnectedField field)
 {
     field.Density = Math.Pow(field.Perimeter, 2)/field.Area;
 }
        protected override void ProcessRecord()
        {
            var rc = new ConnectedField(connectionName, toCategoryName, fieldName);

            WriteObject(rc);
        }