Вот мой рисунок: CLICK
Мне нужно написать программу, которая найдет количество квадратов (1x1), которые мы можем нарисовать в круг заданного радиуса. Квадраты могут быть только нарисованы полностью и помещены как lego blocks- один на другой. В некоторых случаях вершины квадратов могут лежать на круге.
Примеры: для 1- он делает 0, для 2- он дает четыре для 3- 16 квадратов для 4-32 для 5-52.
Я что-то написал, но это не сработает для 5+ (I mean- радиус больше 5). Вот оно: CLICK. В моем code- r - радиус круга, сумма - это сумма всех квадратов, а высота - высота треугольников, которые я пытаюсь "нарисовать" в круг (используя теорему Пифагора).
Now- любая помощь? Является ли мой алгоритм даже правильным? Должен ли я что-то изменить?
Существует проблема окружности Гаусса, которая дает формулу для подсчета целых точек внутри круга заданного радиуса. Вы можете использовать эту логику для подсчета квадратов, которые лежат в круге.
N = 4 * Sum[i=1..R] (Floor(Sqrt((R^2-i^2)))
пример:
R = 3
i=1 n1 = Floor(Sqrt(9-1))~Floor(2.8)=2
i=2 n2 = Floor(Sqrt(9-4))~Floor(2.2)=2
i=3 n2 = Floor(Sqrt(9-9))=0
N=4*(n1+n2+n3)=16
Первый - круг с радиусом 5 подходит 60 квадратам 1x1, а не 52. Моя ставка была бы не с точки зрения пунктов [[3,4], [3, -4], [4,3], [ 4, -3], [-4, 3], [-4, -3], [-3, 4], [-3, -4]} при рисовании на бумаге и подсчете не зная, находятся ли они на круге или просто вне его. Они точно на круге.
Второй - ответ MBo привел меня сюда - иногда я ищу StackOverflow для проблемы Гаусса Круга, чтобы узнать, предложил ли кто-то новый, забавный алгоритм.
В-третьих - вот код:
int allSquares=0,
squaredRadius=radius*radius,
sideOfQuarterOfInscribedSquare=(int)(long)(radius/sqrt(2));
for(int x=sideOfQuarterOfInscribedSquare+1;
x<radius;
x++){
allSquares+=(long)sqrt(squaredRadius-x*x);
}
allSquares= allSquares*8+4*sideOfQuarterOfInscribedSquare*sideOfQuarterOfInscribedSquare;
return allSquares;
То, что он делает, просто подсчитывает квадраты внутри одной восьмой круга, за пределами вписанного квадрата. Извините за форматирование hipster и слишком многословные имена переменных.