9 / 9 / 3
Регистрация: 17.11.2009
Сообщений: 51
1

Деформация шара при ударе

26.11.2010, 17:45. Показов 1428. Ответов 2
Метки нет (Все метки)

Добрый день!

Мне нужно написать программу, имитирующую движение мяча. Подскажите, пожалуйста, как сделать, чтобы мяч при ударе деформировался?

Я пробую делать так, но не выходит.

C++
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
TForm1 *Form1;
int x, y;     //положение мяча
int dx, dy;   //приращение координат
int r;        // радиус мяча
TColor cBall; //цвет мяча
TColor cBack; //цвет фона
int wp, hp;   //размеры поля
//-----------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
r = 70; //радиус
x = r; y = 50; //начальное положение мяча
dx = 1;
dy = 10;
cBall = (TColor)RGB(217, 217, 25); //цвет мяча
cBack = (TColor)RGB(255, 255, 255);   //цвет поля
Form1->Color = cBack;
wp = Form1->ClientWidth;
hp = Form1->ClientHeight;
//настройка таймера
Timer1->Interval = 30;
Timer1->Enabled = true;
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    // стереть изображение мяча
     Form1->Canvas->Pen->Color = cBack;
     Form1->Canvas->Ellipse(x,y,x+r,y+r);
    // здесь я пытаюсь стереть изображение деформированного мяча, но работает не корректно
     Form1->Canvas->Pen->Color = cBack;
     Form1->Canvas->Ellipse(x,y,x+r+10,y+r-10);
     //вычисляем новое положение мяча
     if ( x > 0 )
     {
        // мяч движется вправо
        if  (x + dx + r >= wp)  dx = -dx;
      
        //мяч движется влево
        if  (x + dx <= 0)  dx = -dx;
    if ( y > 0 )
    {
         // мяч движется вниз
         if (x >= wp) dy = - dy;    
         else
              if (y + dy + r > hp ) dy = -dy;
    }
    else
    {
         //мяч движется вверх
          if ( y + dy - r <= 0 )
         {
             dy = -dy;   
   //здесь я пытаюсь ДЕФОРМИРОВАТЬ при ударе вверх
    Form1->Canvas->Pen->Color = clBlack;
    Form1->Canvas->Brush->Color = clRed;
    Form1->Canvas->Ellipse(x,y,x+r+5,y+r-5);
    Form1->Canvas->Brush->Color = cBack;
         }
    }
    }
    x += dx;
    y += dy;
    //рисуем мяч в новой точке
    Form1->Canvas->Pen->Color = clBlack;
    Form1->Canvas->Brush->Color = clRed;
    Form1->Canvas->Ellipse(x,y,x+r,y+r);
    Form1->Canvas->Brush->Color = cBack;
}
В приведенном коде я пыталась деформировать мяч при ударе вверх, но изображение деформированного мяча перекрывается изображением обычного.
Помогите, пожалуйста, это исправить!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2010, 17:45
Ответы с готовыми решениями:

Найти изменения температуры шара при ударе.
Железный шар, падая свободно, достиг скорости 41 м/с и, ударившись о землю, подскочил на 1.6 м....

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

Определить силу сопротивления грунта при забивании сваи при упругом ударе
От удара копра массой 450 кг. падающего свободно с высоты 5 м., свая массой 150 кг погружается в...

Вращение при ударе
Тут меня тоже интересует принцип решения. К телу приложен импульс (может, это и не сильно...

2
250 / 144 / 21
Регистрация: 14.06.2010
Сообщений: 340
26.11.2010, 22:50 2
В первом приближении я сделал так
C++
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
double x, y;     //ïîëîæåíèå ìÿ÷à
double dx, dy;   //ïðèðàùåíèå êîîðäèíàò
int r,rx,ry;        // ðàäèóñ ìÿ÷à
TColor cBall; //öâåò ìÿ÷à
TColor cBack; //öâåò ôîíà
int wp, hp;   //ðàçìåðû ïîëÿ
double dxConst=0,dyConst=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
r = 70; //ðàäèóñ
rx=70;
ry=70;
x = r; y = r; //íà÷àëüíîå ïîëîæåíèå ìÿ÷à
dx = 10;
dy = 1;
cBall = (TColor)RGB(217, 217, 25); //öâåò ìÿ÷à
cBack = (TColor)RGB(255, 255, 255);   //öâåò ïîëÿ
Form1->Color = cBack;
wp = Form1->ClientWidth;
hp = Form1->ClientHeight;
//íàñòðîéêà òàéìåðà
Timer1->Interval = 30;
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 
    // ñòåðåòü èçîáðàæåíèå ìÿ÷à
     Form1->Canvas->Pen->Color = cBack;
     Form1->Canvas->Ellipse(x-rx,y-ry,x+rx,y+ry);
    // çäåñü ÿ ïûòàþñü ñòåðåòü èçîáðàæåíèå äåôîðìèðîâàííîãî ìÿ÷à, íî ðàáîòàåò íå êîððåêòíî
     Form1->Canvas->Pen->Color = cBack;
   //  Form1->Canvas->Ellipse(x,y,x+r+10,y+r-10);
     //âû÷èñëÿåì íîâîå ïîëîæåíèå ìÿ÷à
     if ( x < r || x > wp-r)
                {
                if (dxConst==0) dxConst=dx;
                dx-=dxConst/3;
                if (x < r) rx=x;
                else rx=wp-x;
                }
     else if (dxConst!=0)
                {
                dx=-dxConst;
                dxConst=0;
                rx=r;
                }
 
 
     if ( y < r || y > hp-r)
                {
                if (dyConst==0) dyConst=dy;
                dy-=dyConst/3;
                if (y < r) ry=y;
                else ry=hp-y;
                }
     else if (dyConst!=0)
                {
                dy=-dyConst;
                dyConst=0;
                ry=r;
                }
 
    x += dx;
    y += dy;
    //ðèñóåì ìÿ÷ â íîâîé òî÷êå
    Form1->Canvas->Pen->Color = clBlack;
    Form1->Canvas->Brush->Color = clRed;
    Form1->Canvas->Ellipse(x-rx,y-ry,x+rx,y+ry);
    Form1->Canvas->Brush->Color = cBack;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
wp = Form1->ClientWidth;
hp = Form1->ClientHeight;
}
//---------------------------------------------------------------------------
В деталях изменения разберешься сам
2
9 / 9 / 3
Регистрация: 17.11.2009
Сообщений: 51
27.11.2010, 11:57  [ТС] 3
Питекантроп, благодарю! очень выручили!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2010, 11:57
Помогаю со студенческими работами здесь

Unity пятно при ударе
Здравствуйте. Вопрос такой, как можно реализовать в unity появление пятна при коллиси с объектами....

Монитор перезагружается при ударе по корпусу
Здравствуйте специалисты! Замучился, помогите пожалуйста! Чинил монитор viewsonic (менял...

Чему равна напряженность поля у поверхности шара; на расстоянии 2 м от центра шара; внутри шара?
Электрический заряд 9 нКл равномерно распределен по поверхности шара радиусом 1 м. Чему равна...

Найдите количество теплоты, выделившееся при ударе
Пуля массой 20 г, летящая со скоростью 100 м/с, застревает в деревянном шаре, летящем ей навстречу...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru