я делаю приложение, выводящее спираль(в целях образования). Но спираль выводится с редкими придатками, в местах отклоняющихся на на количество градусов кратное 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();
}
Никакой ошибки не было, Данные "придатки" появлялись в результате корявого округления. Я просто увеличил ширину пикселя, и оно просто перестало себя проявлять. Всем спасибо за участие.
Чтоб модераторы не ворчали, придётся опубликовать ещё и код. Вот так теперь выглядит отрисовка:
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];
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();
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Как из содержимого массива String[] subStr;, где i = n создать n массивов, уже заполненные содержимым из nНапример i = 3, создать соответственно 3 новых...
Подскажите как можно защитить свой Java продукт от финансовых потерь? В основном беспокоят пиратство и плагиат исходного кодаЯ так понял всякие...
Я создаю окошко шириной 195 и 4 кнопки в нём, шириной 41, а расстояние между кнопками 5То есть общая ширина компонентов и промежутков 189, и они...
Все никак не могу найти информациюКак сделать цвет фона ActionBar`a от фона самого приложения