Beispiel #1
0
        public Claster JoinClasters(Claster cl1, Claster cl2)
        {
            List <MyObject> l1 = new List <MyObject>();

            if (cl1 != null)
            {
                l1 = cl1.GetObjects();
            }
            List <MyObject> l2 = cl2.GetObjects();

            List <MyObject> l3 = new List <MyObject>();

            if (cl1 != null)
            {
                foreach (var myObject in l1)
                {
                    l3.Add(myObject);
                }
            }
            foreach (var myObject in l2)
            {
                l3.Add(myObject);
            }
            return(new Claster(l3));
        }
Beispiel #2
0
        }// количество объектов во всех кластерах

        /*  public ArrayList RunForel(int numOfClaster, double Radius, Graphics graphic, ArrayList params1, ArrayList params2,int width, int height)
         * {
         *    // ArrayList Res;
         *
         *      Claster claster = ListOfClasters[numOfClaster];
         *     // Res = claster.sadasdsd(numOfClaster, Radius, graphic, params1, params2,  width,  height);
         *
         *     return Res;
         * }*/

        public Claster GetClasterForForel(int i) // дает кластер содержащий этот объект
        {
            int     k       = IsClasterOrSelected(i);
            Claster claster = ListOfClasters[k];

            return(claster);
        }
Beispiel #3
0
        public Claster GetNeighborhoods(MyObject obj)
        {
            NTree   searchingTree = this;
            Claster result        = null;

            while (searchingTree.claster.GetObjects().Count != 1)
            {
                foreach (var nTree in searchingTree.trees)
                {
                    if (nTree.claster.GetObjects().IndexOf(obj) >= 0)
                    {
                        result        = searchingTree.claster;
                        searchingTree = nTree;
                        break;
                    }
                }
            }
            return(result);
        }
