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

> Моделирование движения шаров
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

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


Вот такое задание:
Даны два шарика диаметром М. Промоделировать движение шариков по всей плоскости экрана. Шарики могут двигаться по прямым линиям. Изменение угла движения после столкновения с границей экрана или друг с другом может быть случайной величиной. Шарик не может вылететь за пределы квадрата. Пользователь может варьировать скорости движения шариков с помощью стрелок управления курсором.

Хотелось бы разобраться в коде программы... ( дело в том, что код не мой)
Объясните пожалуйста назначение каждой из процедур в тексте приведённой ниже программы!


Прикрепленные файлы
Прикрепленный файл  CIRCLES.PAS ( 10.21 килобайт ) Кол-во скачиваний: 757
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


меркантильный
***

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

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


18192123, здравствуй!
Читал НЕ мало твою тему, и прочитав вот это:
Цитата(Lapp @ 18.04.2007 3:19) *

Некто хочет научиться варить суп. Прежде всего он идет на кухню в общаге, хватает с плиты первую попавшуюся кастрюлю, тащит ее к шеф-повару и говорит: "Объясите мне пожалуйста, зачем тут вот эти штуки.." - и показывает на плавающие там обрывки упаковочной бумаги, куски полиэтилена (нет, волосы упоминать не буду, можете не зажмать рты.. smile.gif). Что может сказать шеф-повар? Его спросили не нужно ли это, а именно с какой целью это тут. Прямо показали пальчиком, и заинтересованно и серьезно ждут ответа.. Я думаю, он поступит как в том старом анекдоте из серии про студента кулинарного техникума (у Хазанова было такое амплуа), когда упомянутый студент пришел к врачу с обваренными гениталиями. Он скажет: "вылейте все это на ..."
После этого он прочтет бедному несчастному студенту лекцию на тему о варке супа, и проведет практическое занятие, а также подарит тарелку хорошего супа. А потом скажет, как это свойственно профессорам-шеф-поварам: если что неясно - я к Вашим услугам, милейший.
Но студент, уяснив кое-что (хоть и не много), говорит - а, не хочу я разбираться в его супе. Его суп слишком сложен для меня (и мой семинарист говорит, что мне такой суп никогда не сварить..) Сварю-ка я свой собственный суп.. И варит. Но суп получается горький, пересоленый, мясо в нем не разжевать.. Что делать? Конечно, идти к шеф-повару! И спрашивать: а зачем я сделал так? а почему я сделал этак?..
Понимаешь, если программа небольшая или речь идет о фрагменте, где локализована ошибка - это одно. Но если нужно расхлебывать весь переперченый недосоленный суп...

опечалился сильно, подумав, что супу в твоем приготовлении мы так и не отведаем (а супу надо), потому решил настрогать в твою тему пару "премудрых телег"...
Программу, твою не смотрел, извини, но по кускам кода, в которых ты плаваеш, пытаясь разобраться, диагноз мне стал ясен.
А именно-ТЫ НЕ ПОНИМАЕШЬ ЛОГИКИ ДЕЙСТВИЙ ПРОГРАММЫ, КОТОРАЯ БУДЕТ РЕШАТЬ ТВОЮ ЗАДАЧУ.
Вот смотри: есть шарик, с параметрами (X,Y,R) (пусть R в простейшем случае не меняется) и программа должна постоянно отслеживать их состояние, и причем на основании определенной логики (Если А, то В). Сначала надо было понять эту логику, потом прописать алгоритм, затем уже начинать писать программу, а не наоборот. Ты же сразу пытаешься разобраться в коде (сначала чужом, затем в своем).
(Если все понятно, можешь дальше не читать...)
Да, на первый взгляд простая задача-и чуть ли не на уровень Искуственного Интеллекта тянет...Но не баись-вдвоем не пропадем!-(она чуть проще).
Щас "аз, многогрешный" будет перечить Lapp'у-уже коленки трясуться...
Все советы из раздела "Физика" оставь побоку, поскольку на Паскале можно моделировать не только физическую среду, а какую угодно среду, хватило бы знания программирования, математики и логики, и (главное!) фантазии, творческого воображения и воли...
Я знаю, о чем говорю, потому что изучал Паскаль в рамках предмета "Математич.моделирование электромеханических систем", и там надо было не только написать работающий код, и даже не просто решить систему уравнений, а чтобы эта система уравнений правильно моделировала электродвигатель, и чтобы он работал, т.е. вращался...Так вот: проверка на соответсвие реальной физике в Паскаль не встроена, там можно прописать уравнения и логику, которая моделирует то, чего в природе нет...В твоем случае это означает, что шарики можно заставить пульсировать, отражаться и вообще плясать под балалайку...
Не зацикливайся не на физике процесса (какая захочешь, такая и будет), не на коде-взгляни на проблему шире...(Стереотипное мышление-между нами!-не лучший советчик...)
Это называется "открытый простор"-включи воображение, сначала представь себе идеальный конечный результат (т.е.в твоем случае-какой ты хочешь видеть свою программу), а затем препятствия, которые мешают тебе в его достижении-и не наоборот, иначе твоя мысля отразиться от первого же препятсвия, как шарик от борта, и конечная цель даже в представлении будет неясной...
Приемы раскрытия творческого мышления человека (типа "открытого простора" ), не только известны, но систематизированы. Есть даже ТРИЗ-Теория Решения Изобретательских Задач (если проснулась творческая жилка и решимость самой решить до конца-прочитай об этом всем www.trizland.ru,www.trizminsk.org и др.) и вперед...
(Если все понятно, можешь дальше не читать...)
Теперь о решении твоей задачи-если в Паскале полно возможностей и опций (процедуры, фунции, массивы и др.) для Cod-Master'а типа volvo или Lapp-не пытайся сразу все использовать, используй лишь те, что нужны для решения твоей задачи...Еще раз говорю-задача не на физику, а на корректную логику-вот и рассуждай логически.
Итак, есть шарик, с параметрами (X,Y,R), и для начала один. Есть направления его движения на восемь сторон Верх(V), Верх-Право(VP), Право(P), Низ-Право (NP), Низ (N), Низ-Лево(NL), Лево (L), Верх-Лево(VL).
(Пока берем четырехсторонюю...VP,NP,VL,NL). И изменения направления на границе. Это всё! И все это реализовано в моей простоватой программе:
 program Sharik;
