IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

3 страниц V < 1 2 3 >  
 Ответить  Открыть новую тему 
> Площадь фигуры,образованная окружностями.
сообщение
Сообщение #21


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


Блин,точно...
Просто у меня уже голова кипит от этой задачи,но цель уже поставлена,поэтому и пытаюсь всякими извращёнными способами достигнуть её.НУ всё же остаётся поставленный вопрос про генерирование точки в посте №18.

Сообщение отредактировано: Vardes -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Гость






Значит, у тебя прямоугольник ограничен -5 <= x <= 6 и -7 <= y <= 4?
randomize;
point_x := random(12) - 5;
point_y := random(12) - 7


Общий случай: чтобы сгенерировать случайное число в интервале [a .. b]:
X := random(b - a + 1) + a;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


Вот реализация части програмного кода,до нахождения max и min значения x и y.
Код


const
pi=3.14159;
var
n,i:integer;
miny,maxy,minx,maxx,r,x,y:real;
mas:array[1..50] of real;
begin
Writeln('‚Введите кол-во окружнростей-');
readln(n);
Writeln('‚Введите радиус окружностей-');
minx:=0;maxx:=0;
miny:=0;maxy:=0;
for i:=1 to n do
readln(mas[i]);
  for i:=1 to n do begin

x:=mas[i]*(cos(2*pi/n*(i-1)));{нахождение декартовых координат}
y:=mas[i]*(sin(2*pi/n*(i-1)));
writeln(x:2:2,'   ',y:2:2);
{нахождение min и max значения x и y}

if x-mas[i]<=minx then minx:=x-mas[i];  
if x+mas[i]>=maxx then maxx:=x+mas[i];
  if y-mas[i]<=miny then miny:=y-mas[i];
    if y+mas[i]>=maxy then maxy:=y+mas[i];
end;
writeln(minx:2:2,'  ',maxx:2:2,'  ',miny:2:2,'  ',maxy:2:2)
end.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Гость






To: Vardes
Ну, и что нам делать с этим кодом? Если уж выкладываешь, то или выкладывай полный код (когда закончишь), или задавай вопросы (если что-то не получается...)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


Правилен ли будет код для генерации случайных точек и их проверки(ссылаясь на код выше),так как у меня идёт зацикливание.
Код

var
found:boolean;
point_x,point_y:integer;
begin
randomize;
point_x:=random(round((maxx-minx+1)+minx));
point_y:=random(round((maxy-miny+1)+miny));
Sum:=0;
For i:=1 to n do
While not found do begin
If Sqrt(sqr(point_x-x)+sqr(point_y-y))<=mas[i] then found:=true;
Inc(Sum);
end;


Сообщение отредактировано: Vardes -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Гость






point_x:=random(round(maxx-minx+1))+minx;
point_y:=random(round(maxy-miny+1))+miny;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #27


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


Всё исправил,но всё равно идёт зацикливание. не пойму в чём дело.
Код
const
pi=3.14159;
var
found:boolean;
sum,n,i:integer;
point_x,point_y,miny,maxy,minx,maxx,r,x,y:real;
mas:array[1..50] of real;
begin
Writeln('‚Введите кол-во окружнростей-');
readln(n);
Writeln('‚Введите радиус окружностей-');
minx:=0;maxx:=0;
miny:=0;maxy:=0;
for i:=1 to n do
readln(mas[i]);
 for i:=1 to n do begin

x:=mas[i]*(cos(2*pi/n*(i-1)));{нахождение декартовых координат}
y:=mas[i]*(sin(2*pi/n*(i-1)));
writeln(x:2:2,'   ',y:2:2);
{нахождение min и max значения x и y}

if x-mas[i]<=minx then minx:=x-mas[i];  
if x+mas[i]>=maxx then maxx:=x+mas[i];
 if y-mas[i]<=miny then miny:=y-mas[i];
   if y+mas[i]>=maxy then maxy:=y+mas[i];
end;
writeln(minx:2:2,'  ',maxx:2:2,'  ',miny:2:2,'  ',maxy:2:2)
begin
randomize;
point_x:=random(round(maxx-minx+1))+minx;
point_y:=random(round(maxy-miny+1))+miny;
Sum:=0;
For i:=1 to n do
While not found do begin
If Sqrt(sqr(point_x-x)+sqr(point_y-y))<=mas[i] then found:=true;
Inc(Sum);
end;
writeln(sum);
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #28


Гость






Данные, которые вводишь, приведи... И объясни, что значит "зацикливание"...

Ну, я же тебе не так говорил делать !!! Внимательно читай пост №20.
Условие под последним While может и не закончиться. Вот так перепиши его (нужно же ограничивать перебор числом окружностей):
While (i <= n) and (not found) do begin


