Я застрял с домашним заданием; у кого-нибудь есть идея?
Задача: Реализовать рекурсивный метод boxed(двойной[] центр, двойной радиус), который рисует фигуру следующим образом:
(Внешний квадрат — это край изображения.) Центр массива содержит координаты x и y центра всех квадратов, тогда как радиус равен половине длины квадрата. Внутренние квадраты всегда повернуты на 45°. Метод должен прекратить рисование, когда радиус меньше одного пикселя.
Были даны другие методы. Этот рисует квадрат, повернутый на двойной угол:
private static void squareRotated(double[] center, double radius, double angle) {
double[] upperLeft = {-radius, radius};
double[] upperRight = {radius, radius};
double[] lowerLeft = {-radius, -radius};
double[] lowerRight = {radius, -radius};
double[] rotUpperLeft = rotatePoint(upperLeft,angle);
double[] rotUpperRight = rotatePoint(upperRight,angle);
double[] rotLowerLeft = rotatePoint(lowerLeft,angle);
double[] rotLowerRight = rotatePoint(lowerRight,angle);
StdDraw.polygon(new double[]{rotUpperLeft[0]+center[0],rotUpperRight[0]+center[0],
rotLowerRight[0]+center[0],rotLowerLeft[0]+center[0]},
new double[]{rotUpperLeft[1]+center[1],rotUpperRight[1]+center[1],
rotLowerRight[1]+center[1],rotLowerLeft[1]+center[1]});
}
Этот поворачивает точку на двойной угол:
private static double[] rotatePoint(double[] point, double angle) {
double[] result = new double[2];
result[0] = point[0]*Math.cos(angle) - point[1]*Math.sin(angle);
result[1] = point[0]*Math.sin(angle) + point[1]*Math.cos(angle);
return result;
}
}
Это мой код:
private static double angle = 0;
private static void boxed(double[] center, double radius) {
if (radius > (double) 1/512) {
squareRotated(center, radius, angle);
angle += Math.PI/4;
boxed(center, Math.sqrt(radius*radius + radius*radius)/2);
}
}
Это работает, но есть ли способ избежать частного статического двойного угла? Мне не разрешено добавлять в метод третий параметр, и я должен решать его с помощью рекурсии.