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

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


Профи
****

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

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


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

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


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


Профи
****

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

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


Мне бы хотелось, чтобы шарики, при столкновении друг с другом, изменяли угол движения... но добиться этого не удаётся:

{изменяем скорость и угол после столкновения}
procedure after_hit (spee1, speed2 : integer; x1, y1, x2, y2 : integer; angle1, angle2 : single);
var m1, m2 : real;
begin
m1 := value(r1);
m2 := value(r2);
speed1 := round((2*m2*speed2 + (m1-m2)*speed1)/(m1+m2));
speed2 := round((2*m1*speed1 + (m2-m1)*speed2)/(m1+m2));
x1 := round(x1 + speed1*cos(pi-angle1));
y1 := round(y1 + speed1*sin(-angle1));
x2 := round(x2 + speed2*cos(pi-angle2));
y2 := round(y2 + speed2*sin(-angle2));
end;

{проверка на столкновение}
function balls_hit (const r1,r2 : integer; x1,y1,x2,y2 : integer) : boolean;
var
dist : real;
t1, t2, t3, t4, t5: real;
begin
t1 := abs(x2-x1); t2 := sqr(t1);
t3 := abs(y2-y1); t4 := sqr(t3);
t5 := t2 + t4;
dist := sqrt(t5);

balls_hit := (dist < (r1 + r2));
end;

{если шары стлкнулись - изменяем скорость и угол }
procedure balls_hit_2;
begin
if balls_hit(r1,r2,x1,y1,x2,y2) then after_hit (speed1, speed2, x1, y1,x2, y2,angle1,angle2);
end;



но шарики только проводят друг через друга.....

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


Профи
****

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

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


Цитата(18192123 @ 22.04.2007 0:21) *


но шарики только проводят друг через друга.....

не пойму, в чём причина?

Сообщение отредактировано: 18192123 - 21.04.2007 23:42
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 22.04.2007 10:20
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(18192123 @ 22.04.2007 0:42) *

не пойму, в чём причина?

Причин несколько.
1. ты снова забываешь сменить углы..
2. одна переменная у тебя называется spee1 (должно быть, видимо, speed1)
3. Ты пересчитываешь параметры, но обратно из процедуры они у тебя не передаются. Чтоб передавались, используй декларацию var.

Можно один вопрос? Зачем ты искусственно увеличиваешь код программы? Тебе кажется, так проще? или так от вас требуют препы? Например, функция balls_hit моогла бы выглядеть много короче..
function balls_hit (r1,r2,x1,y1,x2,y2 : integer) : boolean; 
begin
balls_hit := Sqrt(Sqr(x2-x1)+Sqr(y2-y1)) < r1+r2
end;

Разве так не проще? Все сразу видно..



--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
18192123
сообщение 22.04.2007 20:38
Сообщение #5


Профи
****

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

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


Цитата(Lapp @ 22.04.2007 11:20) *


3. Ты пересчитываешь параметры, но обратно из процедуры они у тебя не передаются. Чтоб передавались, используй декларацию var.


не совсем тебя поняла....какие параметры я ещё должна описать внутри ф-ции? (всё, что нужно я уже передаю из программы)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 23.04.2007 0:47
Сообщение #6


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(18192123 @ 22.04.2007 21:38) *

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

Вот смотри - ты вычисляешь переменные:
  x1 := round(x1 + speed1*cos(pi-angle1));
y1 := round(y1 + speed1*sin(-angle1));
x2 := round(x2 + speed2*cos(pi-angle2));
y2 := round(y2 + speed2*sin(-angle2));
end;

- после этого выходишь из процедуры.
Как ты думаешь, что случается с переменными x1,y1,x2,y2? Они просто уничтожаются.
Чтобы они передавались в вызывающую программу, ты должна в описании фрмальных параметров употребить декларацию var :

procedure after_hit (spee1, speed2 : integer; VAR x1, y1, x2, y2 : integer; angle1, angle2 : single);

То же самое касается других параметров, которые ты хочешь передать не только туда, но и обратно.
Это понятно? Прочти про это в учебнике, плз.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
18192123
сообщение 23.04.2007 21:13
Сообщение #7


Профи
****

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

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


Цитата(Lapp @ 23.04.2007 1:47) *



То же самое касается других параметров, которые ты хочешь передать не только туда, но и обратно.
Это понятно? Прочти про это в учебнике, плз.

Да, понятно. Извини, с этим я "стормозила" по полной программе.

Но у меня шарики всё равно проходят друг через друга...

procedure after_hit (var speed1, speed2 : integer; var x1, y1, x2, y2 : integer; var angle1, angle2 : single);
var m1, m2 : real;
begin
m1 := value(r1);
m2 := value(r2);
angle1 := -angle1;
angle2 := pi - angle2;
speed1 := round((2*m2*speed2 + (m1-m2)*speed1)/(m1+m2));
speed2 := round((2*m1*speed1 + (m2-m1)*speed2)/(m1+m2));
x1 := round(x1 + speed1*cos(angle1));
y1 := round(y1 + speed1*sin(angle1));
x2 := round(x2 + speed2*cos(angle2));
y2 := round(y2 + speed2*sin(angle2));
end;


wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 24.04.2007 10:14
Сообщение #8


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(18192123 @ 23.04.2007 22:13) *

Но у меня шарики всё равно проходят друг через друга...

Значит, так.
1. Ты выбрала очень неудобное представление - через углы (модули скоростей и углы). Я рекомендовал тебе давно иметь просто Vx и Vy для каждого шара вместо модуля скорости и угла. Ты бы избежала очень многих проблем (это я все брюзжу про то, что то, что кажется на первый взгляд сложнее, на самом деле легче).

2. Тебе совсем не нужно вычислять координаты (x и y) в этой процедуре. Вычисляй только параметры скорости (в твоем представлении - модуль и угол). Только эти параметры используй в загаловке процедуры и описывай их как var.

3. Скорость персчитывай по ЗСИ по каждой компоненте вектора (Vx и Vy). Для этого сначала высчитай эти компоненты (как модуль скорости умножить на косинус и синус угла), потом для каждой реши уравнение ЗСИ и пересчитай. По этим новым компонентам рассчитай новый модуль скорости и угол. Эти значения нужно вернуть в вызывающую программу.

Вот так все будет работать..

PS
Представление в виде модуля и угла удобно только в реальном пространстве. Если осилишь - переделай всю прогу, замени их на компоненты по осям. Ты сама увидишь, насколько будет проще. Я уж не говорю, что на том способе, который я предлагал в начале (абстрактные координаты) ты могла бы сэкономить себе много дней времени..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 



- Текстовая версия 18.07.2025 5:45
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"