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

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


Профи
****

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

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


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

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


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


Профи
****

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

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


Если у меня положения центров шаров будут находиться с помощью такой процедуры:

procedure move (var x, y: integer; angle : single; speed : integer);
begin
x := round(x + speed*cos(angle));
y := round(y + speed*sin(angle));
end;



то как должны выглядеть процедуры
procedure charge_on_oppositeX
procedure charge_on_oppositeY, которые я использую для изменения направления движения шариков на противоположные при столкновении с границей?

Я сделала предположение ,что так:

procedure charge_on_oppositeX (var x : integer; speed : integer; angle : single);
var dx : integer;
begin
dx := round(speed*cos(angle)); dx := -dx;
x := x + dx;
end;

результат - шарики ,когда сталкиваются с границей , движутся вдоль неё и замирают в углу.




Прикрепленные файлы
Прикрепленный файл  CIRCLES3.PAS ( 6.17 килобайт ) Кол-во скачиваний: 236
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


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

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

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


Цитата(18192123 @ 18.04.2007 23:50) *

как должны выглядеть процедуры ..., которые я использую для изменения направления движения шариков на противоположные при столкновении с границей?
Я сделала предположение ,что так:
...
результат - шарики ,когда сталкиваются с границей , движутся вдоль неё и замирают в углу.

Нет, не так. Эти процедуры долхны менять угол, а не положение!
Примерно так:
по Х: angle:=180-angle;
по Y: angle:=-angle;
Иначе эффект действительно будет похожим на то, что ты говоришь

PS
Если в названиях процедур ты подразумевала "изменить", то это слово пишется change. А слово charge означает нечто другое.. И предлог лучше to, а не on. Это так, к слову..

Добавлено через 15 мин.
Вообще-то правильние было бы написать не 180, а Pi .. smile.gif
Извиняюсь.


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


Профи
****

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

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


Цитата(Lapp @ 19.04.2007 7:29) *

Примерно так:
по Х: angle:=180-angle;
по Y: angle:=-angle;


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

Как я полагаю, причина в этом:

function angleX (angle : single):single;
begin
angleX := (pi - angle);
end;

function angleY (angle : single): single;
begin
angleY := -angle;
end;

Procedure border (var x, y: integer; r : integer; speed: integer{; angle : single});
begin
if (x + r >= GetMaxX-1) or (x - r <= 1) then angle := angleX(angle);
if (y + r >= GetMaxY-1) or (y - r <= 1) then angle := angleY(angle);
end;




а это вызов процедур ,описанных выше:

begin
draw (x1, y1, r1, white);
draw (x2, y2, r2, red );
delay(15100);
escape (x1, y1, r1, bgC);
escape (x2, y2, r2, bgC);
move (x1, y1, angle, speed1);
move (x2, y2, angle, speed2);
border (x1, y1, r1, speed1{,angle} );
border (x2, y2, r2, speed2{, angle});
balls_hit_2;
end;



если менять скорость обоих шариков одновременно , то , когда шарики сталкиваются, то они просто сцепливаются.... - не знаю, как это исправить?)
столкновение шаров предусмотрено в следующих процедурах:

function value(const r: integer):real;
begin
value := 4/3*pi*r*r*r;
end;

procedure after_hit (spee1, speed2 : integer; x1, y1, x2, y2 : integer; angle : 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(angle));
y1 := round(y1 + speed1*sin(angle));
x2 := round(x2 + speed2*cos(angle));
y2 := round(y2 + speed2*sin(angle));
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,angle);
end;





Сообщение отредактировано: 18192123 -


Прикрепленные файлы
Прикрепленный файл  CIRCLES5.PAS ( 5.96 килобайт ) Кол-во скачиваний: 316
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


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

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

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


Цитата(18192123 @ 19.04.2007 14:46) *

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

Видимо, у тебя один угол на два шара. А надо иметь на каждый шар свой угол.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  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

 





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