Алгоритм нахождения количества квадратов в данном круге

0

Вот мой рисунок: CLICK

Мне нужно написать программу, которая найдет количество квадратов (1x1), которые мы можем нарисовать в круг заданного радиуса. Квадраты могут быть только нарисованы полностью и помещены как lego blocks- один на другой. В некоторых случаях вершины квадратов могут лежать на круге.

Примеры: для 1- он делает 0, для 2- он дает четыре для 3- 16 квадратов для 4-32 для 5-52.

Я что-то написал, но это не сработает для 5+ (I mean- радиус больше 5). Вот оно: CLICK. В моем code- r - радиус круга, сумма - это сумма всех квадратов, а высота - высота треугольников, которые я пытаюсь "нарисовать" в круг (используя теорему Пифагора).

Now- любая помощь? Является ли мой алгоритм даже правильным? Должен ли я что-то изменить?

  • 0
    Ваш пример выглядит неправильно для меня. Например, посмотрите в синий круг, есть ряд квадратов (примерно половина из тех, которые заняты зелеными прямоугольниками), которые также вписываются в синий круг.
  • 0
    Когда вы говорите «внутри», вы хотите, чтобы квадраты были ВСЯ или ЧАСТИЧНО?
Показать ещё 5 комментариев
Теги:
algorithm
geometry
circle
pythagorean

2 ответа

2
Лучший ответ

Существует проблема окружности Гаусса, которая дает формулу для подсчета целых точек внутри круга заданного радиуса. Вы можете использовать эту логику для подсчета квадратов, которые лежат в круге.

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
0

Первый - круг с радиусом 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 и слишком многословные имена переменных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню