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

  • Автор темы TaTaaRinN
  • Дата начала
T

TaTaaRinN

Гость
#1
:welcome: нужна помощь!!!!! я написал программу (движется прямоугольник вокруг одной из вершин) и задал Моделирование броуновского движения шарика (n-го количества) т.е. шарик при столкновении отскакивает, отскакивает от стенок и от соударения с другим шариком .
Проблема в чем ?! как написать программу чтоб при столкновении с движущимся прямоугольником шарики отскакивали по законом физики??? =)


*.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Ball.h"
#include <math.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TBall *ball;
double a2, a3, a4, dm=M_PI/30;
int dx=200, dy=100;
int rc = 125, rg = 0 ,rb = 255;
long int color=126*256*256+121*256+150;

int n; //количество шариков
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
int r, d; // все шарики имеют одинаковую скорость и радиус
int i, j;
double x, y, alfa;
TColor cl;
TBall c;
randomize();
n = 5;
d = 10;
r = 10;
ball = new TBall[n];
i = 0;
while (i<n)
{
x = r + random(ClientWidth-2*r) + 2;
y = r + random(ClientHeight-2*r) + 2;
alfa = 2*M_PI*random(1001)/1000;
cl = TColor(RGB(random(256), random(256), random(256)));
c = TBall(x, y, alfa, d, r, cl);
for (j=0; j<i; j++)
if (Dist(c,ball[j]) <= 2*r)
break;
if (j==i)
ball[i++] = c;
}
Form1->DoubleBuffered = true;

a2 = 0;
a3 = -atan(double(dy)/dx);
a4 = -M_PI/2;
Form1->DoubleBuffered = true;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
int i;
Graphics::TBitmap *TheImage = new Graphics::TBitmap();
TheImage->Height = ClientHeight;
TheImage->Width = ClientWidth;
for (i=0; i<n; i++)
ball.Draw(TheImage);
TheImage->Canvas->CopyMode = cmSrcCopy;
Canvas->Draw(0, 0, TheImage);
TheImage->Free();



double xc, yc, x1, y1, x2, y2, x3, y3, x4, y4, r2, r3, r4;
TPoint points[4];

r2 = dx;
r3 = hypot(dx, dy);
r4 = dy;
xc = ClientHeight/2;
yc = ClientWidth/2;
x1 = xc;
y1 = yc;
x2 = x1+r2*cos(a2);
y2 = y1-r2*sin(a2);
x3 = x1+r3*cos(a3);
y3 = y1-r3*sin(a3);
x4 = x1+r4*cos(a4);
y4 = y1-r4*sin(a4);
// TColor color = TColor(RGB(rc, rg,rb));
color++;
Canvas->Brush->Color = color;
Canvas->Pen->Color = color;
/*rc++;
rg++;
rb++; */

points[0] = Point(x1,y1);
points[1] = Point(x2,y2);
points[2] = Point(x3,y3);
points[3] = Point(x4,y4);

Canvas->Polygon(points, 3);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
a2+=dm;
a3+=dm;
a4+=dm;
Invalidate();

double x, y;
int i, j,g,k;
for (i=0; i<n; i++)
ball.NewCoord();
for (i=0; i<n-1; i++)
for (j=i+1; j<n; j++)
Clash(ball, ball[j]);


Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete ball;
}
//---------------------------------------------------------------------------








Ball.cpp


#include <math.h>
#include "Ball.h"
#include "Unit1.h"

TBall::TBall(double xx, double yy, double al, int dd, int rr, TColor cl)
{
x = xx;
y = yy;
alfa = al;
d = dd;
r = rr;
Color = cl;
}

void TBall::Draw(Graphics::TBitmap *TheImage)
{
TheImage->Canvas->Pen->Color = clBlack;
TheImage->Canvas->Brush->Color = clRed;
TheImage->Canvas->Ellipse(x-r, y-r, x+r, y+r);
}

void TBall::NewCoord()
{
double xx, yy;
xx = x + cos(alfa)*d;
yy = y + sin(alfa)*d;
if ((xx<=r) || (xx+r>=Form1->ClientWidth))
alfa = M_PI-alfa;
if ((yy<=r) || (yy+r>=Form1->ClientHeight))
alfa = -alfa;
x += cos(alfa)*d;
y += sin(alfa)*d;
}

double Dist(TBall a, TBall B)
{
return hypot(a.x-b.x, a.y-b.y);
}

void Clash(TBall &b1, TBall &b2)
{
double c;
if (Dist(b1, b2) < b1.r+b2.r)
{
c = b1.alfa;

b1.alfa = b2.alfa;
b2.alfa = c;

b1.NewCoord();
b2.NewCoord();
}
}
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#2
Проблема в чем ?! как написать программу чтоб при столкновении с движущимся прямоугольником шарики отскакивали по законом физики??? =)
Написать алгоритм, который будет отвечать законам физике ;-)))

Скинь исходный код с Билдера, попробую тебе помочь...
Не забудь указать приблизительный вес шаров ;-)) И материал из чего они сделаны ;-))) Или силу упругости можно упустить? ;-)
 
T

TaTaaRinN

Гость
#3
Написать алгоритм, который будет отвечать законам физике ;-)))

Скинь исходный код с Билдера, попробую тебе помочь...
Не забудь указать приблизительный вес шаров ;-)) И материал из чего они сделаны ;-))) Или силу упругости можно упустить? ;-)



54703538 =) переговорим ! там и прогу кину :rolleyes: