Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2011, 22:37   #1
g4mer
 
Регистрация: 18.04.2011
Сообщений: 3
По умолчанию Движение "мячика" в прямоугольнике

Добрый вечер форумчане, имеется следующая задача : "Написать программу имитирующую движение "мячика" брошенного под углом в пределах формы с учетом силы тяжести, потери скорости при соприкосновении со стенками нет, угол падения=углу отражения"

Движение задаю этими формулами:
Цитата:
x:=x0+round(Vx*t);
y:=y0-round((Vy*t)-(g*sqr(t)/2));
где:
Цитата:
Vx:=V*cos(a*pi/180);
Vy:=V*sin(a*pi/180);
отладил движение по координате X так:
Цитата:
if x>=clientwidth-r then
begin
Vx:=-Vx;
if n=2 then x0:=n*(clientwidth-r)-r
else x0:=n*(clientwidth-2*r);
end;

if x<=r then
begin
Vx:=-Vx;
x0:=-x0+2*r;
n:=n+2;
end;}
Не получается корректно анимировать движение по координате y, максимум чего добивался это, одного отскока и мяч улетал за пределы формы навечно

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

Также выкладываю исходник, не смейтесь над минималистическим оформлением, это так сказать черновой вариант.
Вложения
Тип файла: rar test2.rar (7.9 Кб, 13 просмотров)
g4mer вне форума Ответить с цитированием
Старый 18.11.2011, 23:57   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls,math;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure getXY;
  end;
const V=100; //Задаем скорость
      a=35; //Задаем угол
      r=20; //Радиус мячика
      dt=0.1; //шаг времени
var
  Form1: TForm1;
  x,y,x0,y0:integer;
  tx,ty:real;
  Vx,Vy:real;
  g:real=9.8;

implementation

{$R *.dfm}

procedure Tform1.getXY; //Получаем новые координаты
begin
  tx:=tx+dt;
  ty:=ty+dt;
  x:=x0+round(Vx*tx);
  y:=y0+(round((Vy*ty)+(g*sqr(tY)/2)));
  if y>=clientheight-r then begin
    Vy:=-Vy;
    y0:=clientheight-r;
    y:=y0;
    ty:=0;
  end
  else if y<=r then begin
    Vy:=-Vy;
    y0:=r;
    y:=y0;
    ty:=0;
  end;
  if x>=clientwidth-r then begin
    Vx:=-Vx;
    x0:=clientwidth-r;
    x:=x0;
    tx:=0;
  end
  else if x<=r then begin
    Vx:=-Vx;
    x0:=r;
    x:=x0;
    tx:=0;
  end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  //Закрашиваем фон
  Canvas.Brush.Style:=bssolid;
  Canvas.Brush.color:=clblack;
  Canvas.FillRect(clientrect);
  //рисуем круг
  Canvas.Brush.Color:=clwhite;
  canvas.Ellipse(x-r,y-r,x+r,y+r);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  x0:=r;
  x:=x0;
  y0:=clientheight-r;
  y:=y0;
  Vx:=V*cos(a*pi/180);
  Vy:=-V*sin(a*pi/180);
  tx:=0;
  ty:=0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  getXY;
  InvalidateRect(form1.Handle, nil, False);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  timer1.Enabled:= not timer1.Enabled;
end;

end.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.11.2011, 01:36   #3
g4mer
 
Регистрация: 18.04.2011
Сообщений: 3
По умолчанию ..

Огромное спасибо!
g4mer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04