コード例 #1
0
        /// <summary>
        ///  рекурсивная функция
        /// </summary>
        /// <param name="k"></param>
        static public void search2(Object ka)
        {
            int k = (int)ka;

            //    перврый раз
            if ((k == 2)) // две начальные точки мы поставили, от второй точки, строим третья, для второго отрезка многоугольника, бежим в 6! сторон
            {
                //int i = 0;
                // for (double a = 30; a <= 180; a += 30)
                // double a = 30;
                for (double a = 30; a <= 90; a += 30)
                {
                    // окружность круга
                    double x = Math.Sin(a * Math.PI / 180); // нахождение новых координат
                    double y = 1 - Math.Cos(a * Math.PI / 180);
                    //////////////////
                    pointColection[0, k] = x; // постановка координат
                    pointColection[1, k] = y;
                    //t2 = pointColection;

                    Thread newThread = new Thread(search2);

                    newThread.Start(k + 1);
                    //   search2(k + 1); //  вызов рекурсивной функции
                    // ///
                }
            }
            else
            {
                /// к=3
                for (double a = 0; a <= 330; a += 30) // бежим в 11 сторон
                {
                    //                   берем значения син и кос из готового массива
                    double x = pointColection[0, k - 1] + listSinCos[a];
                    double y = pointColection[1, k - 1] - listSinCos[a + 1];


                    // проверка на касание
                    bool Flag = false;

                    for (int i = 0; i < k - 1; i++)
                    {
                        if (Math.Abs(length(pointColection[0, i], pointColection[1, i], x, y)) < 0.001)
                        {
                            Flag = true; break;
                        }
                        if (i > 0 && equal(pointColection[0, i - 1], pointColection[1, i - 1], pointColection[0, i], pointColection[1, i], pointColection[0, k - 1], pointColection[1, k - 1], x, y))
                        {
                            Flag = true; break;
                        }
                    }
                    #region предыдущий код

                    #endregion
                    if (length(x, y, pointColection[0, 0], pointColection[1, 0]) > pointColection.GetLength(1) - k)
                    {
                        Flag = true;
                    }
                    if (!Flag)
                    {
                        pointColection[0, k] = x;
                        pointColection[1, k] = y;
                        //   var test = pointColection.GetLength(1) - 1;
                        if (k < pointColection.GetLength(1) - 1)
                        {
                            search2(k + 1);
                        }
                        else
                        if (Math.Abs(length(pointColection[0, k], pointColection[1, k], pointColection[0, 0], pointColection[1, 0]) - 1) < 0.01)
                        {
                            //????????
                            Flag = true;
                            for (int i = 1; i < k - 1; i++)
                            {
                                if (equal(pointColection[0, i], pointColection[1, i], pointColection[0, i + 1], pointColection[1, i + 1], pointColection[0, k], pointColection[1, k], pointColection[0, 0], pointColection[1, 0]))
                                {
                                    Flag = false;
                                    break;
                                }
                            }
                            if (Flag)
                            {
                                //****************************

                                double intarea = area(pointColection);
                                var    abs     = Math.Abs(Math.Round(intarea) - intarea);
                                couuntPlosh++;
                                //////************



                                if (abs < 0.00001)
                                {
                                    // xcouunt++;
                                    square[(int)Math.Round(intarea)]++;

                                    ////*********////////////////////////////////
                                    double[] tempAppay = new double[rank];


                                    List <double> temp = new List <double>();


                                    double[,] tempArr = new double[2, rank];
                                    // копирование в новый масс для сохранения
                                    for (int i = 0; i < rank; i++)
                                    {
                                        tempArr[0, i] = pointColection[0, i];
                                        tempArr[1, i] = pointColection[1, i];
                                    }

                                    // сохранение массива
                                    LittleShape2 ready = new LittleShape2();
                                    ready.add(tempArr, rank);
                                    //   установка масси
                                    //double areaF = area(pointColection);



                                    ready.Mass = (int)Math.Round(intarea);;
                                    lock (locker)
                                    {
                                        mainListFigures.Add(ready);
                                    }
                                }
                                count++;
                            }
                        }
                    }
                }
            }
        }