Кстати, а с каким именно X и Y ты производишь операции? Ты их сохранил куда-то (в массив), когда преобразовал из полярной СК? Я у тебя в коде этого не увидел... Более того, у тебя даже массива для этого не описано...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #29


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


Провожу такой ввод данных:
n- кол-во окружностей и ввожу радиус окружности,переводя его в массив
mas[1..n].Вот и все данные.
Проблема в том,что постоянно работает цикл while как взял i=1,так постоянно и гоняет себя не переходя на др. значения i.Переделал и всё равно гоняет.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #30


Гость






Я тебе уже написал почему... Вот НЕзацикливающийся вариант. Я не проверял все формулы, если там все правильно, то тебе осталось только зациклить генерацию точки, сделать это несколько сот тысяч раз (не меньше 200000-250000, лучше - несколько миллионов), посчитать количество попаданий, и вычислить площадь (как - см. пост №8)...


Прикрепленные файлы
Прикрепленный файл  __circle.pas ( 1.22 килобайт ) Кол-во скачиваний: 349
 К началу страницы 
+ Ответить 
сообщение
Сообщение #31


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


значит генерация происходит по одной точке,если я правильно понимаю.Как же тогда можно генерировать несколько тысяч раз,если у нас промежуток по x[-4:5],а по у [-3;9].Принцип не могу понять.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #32


Гость






var amount: longint;
...
for amount := 1 to 200000 do begin
randomize;
point_x:=random(round(maxx-minx+1))+minx;
point_y:=random(round(maxy-miny+1))+miny;

i := 1; found := False;
While (i <= n) and not found do begin
If Sqrt(sqr(point_x-x[i])+sqr(point_y-y[i]))<=mas[i] then found:=true
else inc(i);
end;
write(point_x:3:3, ', ', point_y:3:3);
if found then writeln(' is inside circle #', i)
else writeln(' is outside');
end;

у тебя сгенерируется 200000 точек и каждая проверится на попадание в фигуру. Только надо организовать подсчет (вместо Writeln)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #33


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


так это всё понятно,я про принцип спрашивал,откуда берётся такое большое кол-во точек,если у нас промежуток маленький.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #34


Гость






To: Vardes
А тебе все равно, какой у тебя промежуток. Если у тебя прямоугольник (граничные точки) размером 5*5, а сама фигура - размером 3*3, я что, не могу сгенерировать 5 миллионов точек, КАЖДАЯ из которых будет находиться в прямоугольнике? И проверить, сколько попадет в фигуру? Пускай из них будет по полмиллиона точек повторяться, это НЕ твоя проблема. Это и есть Monte-Carlo (Метод Рулетки)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #35


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


Ну ведь каждая сгенерированная точка имеет свои координаты,для вещественного типа их можно сколько угодно сгенерировать,а если у нас генерирование идёт целых чисел, да и промежуток небольшой,то как тогда поступать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #36


Гость






Ну, так генерируй с точностью до сотых:
  randomize;
point_x:=(random(100*round(maxx-minx))+100*minx)/100;
point_y:=(random(100*round(maxy-miny))+100*miny)/100;

blush.gif Теперь более ясно? Можно увеличить множитель до 1000, только не перестарайся, макс. число допустимое как параметр для Random должно быть 65535 ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #37


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Vardes, итоговую программу, выложи пожалуйста здесь. Спасибо. (думаю как метериал для FAQ использовать )


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #38


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


А почему тогда одно и то же значение он по 100 раз просматривает.
И ещё вопрос,идёт генерация точек,анализируется например 2 пересекаемые окружности,тогда точки попавшие в область пересечения окружностей будут
суммироваться относительно первой и второй,или только относительно одной из них(в которую они попадут первыми).Что предусматривает метод Монте-Карло?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #39


Гость






To: Vardes
Ты ответы мои ВНИМАТЕЛЬНО читал? Я кому это все пишу?
Цитата(Пост №10)
Как только точка попала в какую-то окружность, вся дальнейшая работа с этой точкой прекращается, ведь она УЖЕ внутри фигуры, и ты переходишь к следующей точке...


Цитата
А почему тогда одно и то же значение он по 100 раз просматривает.

Это ты к чему? КАКОЕ значение "он" (кстати, кто это ОН?) просматривает по 100 раз. Можно более четко выражать свои мысли?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #40


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


Код

write(point_x:3:3, ', ', point_y:3:3);

Если приостановить процесс,то увидишь,что значения сгенерированных точек повторяются.Это как объяснить?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

3 страниц V < 1 2 3 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 0:29
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name