forked from elastomania/across
-
Notifications
You must be signed in to change notification settings - Fork 0
/
BEALLIT.CPP
127 lines (113 loc) · 2.95 KB
/
BEALLIT.CPP
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include "all.h"
// Nem engedi vonalon+egykicsi tovabb kereket!:
static void helyigazitas( kor* pk, vekt2* pt ) {
double hossz = abs( pk->r - *pt );
vekt2 n = (pk->r-*pt)*(1.0/hossz);
if( hossz < pk->sugar-Belsosav )
pk->r = pk->r + n*(pk->sugar-Belsosav-hossz);
}
static double Utodeshatar = 0.5;
// Igazzal ter vissza, ha talppont tenylegesen az:
static int talppontigazitas( kor* pk, vekt2* pt, vekt2 F ) {
double hossz = abs( pk->r - *pt );
vekt2 n = (pk->r-*pt)*(1.0/hossz);
if( n*pk->v > -Elszakadasisebhat && n*F > 0 )
// Nem talppont:
return 0;
// Sebesseg korrigalasa csak n-re meroleges komponensre:
vekt2 kulonbseg = n*pk->v*n;
pk->v = pk->v - kulonbseg;
// Hang:
double ero = abs( kulonbseg );
if( ero > Utodeshatar ) {
ero = ero/Utodeshatar*0.1;
if( ero >= 0.99 )
ero = 0.99;
startwavegyujto( WAV_UTODES, ero, -1 );
}
return 1;
}
// Igaz, ha talppont t1:
static int biztostalppont( vekt2 t1, vekt2 t2, kor* pk, vekt2 F, double M ) {
double hossz = abs( pk->r - t2 );
vekt2 n = (pk->r-t2)*(1.0/hossz);
vekt2 n90 = forgatas90fokkal( n );
double Mtm = M + hossz*n90*F;
if( (t1-t2)*n90*Mtm < 0 )
return 0;
else
return 1;
}
void beallit( kor* pk, vekt2 F, double M, double dt, int kelltalppont ) {
int talppontszam = 0;
vekt2 t1, t2;
if( kelltalppont )
talppontszam = talppontkereses( pk->r, pk->sugar, &t1, &t2 );
if( talppontszam > 0 )
helyigazitas( pk, &t1 );
if( talppontszam > 1 )
helyigazitas( pk, &t2 );
if( talppontszam == 2 ) {
// Megprobalja csokkenteni talppontszamok szama ugy, hogy figyelembe
// veszi masik talppont koruli elfordulast is!:
if( !biztostalppont( t1, t2, pk, F, M ) ) {
talppontszam = 1;
t1 = t2;
}
else {
if( !biztostalppont( t2, t1, pk, F, M ) ) {
talppontszam = 1;
}
}
}
if( talppontszam == 2 ) {
if( !talppontigazitas( pk, &t2, F ) )
talppontszam = 1;
}
if( talppontszam >= 1 ) {
if( !talppontigazitas( pk, &t1, F ) ) {
if( talppontszam == 2 ) {
talppontszam = 1;
t1 = t2;
}
else
talppontszam = 0;
}
}
// Talppontok most mar be vannak allitva!
/*if( talppontszam >= 1 )
pk->utoljaraleert = 1;
else
pk->utoljaraleert = 0;
*/
if( talppontszam == 0 ) {
// Szabadon forog a levegoben:
double beta = M/pk->theta;
pk->omega += beta*dt;
pk->alfa += pk->omega*dt;
vekt2 a = F*(1.0/pk->m);
pk->v = pk->v + a*dt;
pk->r = pk->r + pk->v*dt;
return;
}
if( talppontszam == 2 ) {
// Kerek meg van fogva:
pk->v = Vekt2null;
pk->omega = 0;
return;
}
// Egy talppont korul fordul el kerek:
double hossz = abs( pk->r-t1 );
vekt2 n = (pk->r-t1)*(1.0/hossz);
vekt2 n90 = forgatas90fokkal( n );
pk->omega = pk->v*n90*(1.0/pk->sugar);
M += F*n90*pk->sugar; // M-hez hozzajon meg ero is, mivel talpponthoz
// vonatkoztatjuk!
double thetaszelso = pk->theta+pk->m*hossz*hossz;
double beta = M/thetaszelso;
pk->omega += beta*dt;
pk->alfa += pk->omega*dt;
pk->v = pk->omega*pk->sugar*n90;
pk->r = pk->r + pk->v*dt;
return;
}