コード例 #2
0
        /// <summary>
        ///  рекурсивная функция
        /// </summary>
        /// <param name="k"></param>
        static public void search(int k)
        {
            //    перврый раз
            if (k == 2)     // две начальные точки мы поставили, от второй точки, строим третья, для второго отрезка многоугольника, бежим в 6! сторон
            {
                for (double a = 30; a <= 90; a += 30)
                {
                    // окружность круга
                    double x = Math.Sin(a * Math.PI / 180);     // нахождение новых координат
                    double y = 1 - Math.Cos(a * Math.PI / 180);
                    //////////////////
                    pointColection[0, k] = x;     // постановка координат
                    pointColection[1, k] = y;
                    //t2 = pointColection;
                    search(k + 1);     //  вызов рекурсивной функции
                    // ///
                }
            }
            else
            {
                /// к=3
                for (double a = 0; a <= 330; a += 30)     // бежим в 11 сторон
                {
                    //                   берем значения син и кос из готового массива
                    double x = pointColection[0, k - 1] + listSinCos[a];
                    double y = pointColection[1, k - 1] - listSinCos[a + 1];


                    // проверка на касание
                    bool Flag = false;

                    for (int i = 0; i < k - 1; i++)
                    {
                        if (Math.Abs(length(pointColection[0, i], pointColection[1, i], x, y)) < 0.001)
                        {
                            Flag = true; break;
                        }
                        if (i > 0 && equal(pointColection[0, i - 1], pointColection[1, i - 1], pointColection[0, i], pointColection[1, i], pointColection[0, k - 1], pointColection[1, k - 1], x, y))
                        {
                            Flag = true; break;
                        }
                    }
                    #region предыдущий код
                    //for (int i = 0; i < k - 1; i++)
                    //{
                    //     double pp = length(pointColection[0, i], pointColection[1, i], x, y);
                    //    double absPP = Math.Abs(pp);
                    //    if (absPP < 0.001)
                    //    {
                    //        Flag = true;
                    //        break;
                    //    }
                    //    ///////      делал только с проверкой не пересечение результат нехватка памяти
                    //    if (i > 0 && equal(pointColection[0, i - 1], pointColection[1, i - 1], pointColection[0, i], pointColection[1, i], pointColection[0, k - 1], pointColection[1, k - 1], x, y))
                    //    {
                    //        Flag = true;
                    //        break;
                    //    }
                    //    // если (касаеться +)   делал только с проверкой не пересечение результат нехватка памяти надо включать этот кусок
                    //    // будут отсекаться фигуры с меньшей пл. но будут лищние проверки
                    //    //    пробую менять местами сначала на пересечение линий break потом на площадь тоже break

                    //   // return;
                    //}
                    // если нету касания го
                    #endregion

                    if (!Flag)
                    {
                        pointColection[0, k] = x;
                        pointColection[1, k] = y;
                        //   var test = pointColection.GetLength(1) - 1;
                        if (k < pointColection.GetLength(1) - 1)
                        {
                            search(k + 1);
                        }
                        else
                        if (Math.Abs(length(pointColection[0, k], pointColection[1, k], pointColection[0, 0], pointColection[1, 0]) - 1) < 0.01)
                        {
                            //????????
                            Flag = true;
                            for (int i = 1; i < k - 1; i++)
                            {
                                //  debug1 = pointColection;
                                if (equal(pointColection[0, i], pointColection[1, i], pointColection[0, i + 1], pointColection[1, i + 1], pointColection[0, k], pointColection[1, k], pointColection[0, 0], pointColection[1, 0]))
                                {
                                    Flag = false;
                                    break;
                                }
                            }
                            if (Flag)
                            {
                                //****************************

                                double intarea = area(pointColection);
                                var    abs     = Math.Abs(Math.Round(intarea) - intarea);
                                couuntPlosh++;
                                //////************



                                if (abs < 0.00001)
                                {
                                    //   xcouunt++;
                                    square[(int)Math.Round(intarea)]++;

                                    ////*********////////////////////////////////
                                    double[] tempAppay = new double[rank];


                                    List <double> temp = new List <double>();


                                    double [,] tempArr = new double[2, rank];
                                    // копирование в новый масс для сохранения
                                    for (int i = 0; i < rank; i++)
                                    {
                                        tempArr[0, i] = pointColection[0, i];
                                        tempArr[1, i] = pointColection[1, i];
                                    }

                                    // сохранение массива
                                    LittleShape2 ready = new LittleShape2();
                                    ready.add(tempArr, rank);
                                    //   установка масси
                                    //double areaF = area(pointColection);



                                    ready.Mass = (int)Math.Round(intarea);;
                                    lock (locker)
                                    {
                                        mainListFigures.Add(ready);
                                    }
                                }
                                count++;
                            }
                        }
                    }
                }
            }
        }