uses graph,crt;
var Gd, Gm, X, Y, R: Integer; Napr: string;
begin
Gd := Detect; InitGraph(Gd, Gm, ' ');
X:=320; Y:=240; R:=10; Napr:='NP';
repeat
setcolor(15);
Line(20, 40,20, 440); Line(20,40,620,40);
Line(620,40,620,440); Line(620,440,20,440);
Circle(X,Y,R);
delay(500);
setcolor(0);
Circle(X,Y,R);
if Napr='VP' then begin
X:=X+1; Y:=Y-1;
end;
if Napr='NP' then begin
X:=X+1; Y:=Y+1;
end;
if Napr='NL' then begin
X:=X-1; Y:=Y+1;
end;
if Napr='VL' then begin
X:=X-1; Y:=Y-1;
end;
if Y=40 then begin
if Napr='VP' then Napr:='NP';
if Napr='VL' then Napr:='NL';
end;
if X=620 then begin
if Napr='VP' then Napr:='VL';
if Napr='NP' then Napr:='NL';
end;
if Y=440 then begin
if Napr='NP' then Napr:='VP';
if Napr='NL' then Napr:='VL';
end;
if X=20 then begin
if Napr='VL' then Napr:='VP';
if Napr='NL' then Napr:='NP';
end;
until keypressed;
CloseGraph
end.

