Вот такое задание: Даны два шарика диаметром М. Промоделировать движение шариков по всей плоскости экрана. Шарики могут двигаться по прямым линиям. Изменение угла движения после столкновения с границей экрана или друг с другом может быть случайной величиной. Шарик не может вылететь за пределы квадрата. Пользователь может варьировать скорости движения шариков с помощью стрелок управления курсором.
Хотелось бы разобраться в коде программы... ( дело в том, что код не мой) Объясните пожалуйста назначение каждой из процедур в тексте приведённой ниже программы!
Если у меня положения центров шаров будут находиться с помощью такой процедуры:
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;
результат - шарики ,когда сталкиваются с границей , движутся вдоль неё и замирают в углу.
как должны выглядеть процедуры ..., которые я использую для изменения направления движения шариков на противоположные при столкновении с границей? Я сделала предположение ,что так: ... результат - шарики ,когда сталкиваются с границей , движутся вдоль неё и замирают в углу.
Нет, не так. Эти процедуры долхны менять угол, а не положение! Примерно так: по Х: angle:=180-angle; по Y: angle:=-angle; Иначе эффект действительно будет похожим на то, что ты говоришь
PS Если в названиях процедур ты подразумевала "изменить", то это слово пишется change. А слово charge означает нечто другое.. И предлог лучше to, а не on. Это так, к слову..
Добавлено через 15 мин. Вообще-то правильние было бы написать не 180, а Pi .. Извиняюсь.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
Примерно так: по Х: 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;
если менять скорость обоих шариков одновременно , то , когда шарики сталкиваются, то они просто сцепливаются.... - не знаю, как это исправить?) столкновение шаров предусмотрено в следующих процедурах:
function value(const r: integer):real; begin value := 4/3*pi*r*r*r; end;
С этим получилось , но в результате , если один из шаров сталкивается с границей, то и второй , где бы он не находился в этот момент, меняет свой угол движения.
Видимо, у тебя один угол на два шара. А надо иметь на каждый шар свой угол.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой