Не могу найти ошибку в формуле. Код Java, он на c# тоже работает(если переделать ввод и вывод)

128
15 апреля 2022, 07:50

я делаю приложение, выводящее спираль(в целях образования). Но спираль выводится с редкими придатками, в местах отклоняющихся на на количество градусов кратное 90 от старта.

часть кода в которой может быть ошибка:

        //формула для интервала между точками: р/м точки между которыми ищем интервал как окружность
        //1)находим кол-во точек по формуле 2Pr
        //2)делим 360 на полученное число
        interval = (double)(360.0 / (double)(Math.PI * (Wid / 2 * ((howManyCircles * 360 - deg ) /         
        (howManyCircles * 360))) * 2));
        // формула позиций: р/м точку которую рисуем как прямоугольный треугольник
        //1) сделаем допущение, что позиция по X и позиция по Y это катеты,
        // следовательно расстояние до точки это гипотенуза.
        //2) нам известен угол(т.к. он является счетчиком(переменная deg))и гипотенуза по формуле:
        // (Wid / 2 * ((howManyCircles * 360 - deg + 1) / (howManyCircles * 360)))
        // следовательно находим катеты: (Х)косинус угла * на гипотенузу,(Y)косинус(угла - 90) * на         
        гипотенузу
        PosX = (int)(Math.cos(Math.toRadians(deg)) * (Wid / 2 * ((howManyCircles * 360 - deg ) / 
        (howManyCircles * 360))));
        PosY = (int)(Math.cos(Math.toRadians(90 - deg)) * (Wid / 2 * ((howManyCircles * 360 - deg ) / 
        (howManyCircles * 360))) / 2.25);

P.S. всё перевожу в double Т.К. устал думать, что надо переводить, а что не надо.

P.P.S если кому надо, вот весь код мэйна:

        Scanner in = new Scanner(System.in);
        System.out.print("input Width :");
        int Wid = in.nextInt();
        System.out.print("input how many circles :");
        double howManyCircles = in.nextDouble();
        double interval;
        int[][] doubleArray = new int[Wid][Wid];
        int PosX = 0;
        int PosY = 0;
        for (double deg = 1; deg < howManyCircles * 360; deg += interval){
            interval = (double)(360.0 / (double)(Math.PI * (Wid / 2 * ((howManyCircles * 360 - deg ) / 
            (howManyCircles * 360))) * 2));
            PosX = (int)(Math.cos(Math.toRadians(deg)) * (Wid / 2 * ((howManyCircles * 360 - deg ) / 
            (howManyCircles * 360))));
            PosY = (int)(Math.cos(Math.toRadians(90 - deg)) * (Wid / 2 * ((howManyCircles * 360 - deg ) / 
            (howManyCircles * 360))) / 2.25);
            doubleArray[PosX + Wid / 2][PosY + Wid / 2] = 1;
        }
        for (int Y = 0; Y < Wid; Y++){
            for (int X = 0; X < Wid; X++){
                if (doubleArray[Wid - 1 - X][Wid - 1 - Y] == 1){
                    System.out.print("#");
                }else{
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
Answer 1

Никакой ошибки не было, Данные "придатки" появлялись в результате корявого округления. Я просто увеличил ширину пикселя, и оно просто перестало себя проявлять. Всем спасибо за участие.

Чтоб модераторы не ворчали, придётся опубликовать ещё и код. Вот так теперь выглядит отрисовка:

        doubleArray[PosX + Wid / 2][PosY + Wid / 2] = 1;
        doubleArray[PosX + Wid / 2 + 1][PosY + Wid / 2] = 1;
        doubleArray[PosX + Wid / 2 + 2][PosY + Wid / 2] = 1;
        doubleArray[PosX + Wid / 2 + 3][PosY + Wid / 2] = 1;
        doubleArray[PosX + Wid / 2 + 4][PosY + Wid / 2] = 1;
        
        doubleArray[PosX + Wid / 2][PosY + Wid / 2 + 1] = 1;
        doubleArray[PosX + Wid / 2 + 1][PosY + Wid / 2 + 1] = 1;
        doubleArray[PosX + Wid / 2 + 2][PosY + Wid / 2 + 1] = 1;
        doubleArray[PosX + Wid / 2 + 3][PosY + Wid / 2 + 1] = 1;
        doubleArray[PosX + Wid / 2 + 4][PosY + Wid / 2 + 1] = 1;

Вот так выглядит объявление массива:

        int[][] doubleArray = new int[Wid + 4][Wid + 4];
Answer 2
    public static void main(String[] args) {
        double interval;
        int PosX;
        int PosY;
        Scanner in = new Scanner(System.in);
        System.out.print("Input Width: ");
        int Wid = in.nextInt();
        System.out.print("Input Number of Curves: ");
        int numberOfCurves = in.nextInt();
        double a = (numberOfCurves * 360);
        char[][] charArray = new char[Wid][Wid];
        for (double deg = 1; deg < a; deg += interval) {
            double b = (numberOfCurves * 360 - deg) / a;
            double c = (Wid / 2) * b;
            interval = (360.0 / (Math.PI * c));
            PosX = (int) (Math.cos(Math.toRadians(deg)) * c);
            PosY = (int) (Math.cos(Math.toRadians(90 - deg)) * c / 2.25);
            charArray[PosX + Wid / 2][PosY + Wid / 2] = '#';
        }
        for (int Y = 0; Y < Wid; Y++) {
            for (int X = 0; X < Wid; X++) {
                System.out.print(charArray[Wid - 1 - X][Wid - 1 - Y]);
            }
            System.out.println();
        }
        in.close();
    }
READ ALSO
Превратить строку в n-массивов символов

Превратить строку в n-массивов символов

Как из содержимого массива String[] subStr;, где i = n создать n массивов, уже заполненные содержимым из nНапример i = 3, создать соответственно 3 новых...

94
Как защитить коммерческий Java продукт?

Как защитить коммерческий Java продукт?

Подскажите как можно защитить свой Java продукт от финансовых потерь? В основном беспокоят пиратство и плагиат исходного кодаЯ так понял всякие...

100
Почему не помещаются кнопки в ряд?

Почему не помещаются кнопки в ряд?

Я создаю окошко шириной 195 и 4 кнопки в нём, шириной 41, а расстояние между кнопками 5То есть общая ширина компонентов и промежутков 189, и они...

191
Зависимый фон Actionbar от другого цвета

Зависимый фон Actionbar от другого цвета

Все никак не могу найти информациюКак сделать цвет фона ActionBar`a от фона самого приложения

107