Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

(c)Количестов точек в окружности

17K
04 декабря 2007 года
JKJ
32 / / 20.10.2007
Определить количество точек с целыми координатами, находящихся внутри окружности с радиусом R и центром в начале координат.

Тут скорее вопрос не в коде, а в формуле.Для нахождения количества точек с целым радиусом формулу я знаю.Но вот что делать если радиус будет например 3.57?
13K
04 декабря 2007 года
specter
113 / / 28.09.2007
А в чем проблема? приводи к инту
 
Код:
float R = ...;
int count = 0;
count += (int)R * 2;
for ( int i = 1; i < R; ++i )
    count += (int)sqrt(R*R - i*i) * 2 + 1;
17K
04 декабря 2007 года
JKJ
32 / / 20.10.2007
Как оказалось формула пов ычислению точек которую я считал правильной оказалась мыльным пузырем)ТАк что буду очень презнателен если мнее ее напишут.

specter
Если можеш объясни поподробнее нащет этого перевода.
13K
04 декабря 2007 года
specter
113 / / 28.09.2007
Цитата: JKJ
Как оказалось формула пов ычислению точек которую я считал правильной оказалась мыльным пузырем)ТАк что буду очень презнателен если мнее ее напишут.

specter
Если можеш объясни поподробнее нащет этого перевода.


Это уже готовый алгоритм, ток нужна небольшая поправка (правда я его не тестировал)

 
Код:
float R = ...;
int count = 0;
count += (int)R * 2 +1;
for ( int i = 1; i < R; ++i )
    count += ((int)sqrt(R*R - i*i) * 2 + 1)*2;

По поводу алгоритма - при преобразовании вещественного числа к инту отсекаятся дробная часть...
Теперь возьмем точку, где x=0, y будет равен R (нам нужно взять только целую часть)... т.е. точек с целыми координатами будет (int)R * 2 +1
Для твоего примера, когда R = 3.57 мы получим при приведении к инту 3... итого 7 точек по формуле: (0,-3), (0,-2), (0,-1), (0,0), (0,1), (0,2), (0,3)
Далее берем все целые точки от 1 до R... находим значение y (sqrt(R*R - i*i)), отсекам дробную часть и получаем колв-во точек где y больше 0, при умножении на 2 учитываем точки, где y меньше 0... потом +1 - точка где y=0... И еще * на 2 для точек где x < 0... вобщем-то все
13K
05 декабря 2007 года
Alex_soldier
102 / / 29.01.2007
Самый простой способ: прогнать двойной цикл по всем (int)-R <= X <= (int)+R и (int)-R <= Y <= (int)+R с проверкой вхождения.

Самый быстрый способ - пожалуй, перебор змейкой от центра круга.
17K
05 декабря 2007 года
JKJ
32 / / 20.10.2007
 
Код:
float R = ...;
int count = 0;
count += (int)R * 2 +3;
for ( int i = 1; i < R; ++i )
    count += ((int)sqrt(R*R - i*i) * 2 + 1)*2


Так выщитывает,однако только целые числа.

Зачто отвечает команда sqrt?
13K
05 декабря 2007 года
specter
113 / / 28.09.2007
Цитата: JKJ
 
Код:
float R = ...;
int count = 0;
count += (int)R * 2 +3;
for ( int i = 1; i < R; ++i )
    count += ((int)sqrt(R*R - i*i) * 2 + 1)*2


Так выщитывает,однако только целые числа.

Зачто отвечает команда sqrt?


Считает и для вещественных. sqrt - это квадратный корень

353
05 декабря 2007 года
Nixus
840 / / 04.01.2007
Код:
$R = 20;
$s = int($R);

for($j = 1; $j <= $R; $j++)
{
    for($i = 1; $i <= $R; $i++)
    {
        $s++
            if $i*$i + $j*$j <= $R*$R;
    }
}

$s = 4*$s + 1;

print "Точек: $s\n";
13K
05 декабря 2007 года
specter
113 / / 28.09.2007
Цитата: Nixus
Код:
$R = 20;
$s = int($R);

for($j = 1; $j <= $R; $j++)
{
    for($i = 1; $i <= $R; $i++)
    {
        $s++
            if $i*$i + $j*$j <= $R*$R;
    }
}

$s = 4*$s + 1;

print "Точек: $s\n";


На чем это ты написал?
И что за странное условие if $i*$i + $j*$j <= $R*$R;

353
05 декабря 2007 года
Nixus
840 / / 04.01.2007
Это Perl. Можешь считать это абстрактным языком, описывающим алгоритм.

Код:
#include <stdio.h>

const float R = 20.3;

int main()
{
    int s, i, j;

    s = R;
    for(j = 1; j <= R; j++)
    {
        for(i = 1; i <= R; i++)
        {
            if(i*i + j*j <= R*R)
                s++;
        }
    }

    s = 4*s + 1;

    printf("Точек: %i\n", s);
    return 0;
}
17K
05 декабря 2007 года
JKJ
32 / / 20.10.2007
В случае count += (int)R * 2 +3; выщитывет с целым r.
В случае count += (int)R * 2 +1; выщитывает с дробным r.
Проверял на с помощью циркуля^^
ТАк что еще 1 вопрос, как отлечить дробное от целого?(что бы вставить if).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог