Консультация № 181769
06.01.2011, 11:28
0.00 руб.
10.01.2011, 14:18
0 7 1
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
Помогите пожалуйста с анимацией, никак не получается. Вот полное условие:
Пусть задано уравнение движения точки (снаряда выстреленного из пушки под углом к горизонту) в декартовых прямоугольных координатах:
x(t)=v*cos(Phi)*t
y(t)=v*sin(Phi)*t-(9.8*pow(t,2))/2
Требуется разработать приложение, которое:
1. Выводит на экран траекторию движения точки до момента времени, когда координата примет 0-ое значение;
2. позволяет изменять параметры движения (начальная скорость) (угол между начальным вектором скорости и осью );
3. реализует анимационный эффект полёта снаряда.

Делаю в билдере, т.к. думал, что будет проще, но .... Первое задание сделал через компонент chart. Второе задание через поля редактирования. А вот с 3 заданием проблема. Пытаюсь с помощью встроенного параметра Канвас сделать анимацию, но не получается. Все до чего я дошел, это анимирование построения графика(и то, получается плохо, т.к. строится по пикселям).
Помогите пожалуйста сделать данное задание. Мне без разницы на чем делать, главное чтоб на языке С++.

Обсуждение

давно
Профессор
230118
3054
06.01.2011, 12:08
общий
Выложите тот проект, который есть сейчас, через "мои файлы"
Неизвестный
06.01.2011, 17:16
общий
При прорисовки анимации с помощью параметра Канвас необходимо стирать предыдущее положение объекта, и только потом рисовать его в новом положении. Тогда у Вас получится движение объекта.
Неизвестный
07.01.2011, 22:25
общий
Писал на BuilderC++ 6.
Вот до чего я дошел, правда на 2009 билдере выводит совсем другой график.
Прикрепленные файлы:
b23d930e340705a25fe13989a6c39560.rar
давно
Профессор
230118
3054
10.01.2011, 16:11
общий
это ответ
Здравствуйте, Azarov88!

Вот так попробуйте.
Код:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
double x,y;
double v,phi;
Series1->Clear();
for (int i=0; i<=Edit3->Text; i++)
{
v= StrToFloat(Edit1->Text);
phi=StrToFloat(Edit2->Text)*3.14/180;
x=v*cos(phi)*i;
y=v*sin(phi)*i-4.9*i*i;
StringGrid1->Cells[1][i+1] = x;
StringGrid1->Cells[2][i+1] = y;
if(y<0)
break;
Series1->AddXY(x,y,clRed);
Application->ProcessMessages();

Sleep(200);
x=0;
y=0;
StringGrid1->RowCount++;
}
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
double xx1=0,yy1=0;
double xx2=0,yy2=0;
xx1=StrToFloat(StringGrid1->Cells[1][1]);
yy1=StrToFloat(StringGrid1->Cells[2][1]);
xx2=StrToFloat(StringGrid1->Cells[1][2]);
yy2=StrToFloat(StringGrid1->Cells[2][2]);
Image1->Canvas->MoveTo(xx1,yy1);
Image1->Canvas->LineTo(xx2,yy2);
for (int j=3; j<=StringGrid1->RowCount-5; j++)
{
Sleep(200);
Application->ProcessMessages();
Image1->Canvas->Pen->Color = clWhite;
Image1->Canvas->MoveTo(xx1,yy1);
Image1->Canvas->LineTo(xx2,yy2);
Image1->Canvas->Pen->Color = clWhite;
xx1=xx2;
yy1=yy2;
xx2=StrToFloat(StringGrid1->Cells[1][j]);
yy2=StrToFloat(StringGrid1->Cells[2][j]);
Image1->Canvas->Pen->Color = clBlack;
Image1->Canvas->MoveTo(xx1,yy1);
Image1->Canvas->LineTo(xx2,yy2);
}
}
Неизвестный
10.01.2011, 17:57
общий
Спасибо, но как сделать движение точки, а не построения графика?
давно
Профессор
230118
3054
10.01.2011, 18:34
общий
void __fastcall TForm1::Button2Click(TObject *Sender)
{
double xx1=0,yy1=0;
double xx2=0,yy2=0;
xx1=StrToFloat(StringGrid1->Cells[1][1]);
yy1=StrToFloat(StringGrid1->Cells[2][1]);
xx2=StrToFloat(StringGrid1->Cells[1][2]);
yy2=StrToFloat(StringGrid1->Cells[2][2]);
Image1->Canvas->MoveTo(xx1,yy1);
Image1->Canvas->LineTo(xx2,yy2);
for (int j=3; j<=StringGrid1->RowCount-5; j++)
{
Sleep(200);
Application->ProcessMessages();
Image1->Canvas->Pen->Color = clWhite;
Image1->Canvas->MoveTo(xx1,yy1);
Image1->Canvas->LineTo(xx2,yy2);
Image1->Canvas->Pen->Color = clWhite;
xx1=xx2;
yy1=yy2;
xx2=StrToFloat(StringGrid1->Cells[1][j]);
yy2=StrToFloat(StringGrid1->Cells[2][j]);
Image1->Canvas->Pen->Color = clBlack;
Image1->Canvas->MoveTo(xx1,yy1);
Image1->Canvas->LineTo(xx2,yy2);
}
}
Неизвестный
11.01.2011, 10:33
общий
Советую выкинуть билдер и забыть о нём навсегда

Взять MS VC++ 6.0, создать проект Win32API типа "typical Hello, world", в нём уже сделана обработка отрисовки окна. Всё что остаётся - сделать свою отрисовку вместо вывода "Hello, world" и таймер, по которому будет всё рисоваться.

PS: в аттаче уже готовый проект с ядром, летящим прямолинейно по центру окна, надо только добавить формулы.
Прикрепленные файлы:
ff358cd9a6e16f839c4ea2736b0885c2.zip
Форма ответа