This repository has been archived by the owner on Oct 12, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
fisica.cpp
106 lines (93 loc) · 3.39 KB
/
fisica.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
#include "fisica.h"
#include <SDL2/SDL.h>
#include <iostream>
#include "settings.h"
bool outOfBounds(std::vector<Carica>::iterator it) {
bool outside = false;
if (it->getPosition().y > SCREEN_HEIGHT ||
it->getPosition().y < 0) {
outside = true;
} else if (it->getPosition().x > SCREEN_WIDTH ||
it->getPosition().x < 0) {
outside = true;
}
return outside;
}
void simulazioneCampo(std::vector<Sorgente>::iterator &itSorgenti, std::vector<vector2> &mouseVector, float x, float y) {
vector2 intensita;
float valoreForzaCampo;
vector2 distanzaVettore =
distanza(itSorgenti->getPosition(), {x, y});
// LEGGE DI COLOUMB:
//
// F(1->2) = k*(Q1*Q2)
// ------
// r^2
// F = E*q
// Se la carica di prova si trova entro un certo raggio della sorgente, o se si trova fuori dallo schermo, viene eliminata per risparmiare risorse
if (distanzaVettore.modulo != 0) {
valoreForzaCampo =
costanteColoumb * (itSorgenti->getCharge() /
((distanzaVettore.modulo * distanzaVettore.modulo) *
(1.0f / (scala * scala))));
} else {
valoreForzaCampo = 0;
}
if (abilitaLog) {
std::cout << "Valore mouse: \t" << valoreForzaCampo << std::endl;
}
intensita.x = valoreForzaCampo * distanzaVettore.xNormalized;
intensita.y = valoreForzaCampo * distanzaVettore.yNormalized;
intensita.modulo = valoreForzaCampo;
mouseVector.push_back(intensita);
}
void simulazioneCampo(std::vector<Sorgente>::iterator &itSorgenti,
std::vector<Carica>::iterator &it,
std::vector<Carica> &cariche) {
vector2 intensita;
float valoreForzaCampo;
vector2 distanzaVettore =
distanza(itSorgenti->getPosition(), it->getPosition());
// LEGGE DI COLOUMB:
//
// F(1->2) = k*(Q1*Q2)
// ------
// r^2
// F = E*q
// Se la carica di prova si trova entro un certo raggio della sorgente, o se si trova fuori dallo schermo, viene eliminata per risparmiare risorse
if (distanzaVettore.modulo > raggio && !outOfBounds(it)) {
valoreForzaCampo =
costanteColoumb * (itSorgenti->getCharge() /
((distanzaVettore.modulo * distanzaVettore.modulo) *
(1.0f / (scala * scala))));
if (abilitaLog)
std::cout << "Valore: \t" << valoreForzaCampo << std::endl;
intensita.x = valoreForzaCampo * distanzaVettore.xNormalized;
intensita.y = valoreForzaCampo * distanzaVettore.yNormalized;
intensita.modulo = valoreForzaCampo;
it->addForce(intensita);
} else {
cariche.erase(it);
if (abilitaLog)
std::cout << "Cancellazione carica" << std::endl;
it--;
}
}
void simulazioneCampo(std::vector<Sorgente>::iterator &itSorgenti,
std::vector<PuntoDelCampo>::iterator &it) {
vector2 intensita;
float valoreCampo;
vector2 distanzaVettore =
distanza(itSorgenti->getPosition(), it->getPosition());
if (distanzaVettore.modulo != 0) {
valoreCampo =
costanteColoumb * (itSorgenti->getCharge() /
(distanzaVettore.modulo * distanzaVettore.modulo));
} else {
valoreCampo = 0;
}
intensita.x = valoreCampo * distanzaVettore.xNormalized * (1.0f / scala);
intensita.y = valoreCampo * distanzaVettore.yNormalized * (1.0f / scala);
intensita.modulo = valoreCampo;
it->addVector2(intensita);
}