/// <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++; } } } } } }
/// <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++; } } } } } }