Так вот-это базовая конструкция-хочешь поменять параметры шарика, поменяй X,Y,R, хочешь изменить скорость-вместо X+1 поставь X+N (и для Y тоже, и пропиши N в Var'е), или просто уменьши/увеличь задержку в delay(), хочешь добавь еше шарик-тогда у каждого шарика свои параметры ш1(X1,Y1,R1), ш2(X2,Y2,R2)(И сделай логику для соударения шариков, как я сделал для границ-там все просто), потом сделай ввод переменных скорости и др. с клавиатуры и т.д..Главное-вноси изменения поэтапно, и по изменению за раз-внесла одно-проверила, внесла следующее и т.д. Короче, твори!
"Гуру", Марина, это хорошо, а "своим умом" гораздо лучше. Гуру-он витает в высотах Объектно-Ориентированного Программинга, куда небожителям снизойти до Нас, простых людей...
Будь здорова, Мариночка!
Жму лапку котику на твоем аватарчике!
С нетерпением жду твоего супчика!
Искренне, от души, Чужак.
P.S. а кто посмеяся над сим посланием-тот посмеяся над собой.

Сообщение отредактировано: Чужак -


--------------------
Смысл откроется тебе. Красками играя
Жизнь предстанет как поток без конца и края.


В этом мире порой разбиваютсямечты
Но чтобы он стал другой Вдруг в него приходишь ТЫ...

После странствий и скитаний настают другие времена.
Старая волна уходит и приходит новая волна.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
18192123   Моделирование движения шаров   4.04.2007 1:03
18192123   procedure Change(g1,g2:integer;var n:integer;a:re…   6.04.2007 0:44
Lapp   Марина, извини, но ты выбрала неправильную програм…   6.04.2007 11:54
18192123   Марина, извини, но ты выбрала неправильную програ…   7.04.2007 17:49
18192123   начни с алгоритма.. 1. Меню (где можно выбрат…   8.04.2007 0:31
Tan   Случайно на компе наткнулся на задачку с шариком п…   8.04.2007 2:32
Lapp   1. Меню (где можно выбрать радиус 2-х шариков) …   8.04.2007 13:58
18192123   С помощью стрелок - не очень удобно, поскольку и…   8.04.2007 15:02
volvo   Для того, чтобы начать реализовывать меню (интерфе…   8.04.2007 15:13
18192123   Мои "очень скромные" наработки..... вот …   8.04.2007 20:26
TarasBer   procedure move (x, y, dx, dy : integer); замените…   8.04.2007 20:36
18192123   procedure move (x, y, dx, dy : integer); заменит…   8.04.2007 20:51
volvo   Значит, смотри, в чем твои ошибки: 1) если ты дум…   9.04.2007 5:13
18192123   в момент касания шаром бордюра он затирается - п…   10.04.2007 1:02
Lapp   Марина, я покажу пример программы, которая гоняет …   9.04.2007 18:11
18192123   Марина, я покажу пример программы, которая гоняет…   9.04.2007 22:37
18192123   x1,x2,y1,y2 : real; А это - текстовый мод…   11.04.2007 3:36
Lapp   за что отвечают переменные x1,x2,y1,y2 и Aspect,M…   11.04.2007 5:13
volvo   Потому, что надо сначала менять положение шара, и…   10.04.2007 1:23
18192123   А вот как менять - это уже зависит от того, наско…   10.04.2007 2:56
Lapp   Я хочу делать наиболее реалистично... Про ф-цию -…   10.04.2007 4:41
18192123   возник такой вопрос: если теоретически я должна уп…   12.04.2007 17:43
18192123   Попыталась добавить в программу движение под углом…   13.04.2007 0:49
18192123   Попыталась добавить в программу движение под угло…   14.04.2007 17:45
18192123   .... меню (не знаю, как при выборе одного из пунк…   14.04.2007 21:20
Lapp   если теоретически я должна управлять скоростью дв…   13.04.2007 2:52
18192123   Управляешь с клавы - ну, управляй. А при чем ту…   13.04.2007 12:48
volvo   Насчет #207, которая возникает в balls_hit ... Дл…   14.04.2007 19:01
volvo   Обрамляешь все, что делается в меню Repeat / Unti…   14.04.2007 22:20
18192123   вот такие вопросы появились: 1. если шарики соприк…   14.04.2007 23:54
18192123   вот такие вопросы появились: 1. если шарики сопри…   16.04.2007 2:23
18192123   вот такие вопросы появились: 1. если шарики сопри…   17.04.2007 1:46
18192123   по вопросу2: begin dx := -dx; dy := -dy; x…   17.04.2007 23:05
18192123   а насчёт варьирования скоростями: от чего отталкив…   18.04.2007 1:53
Lapp   а насчёт варьирования скоростями: от чего отталки…   18.04.2007 6:19
18192123   Если у меня положения центров шаров будут находить…   19.04.2007 2:50
Lapp   как должны выглядеть процедуры ..., которые я исп…   19.04.2007 10:29
18192123   Примерно так: по Х: angle:=180-angle; по Y: angle…   19.04.2007 17:46
Lapp   С этим получилось , но в результате , если один и…   20.04.2007 2:47
18192123   Видимо, у тебя один угол на два шара. А надо име…   20.04.2007 12:33
18192123   Мне бы хотелось, чтобы шарики, при столкновении др…   22.04.2007 3:21
18192123   но шарики только проводят друг через друга..... …   22.04.2007 3:42
Lapp   не пойму, в чём причина? Причин несколько. 1. т…   22.04.2007 14:20
18192123   Например, функция balls_hit моогла бы выглядеть …   22.04.2007 19:32
18192123   3. Ты пересчитываешь параметры, но обратно из пр…   23.04.2007 0:38
Lapp   не совсем тебя поняла....какие параметры я ещё до…   23.04.2007 4:47
18192123   То же самое касается других параметров, которые…   24.04.2007 1:13
Lapp   Но у меня шарики всё равно проходят друг через др…   24.04.2007 14:14
18192123   3. Скорость персчитывай по ЗСИ по [b]каждой комп…   25.04.2007 0:59
18192123   ты снова забываешь сменить углы.. а как их меня…   23.04.2007 1:01
Lapp   Дальше для каждой компоненты записываешь (на бумаж…   25.04.2007 2:10
18192123   Находишь Vx1' и Vx2' (а также Vy1' и …   25.04.2007 3:10
Lapp   ты имел ввиду Vx1' := ?Нет, я имел в виду т…   25.04.2007 3:38
18192123   Дальше для каждой компоненты записываешь (на бума…   25.04.2007 22:38
18192123   перед тем, как шарики сталкиваются, программа выле…   26.04.2007 23:01
Lapp   перед тем, как шарики сталкиваются, программа выл…   27.04.2007 9:35
18192123   Ошибок в математике не нашла.... (но у меня получи…   28.04.2007 2:41
Lapp   в какой строке это происходит - не разберусь... …   28.04.2007 2:49
18192123   В чем ты работаешь? в ТР/ВР или FPC? ТР   28.04.2007 3:05
Lapp   ТР ТР обычно показывает строку с ошибкой.. Стран…   28.04.2007 3:33
18192123   Перед передачей параметров в эту процедуру, расп…   28.04.2007 23:27
18192123   А если не применять з-ны сохранения ( изменение ск…   29.04.2007 2:58
Чужак   18192123, здравствуй! Читал НЕ мало твою тему,…   29.04.2007 3:16


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

 





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