Beispiel #4
0
        public void UpdateListOfClaster()   // не все удаляет.. удаление одинаковых ветвей.
        {
            List <Claster> tmp_for_del = new List <Claster>();
            List <Claster> tmp         = new List <Claster>();

            bool flag           = true;
            int  countOfclaster = list_of_claster.Count;


            for (int i = 0; i < countOfclaster; i++)
            {
                for (int j = i + 1; j < countOfclaster; j++)
                {
                    foreach (var object1 in list_of_claster[i].GetObjects())
                    {
                        foreach (var object2 in list_of_claster[j].GetObjects())
                        {
                            if (object1 == object2 && list_of_claster[i] != list_of_claster[j])
                            {
                                if (list_of_claster[i].GetObjects().Count < list_of_claster[j].GetObjects().Count)
                                {
                                    //list_of_claster.Remove(claster1);
                                    if (flag)
                                    {
                                        tmp_for_del.Add(list_of_claster[j]);
                                        tmp.Add(list_of_claster[i]);
                                        flag = false;
                                        break;
                                    }
                                }
                                else
                                {
                                    // list_of_claster.Remove(claster);
                                    if (flag)
                                    {
                                        tmp_for_del.Add(list_of_claster[i]);
                                        tmp.Add(list_of_claster[j]);
                                        flag = false;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    flag = true;
                }
            }

            int counter = tmp.Count;

            for (int i = 0; i < counter; i++)
            {
                List <MyObject> list_Of_Obj  = tmp_for_del[i].GetObjects();
                List <MyObject> list_Of_Obj1 = tmp[i].GetObjects();
                List <MyObject> new_list     = new List <MyObject>();
                foreach (var myObject in list_Of_Obj)
                {
                    // list_Of_Obj.Remove(myObject);
                    if (list_Of_Obj1.IndexOf(myObject) < 0)
                    {
                        new_list.Add(myObject);
                    }
                }
                if (new_list.Count != 0)
                {
                    Claster cl = new Claster(new_list);
                    if (list_of_claster.IndexOf(cl) < 0)
                    {
                        list_of_claster.Add(new Claster(new_list));
                    }
                }

                list_of_claster.Remove(tmp_for_del[i]);
            }
        }
Beispiel #5
0
        public NTree Do_Ierarhical_Clasterization()
        {
            int counter;

            while (trees.Count > 1)
            {
                counter            = trees.Count;
                double[,] distance = new double[counter, counter];
                double minDist = double.MaxValue;  //!!!!!!!!!!!!!!!!!!!!!!!!! TODO error was here because int less than double
                int    tmp     = 0;

                for (int i = 0; i < counter; i++)
                {
                    for (int j = i + 1; j < counter; j++)
                    {
                        if (i != j)
                        {
                            //  MyObject obj1 = Claster.GetCenterOfMassInThisClaster(trees[i].claster.GetObjects());
                            //MyObject obj2 = Claster.GetCenterOfMassInThisClaster(trees[j].claster.GetObjects());
                            // distance[i, j] = Claster.GetDistanceFromObjectToCentroid(obj1, obj2);
                            if (trees[j].claster != null && trees[i].claster != null)
                            {
                                distance[i, j] = trees[j].claster.GetAverangeIntergroupDistanceBetweenClasters(
                                    trees[i].claster.GetObjects(), trees[j].claster.GetObjects()
                                    );
                            }
                            // теперь без самопересечений
                            if (minDist > distance[i, j])
                            {
                                minDist = distance[i, j];
                                tmp     = i;
                            }
                        }
                    }
                }

                Claster new_claster = null;
                NTree   new_tree    = null;
                int[]   nums        = new int[trees.Count]; // смотрим какие кластеры на этом шаге попали в объединение

                //  for (int k = 0; k < counter; k++)
                //  {
                int k = tmp;
                for (int j = k + 1; j < counter; j++)
                {
                    if (minDist == distance[k, j])
                    {
                        nums[k] = 1;
                        nums[j] = 1;
                        break;     // для бинарности добавления
                    }
                }
                //   }

                new_tree = new NTree(minDist, new_claster);
                for (int i = 0; i < counter; i++)
                {
                    if (nums[i] == 1)
                    {
                        new_claster = JoinClasters(new_claster, trees[i].claster);
                        new_tree.trees.Add(trees[i]);
                    }
                }
                /////
                if (new_claster == null)
                {
                    System.Windows.Forms.MessageBox.Show("axaxaxax!");
                }
                //////


                new_tree.claster = new_claster;
                for (int i = counter - 1; i >= 0; i--)
                {
                    if (nums[i] == 1)
                    {
                        trees.Remove(trees[i]);
                    }
                }
                if (new_tree != null && new_tree.claster != null) //на нуль проверку сделал
                {
                    trees.Add(new_tree);
                }

                ////
                foreach (var tree in trees)
                {
                    if (tree.claster == null)
                    {
                        System.Windows.Forms.MessageBox.Show("axaxaxax!");
                    }
                }
                /////
                this.distance = minDist;
            }
            return(this);
        }
Beispiel #6
0
        public bool is_in_big_claster = true;   //показывает отделен ли потомок от единого кластера(было в одиночном удалении очень нужно)
        //end удаление вертикальных линий

        public NTree(double new_distance, Claster new_claster)
        {
            distance = new_distance;
            claster  = new_claster;
            trees    = new List <NTree>();
        }
Beispiel #7
0
        public void AddClaster(Color color) // Добавление кластера в список кластеров!
        {
            ClasterColor.Add(color);
            if (SelectedPoints.Count != 0)//если точек 0 то нельзя добавлять
            {
                List <MyObject> ObjectsOfClaster = new List <MyObject>();

                #region  // лично херной маюсь

                /*
                 * SelectedPoints.Add(0);
                 * SelectedPoints.Add(6);
                 * SelectedPoints.Add(19);
                 * SelectedPoints.Add(20);
                 * SelectedPoints.Add(28);
                 * SelectedPoints.Add(36);
                 * SelectedPoints.Add(40);
                 * SelectedPoints.Add(47);
                 * SelectedPoints.Add(51);
                 *
                 *
                 *
                 * SelectedPoints.Add(3);
                 * SelectedPoints.Add(3);
                 * SelectedPoints.Add(3);
                 * SelectedPoints.Add(3);
                 * SelectedPoints.Add(3);
                 * SelectedPoints.Add(3);
                 * SelectedPoints.Add(3);
                 * SelectedPoints.Add(3);
                 * SelectedPoints.Add(3);
                 * SelectedPoints.Add(3);
                 * SelectedPoints.Add(3);
                 * SelectedPoints.Add(3);
                 */
                #endregion


                foreach (var point in SelectedPoints)
                {
                    ObjectsOfClaster.Add(GiveObject(Int32.Parse(point.ToString())));
                }

                Claster claster = new Claster(ObjectsOfClaster);

                ListOfClasters.Add(claster);
                SelectedPointsByClasters.Add(SelectedPoints);
                SelectedPoints = new ArrayList(); // clear делать нельзя, потому что добавили в список кластеров. иначе там очистятся тоже
            }

            int counter = arrayOfClasterAndSelectedPoints.Count();
            int numer   = ListOfClasters.Count - 1;

            for (int i = 0; i < counter; i++)
            {
                if (arrayOfClasterAndSelectedPoints[i] == -1)
                {
                    arrayOfClasterAndSelectedPoints[i] = numer;
                }
            }
        }
Beispiel #8
0
        public void RunForel(int numOfClaster, int firstElement, Claster myClaster, double radius)
        {
            double[]         radInProection = myClaster.GetDiametrInProection(numRow, numCol); // две удаленные точки и диаметр .. всего 3 элемента в массиве
            List <ArrayList> listOfPoints   = controller.GetListOfClasterPoints();
            ArrayList        arrayList      = listOfPoints[numOfClaster];

            //две выделенные точки
            int point1 = int.Parse(arrayList[(int)radInProection[0]].ToString());
            int point2 = int.Parse(arrayList[(int)radInProection[1]].ToString());
            //


            ////////////////////////////////////////////////////////// painting
            int count = params1.Count;


            double max1 = double.Parse(params1[0].ToString());
            double min1 = double.Parse(params1[0].ToString());

            double max2 = double.Parse(params2[0].ToString());
            double min2 = double.Parse(params2[0].ToString());

            for (int i = 0; i <= count - 1; i++)   // ищем максимумы и минимумы
            {
                if (double.Parse(params1[i].ToString()) > max1)
                {
                    max1 = double.Parse(params1[i].ToString());
                }
                if (double.Parse(params1[i].ToString()) < min1)
                {
                    min1 = double.Parse(params1[i].ToString());
                }

                if (double.Parse(params2[i].ToString()) > max2)
                {
                    max2 = double.Parse(params2[i].ToString());
                }
                if (double.Parse(params2[i].ToString()) < min2)
                {
                    min2 = double.Parse(params2[i].ToString());
                }
            }

            var step1       = ((max1 - min1) / (width * 0.7));
            var step1ForRad = ((width * 0.7) * (double.Parse(params1[point1].ToString()) - min1) / (max1 - min1));
            var step2       = ((max2 - min2) / (height * 0.7));
            var step2ForRad = ((height * 0.7) * (double.Parse(params2[point2].ToString()) - min2) / (max2 - min2));

            //////////////////////////////////////////////////////////////// painting

            List <MyObject> objects = myClaster.GetObjects();

            int countObj = objects.Count;
            int countAtr = objects[0].attrib.Count;

            double[,] vectX = new double[countObj, countAtr];

            for (int i = 0; i < countObj; i++)
            {
                for (int j = 0; j < countAtr; j++)
                {
                    vectX[i, j] = double.Parse(objects[i].attrib[j].ToString());
                }
            }

            double[] xCenter = new double[countAtr];  //  заполняем начальный центр масс.

            for (int j = 0; j < countAtr; j++)
            {
                xCenter[j] = vectX[firstElement, j];
            }

            Boolean flagForCycle = true;

            ArrayList ObjInSphere = new ArrayList();

            for (int i = 0; i < countObj; i++)
            {
                ObjInSphere.Add(i);
            }

            int m = 0; //  tmp counter

            ///////////////////.............

            while (flagForCycle)
            {
                int   num          = ObjInSphere.Count;
                int[] numOfObjects = new int[num];

                ObjInSphere.CopyTo(numOfObjects);

                ObjInSphere.Clear();

                double[] ArrayX = new double[countAtr];  // какой то объект
                int      myCountObjectsInSphere = 0;

                for (int i = 0; i < num; i++)
                {
                    for (int j = 0; j < countAtr; j++)
                    {
                        ArrayX[j] = vectX[i, j];  ////////////////////
                    }

                    double length = myClaster.GetRo(ArrayX, xCenter);

                    if (length <= radius / 2)
                    {
                        myCountObjectsInSphere++;
                        ObjInSphere.Add(i);
                    }
                }

                double[] xNewCenter = new double[countAtr];  // новый центр масс.

                foreach (var nums in ObjInSphere)
                {
                    m = Int32.Parse(nums.ToString());
                    for (int j = 0; j < countAtr; j++)
                    {
                        xNewCenter[j] += vectX[m, j] / ObjInSphere.Count;
                    }
                }

                graph.Clear(Color.White);
                RedrawMe();
                graph.FillEllipse(Brushes.LightPink, (float)(width * 0.05 + (xNewCenter[numRow] - min1) / step1), (float)(height * 0.9 - (xNewCenter[numCol] - min2) / step2), 9, 9);

                graph.DrawEllipse(Pens.LightSkyBlue, (float)(width * 0.05 - step1ForRad / 2 + (xNewCenter[numRow] - min1) / step1), (float)(height * 0.9 - step2ForRad / 2 - (xNewCenter[numCol] - min2) / step2), (float)(step1ForRad), (float)(step2ForRad));


                // отмечаем новый цм
                // рисуем круг радиусом соответствующим

                bool flag = false;
                for (int i = 0; i < countAtr; i++)
                {
                    if (xNewCenter[i] != xCenter[i])
                    {
                        flag = true;
                    }
                }
                flagForCycle = flag;

                if (flagForCycle)
                {
                    xCenter = xNewCenter;
                }
            }

            string res = null;

            for (int i = 0; i < ObjInSphere.Count; i++)
            {
                res += ObjInSphere[i].ToString() + "\n";
            }
            MessageBox.Show(res);
        }