Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
SonyaR
1

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

25.05.2011, 19:19. Просмотров 1946. Ответов 2
Метки нет (Все метки)


Ребята!!!помогите..нужно программу сделать в delphi:
дана прямоугольная область,в которой происходит движение шариков.каждый шарик имеет свой диаметр.начальные координаты и направление движения шариков определяются случайным образом,скорости шариков одинаковы.при достижении шариком границы области происходит изменение направления движения по закону отражения,причем вводится помеха -5..+5.шарики имеют синий цвет.однако,если происходит пересечение шариков,то все шарики,попадающие в пересечение,закрашиваются красным на время пересечения.предусмотреть добавление и удаление шариков без остановки процесса движения
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.05.2011, 19:19
Ответы с готовыми решениями:

Изменение направления движения
Label1 двигается от левого края к правому при достижении границы формы меняет направление движения...

Перенос текста, при достижении нижней границы div'a
Добрый день. Возник вопрос - возможно ли реализовать перенос текста таким образом, как на...

Модуль Graph. Нарисовать овал, который движется по вертикали. При достижении границы меняет цвет
Нарисовать на экране овал зеленого цвета, который движется по вертикали по центру экрана. При...

Вывод сообщения при достижении определенной области
Есть страница с текстом... Надо сделать так, чтобы когда мы к примеру прокручиваем ее до...

2
2183 / 1253 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
26.05.2011, 10:32 2
нет вопроса! По этому тебе еще никто и не ответил.
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 540
26.05.2011, 19:18 3
1. Создаем новый проект
2. На форму кладем кнопку, размещаем ее по верху экрана (свойство Top = 0). Это будет кнопка создания нового шарика
3. На форму кладем компонент Timer, в его свойствах пишем Enabled: True, Interval: 20
4. В редакторе кода после строчки
Delphi
1
{$R *.DFM}
пишем код
Delphi
1
2
3
4
5
6
7
8
9
10
11
const
  PI = 3.14;
type
  pBall = ^TBall;
  TBall = record     // один шарик
    x, y: Double;    // координаты центра
    dir:  Extended;  // направление (угол в радианах)
    cl:   TColor;    // цвет
  end;
var
  Balls: TList;
5. Щелкаем на кнопке. В созданной процедуре пишем код
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Button1Click(Sender: TObject);
var
  b: pBall;
  Rect: TRect;
begin
  New(b);
 
  if Balls = nil then
    Balls := TList.Create;
 
  Balls.Add(b);
 
  Rect := ClientRect;
  Randomize;
  b^.x   := Random(Rect.Right - 10);
  b^.y   := Random(Rect.Bottom - 10);
  b^.dir := Random(180)/180 * PI;
  b^.cl := clBlue;
end;
6. Щелкаем на Timer1-Events-OnTimer. В созданной процедуре пишем код
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i, j: Integer;
  Rect: TRect;
begin
  Rect := ClientRect;
  for i := 0 to Balls.Count - 1 do begin
    pBall(Balls[i])^.x := pBall(Balls[i])^.x + 5*sin(pBall(Balls[i])^.dir);
    pBall(Balls[i])^.y := pBall(Balls[i])^.y + 5*cos(pBall(Balls[i])^.dir);
 
    if pBall(Balls[i])^.x <= Rect.Left + 10 then
      pBall(Balls[i])^.dir := -pBall(Balls[i])^.dir
    else if pBall(Balls[i])^.x >= Rect.Right - 10 then
      pBall(Balls[i])^.dir := -pBall(Balls[i])^.dir
    else if pBall(Balls[i])^.y <= Rect.Top + Button1.Height + 10 then
      pBall(Balls[i])^.dir := PI-pBall(Balls[i])^.dir
    else if pBall(Balls[i])^.y >= Rect.Bottom - 10 then
      pBall(Balls[i])^.dir := PI-pBall(Balls[i])^.dir;
    pBall(Balls[i])^.cl := clBlue;
  end;
 
  for i := 0 to Balls.Count - 2 do begin
    for j := i + 1 to Balls.Count - 1 do begin
      if sqrt(Power(pBall(Balls[i])^.x - pBall(Balls[j])^.x, 2) +
              Power(pBall(Balls[i])^.y - pBall(Balls[j])^.y, 2)) < 20 then begin
        pBall(Balls[i])^.cl := clRed;
        pBall(Balls[j])^.cl   := clRed;
      end;
    end;
  end;
 
  Canvas.Brush.Color := clBtnFace;
  Canvas.FillRect(Rect);
 
  for i := 0 to Balls.Count - 1 do begin
    Canvas.Brush.Color := pBall(Balls[i])^.cl;
    Canvas.Ellipse(Trunc(pBall(Balls[i])^.x-10), Trunc(pBall(Balls[i])^.y-10),
                   Trunc(pBall(Balls[i])^.x+10), Trunc(pBall(Balls[i])^.y+10));
  end;
end;
7. запускаем, смотрим

Домашнее задание: какие в данной реализации ошибки/недоработки, как их исправить.
Как и что можно оптимизировать.

После выполнения домашнего задания качаем вложение, смотрим (там пример модуля, как
всю эту чехарду можно написать более-менее адекватно. На абсолютную безгрешность вовсе не
претендует, но, по крайней мере, явные ляпы убраны.
1
Вложения
Тип файла: zip 2.ZIP (6.2 Кб, 57 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2011, 19:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.