Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2011, 09:24   #11
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

число точек (целочисленных) в круге зависит только от радиуса но не от положения. переносим круг в центр координат.(или начало координат в центр круга) и спокойно считаем.
Код:
m:=0;
for x:=-R to R do 
for y:=_R to R do
  if x*X+y*y <=R*R then inc(m);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 27.09.2011 в 09:30.
evg_m вне форума Ответить с цитированием
Старый 27.09.2011, 10:13   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

evg_m, Вы неправы.
напоминаю условия задачи:
Цитата:
На вход программе подаются 3 вещественных числа 0<=r<=1000000, x и y.
Что Ваш код выдаст для, например, r=7.75 x=0.345 y=6.778 (цифры взяты с потолка, я даже не рисовал круг и не знаю, сколько точек реально попадёт в круг....

как вариант, предложенный JUDAS вообще относится к решению данной задачи - я вообще не понимаю... При чём здесь углы? я уже не говорю про round() - это же найдёт целые точки близкие к окружности, но отнюдь не факт, что лежащие внутри (если снаружи и близко, то тоже посчитается). А внутренние точки как определять?

ну и последнее.
JuniorProger (пост #6) и puporev (пост #7) предложили, имхо, нормальный вариант с перебором по одной оси (количество точек по другой оси будет вычислять по формуле n:=n+(right_border-left_border+1);
Возможно, этот вариант потребует небольших доработок.
Но мне кажется это нормальное, правильное и быстрое решение задачи.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.09.2011, 11:13   #13
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
JuniorProger (пост #6) и puporev (пост #7) предложили, имхо, нормальный вариант с перебором по одной оси (количество точек по другой оси будет вычислять по формуле n:=n+(right_border-left_border+1);
Возможно, этот вариант потребует небольших доработок.
Но мне кажется это нормальное, правильное и быстрое решение задачи.
Да, доработка действительно нужна.. Никто ни разу не обратил внимания на то, что алгоритм зависит от знака границ. Все пользуют функцию Trunc, а она знакозависима. Если аргумент (нецелый) положительный, то результат меньше аргумента, если отрицательный - то больше.

Влияния знака можно избежать, если сдвинуть систему координат на целое число так, чтобы круг находился полностью в положительной области (по x и y). Тогда решение JuniorProger с поправками puporev годится. Либо можно учитывать знак явно при вычислениях границ.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 27.09.2011, 14:55   #14
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

спасибо Stilet !
кстате у меня там ошибка цикл дол 360 ноль пропустил.
Цитата:
вообще относится к решению данной задачи - я вообще не понимаю
не понимаете, полистайте учебник по математике.
Как относится - просто я указал как найти все точки на круге !
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 27.09.2011, 15:10   #15
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Какой бы вариант перебора не был принят, все равно при R=1000000 это либо будет работать очень долго, либо вообще не будет. Вероятно есть способ решения, связанный с какими-то математическими закономерностями.
puporev вне форума Ответить с цитированием
Старый 27.09.2011, 15:18   #16
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
evg_m, Вы неправы.
напоминаю условия задачи:
Цитата:
На вход программе подаются 3 вещественных числа 0<=r<=1000000, x и y.
ну в таком случае
Код:
Rint:=tranc(R)+1; // чуть-чуть больше чем круг
R2:=tranc(R*R); // чтобы много раз не считать
for x:=-Rint to Rint do
for y:=-Rint to Rint do 
  if x*x + y*y <=R2 then inc(m);
хотя да надо еще будет учесть отклонение центра от целочисленной координаты. будем думать.
т. е. будет что-то вроде
Код:
 if (x-dx)*(x-dx) +(y-dy)*(y-dy)<=R2
где dx, dy искомые отклонения от целочисленных. (и они 0<=dx<1)
ну и еще добавить по 1
Код:
Rint=trunc(R)+2
чтобы квадрат заведомо накрыл круг.

P.S. то же в пост #3. с мелкими несущественными нюансами.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 27.09.2011 в 15:46.
evg_m вне форума Ответить с цитированием
Старый 27.09.2011, 15:29   #17
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Из учебников математики. http://ru.wikipedia.org/wiki/%D0%9E%...81%D1%82%D1%8C
Ну во-первых, нужно было сказать, как далее указал сам JUDAS, что в данном решении ошибка!!!
Цитата:
кстате у меня там ошибка цикл дол 360 ноль пропустил
Цитата:
Сообщение от Stilet
Цитата:
Какой параметр показывает количество точек?
Счетчик цикла.
Во-вторых, счетчик цикла дойдёт (с учетом исправленной ошибки) до 360. Т.е. по-вашему в любой окружности 360 точек?
По-моему, это, мягко говоря, ерунда!

Последний раз редактировалось JuniorProger; 27.09.2011 в 15:32.
JuniorProger вне форума Ответить с цитированием
Старый 27.09.2011, 15:35   #18
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ну и последнее.
JuniorProger (пост #6) и puporev (пост #7) предложили, имхо, нормальный вариант с перебором по одной оси (количество точек по другой оси будет вычислять по формуле n:=n+(right_border-left_border+1);
Возможно, этот вариант потребует небольших доработок.
Но мне кажется это нормальное, правильное и быстрое решение задачи.
Я тоже так считаю
JuniorProger вне форума Ответить с цитированием
Старый 27.09.2011, 15:40   #19
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Во-вторых, счетчик цикла дойдёт (с учетом исправленной ошибки) до 360. Т.е. по-вашему в любой окружности 360 точек?
Нет, все целые точки лежат на лучах с углами в целые градусы (0-360). а могут и не лежать
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 27.09.2011, 15:47   #20
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Цитата:
Сообщение от TinMan Посмотреть сообщение
Да, доработка действительно нужна.. Никто ни разу не обратил внимания на то, что алгоритм зависит от знака границ. Все пользуют функцию Trunc, а она знакозависима. Если аргумент (нецелый) положительный, то результат меньше аргумента, если отрицательный - то больше.

Влияния знака можно избежать, если сдвинуть систему координат на целое число так, чтобы круг находился полностью в положительной области (по x и y). Тогда решение JuniorProger с поправками puporev годится. Либо можно учитывать знак явно при вычислениях границ.
Функция trunc не зависит от знака! Сам проверял: она берет целую часть от модуля числа, потом добавляет знак, если был таковой. Поэтому не важно, какое число (положительное или отрицательное), trunc всегда возьмет только целую часть!

И еще хотел добавить, что я учел, что границы могут быть либо:
1. обе положительные;
2. одна положительная другая отрицательная;
3. обе отрицательные.

Нужно всего лишь повнимательнее посмотреть на решение и подумать над ним
Поправки не нужны
JuniorProger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
треугольник и круг zhenya.ya Общие вопросы C/C++ 0 16.05.2011 02:32
Многоугольник и круг Никита_96 Паскаль, Turbo Pascal, PascalABC.NET 2 09.02.2011 21:10
Круг на ассемблере Hesheit Помощь студентам 6 13.05.2009 22:48
Паскаль Круг ! BuTeK1 Паскаль, Turbo Pascal, PascalABC.NET 4 08.01.2009 14:27
точки плоскости, заданные своими координатами, попадают в круг с радиусом R Jondeer Общие вопросы C/C++ 6 16.06.2008 00:06