С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
SonyaR
0 / 0 / 0
Регистрация: 22.05.2011
Сообщений: 1
1

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

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

Ребята!!!помогите..нужно программу сделать в delphi:
дана прямоугольная область,в которой происходит движение шариков.каждый шарик имеет свой диаметр.начальные координаты и направление движения шариков определяются случайным образом,скорости шариков одинаковы.при достижении шариком границы области происходит изменение направления движения по закону отражения,причем вводится помеха -5..+5.шарики имеют синий цвет.однако,если происходит пересечение шариков,то все шарики,попадающие в пересечение,закрашиваются красным на время пересечения.предусмотреть добавление и удаление шариков без остановки процесса движения
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2011, 19:19
Ответы с готовыми решениями:

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

Направления движения движения кнопок в игре пятнашки
Ребят подскажите как можно задать перемещение кнопок . по какому признаку или...

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

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

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

2
anonimus
2154 / 1244 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
26.05.2011, 10:32 2
нет вопроса! По этому тебе еще никто и не ответил.
0
kukuruku310
197 / 184 / 26
Регистрация: 14.02.2010
Сообщений: 539
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 Кб, 56 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2011, 19:18

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

Изменение того или инного параметра при достижении блока
Господа, подскажите пожалуйста код js, а лучше сss, который бы изменял css...

Происходит выход за границы при нахождении палиндромов
почему выходит за границы ?(( ищу слова палидромы private void...


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

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

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