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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2011, 22:33   #1
daniil123
Пользователь
 
Регистрация: 19.09.2011
Сообщений: 23
По умолчанию Круг на плоскости

Напишите программу для подсчета числа точек с целочисленными координатами, находящихся внутри и на границе круга с заданным радиусом r, центр которого расположена произвольной точке плоскости с координатами(x,y).
На вход программе подаются 3 вещественных числа 0<=r<=1000000, x и y.

Выведите количество искомых точек в этом круге.

Пример:
Вход: 1 0.5 0.5
Выход: 4
daniil123 вне форума Ответить с цитированием
Старый 20.09.2011, 22:59   #2
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Наработки?
Всего-то нужно перебрать все точки, которые находятся в квадрате, ограничивающем круг.
TwiX вне форума Ответить с цитированием
Старый 21.09.2011, 00:49   #3
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Код:
for y:=round(y0-r) to round(y0+r) do
  for x:=round(x0-r) to round(x0+r) do
    if ((x-x0)*(x-x0)+(y-y0)*(y-y0)) < (r*r) then inc(n);
где х0 и у0 - координаты центра, а r - радиус
Другого пока не придумал
JuniorProger вне форума Ответить с цитированием
Старый 21.09.2011, 01:47   #4
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от JuniorProger Посмотреть сообщение
Другого пока не придумал
Полагаю, тут другое и не требуется )). Только нужно заменить < на <=, поскольку граница включена. И не забыть инициализировать n нулем. А также желательно (но, думаю, не обязательно) добавить точность.
+1
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 21.09.2011, 14:54   #5
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
Всего-то нужно перебрать все точки, которые находятся в квадрате, ограничивающем круг.
Особенно при R=1 000 000
puporev вне форума Ответить с цитированием
Старый 21.09.2011, 23:45   #6
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Цитата:
Сообщение от TinMan Посмотреть сообщение
Только нужно заменить < на <=, поскольку граница включена.
ТОЧНО! Я ошибся

Цитата:
Сообщение от puporev Посмотреть сообщение
Особенно при R=1 000 000
ОК! Такое тоже может быть. Я придумал еще вариант. Думаю так даже лучше

Код:
n:=0;
for y:=trunc(y0-r) to trunc(y0+r) do begin
  left_border:=trunc(x0-sqrt(sqr(r)-sqr(y-y0)));
  right_border:=trunc(x0+sqrt(sqr(r)-sqr(y-y0)));
  for x:=left_border to right_border do
    inc(n);
end;
И еще вариант:
Код:
n:=0;
for y:=trunc(y0-r) to trunc(y0+r) do begin
  left_border:=trunc(x0-sqrt(sqr(r)-sqr(y-y0)));
  right_border:=trunc(x0+sqrt(sqr(r)-sqr(y-y0)));
  n:=n+(right_border-left_border+1);
end;
Интересно сравнить результаты. daniil123, попробуй оба варианта и скажи какие результаты для одинаковых входных данных.
P.S. Я сам не запускал, т.к. нет паскаля

Последний раз редактировалось Stilet; 22.09.2011 в 08:39.
JuniorProger вне форума Ответить с цитированием
Старый 22.09.2011, 08:32   #7
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

левый и нижний края нужно
-если x-r или y-r целые, то xr:=trunc(x-r); yr:=trunc(y-r);
-дробное trunc(x-r)+1; trunc(y-r)+1;
правый и верхний в любом случае xr:=trunc(x+r); yr:=trunc(y+r);
и не всегда это будет квадрат.
puporev вне форума Ответить с цитированием
Старый 25.09.2011, 14:02   #8
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

ребят вы чо, школьну математику забыли
Xo, Yo - коордианты центра (неважно в каком виде целом или вещественном)
R - радиус окружности
Код:
var A : double;
for i:=0 to 36 do
begin
 A:=pi*i/180;
 X:=round(Xo+R*cos(A));
 Y:=round(Yo+R*sin(A));
end;
X,Y вгутри цыкла можно поместить в массив TPoint и разрисовать через windws.polygon можно и поточечно
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 27.09.2011, 04:38   #9
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
ребят вы чо, школьну математику забыли
Xo, Yo - коордианты центра (неважно в каком виде целом или вещественном)
R - радиус окружности
Код:
var A : double;
for i:=0 to 36 do
begin
 A:=pi*i/180;
 X:=round(Xo+R*cos(A));
 Y:=round(Yo+R*sin(A));
end;
X,Y вгутри цыкла можно поместить в массив TPoint и разрисовать через windws.polygon можно и поточечно
Я не говорю, что неправильно, но я не могу понять:

1. Откуда взялись эти уравнения?
2. Какие прямые образуют угол А? И почему его значение не превышает pi/5 ?
3. Какой параметр показывает количество точек?

Последний раз редактировалось JuniorProger; 27.09.2011 в 04:42.
JuniorProger вне форума Ответить с цитированием
Старый 27.09.2011, 08:05   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Откуда взялись эти уравнения?
Из учебников математики. http://ru.wikipedia.org/wiki/%D0%9E%...81%D1%82%D1%8C
Цитата:
Окружность также можно описать с помощью параметрического уравнения:
Цитата:
Какой параметр показывает количество точек?
Счетчик цикла.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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