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

Тема в разделе "C/C++/C#", создана пользователем TaTaaRinN, 24 ноя 2010.

  1. TaTaaRinN

    TaTaaRinN Гость

    :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();
    }
    }
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Написать алгоритм, который будет отвечать законам физике ;-)))

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

    TaTaaRinN Гость




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

Поделиться этой страницей