Форум программистов, компьютерный форум CyberForum.ru

Моя реализация гравитации на моем физическом движке - C++

Восстановить пароль Регистрация
 
sovaz1997
CEO SOVAZ Corp.
 Аватар для sovaz1997
379 / 225 / 2
Регистрация: 17.12.2011
Сообщений: 816
Записей в блоге: 1
17.11.2013, 17:51     Моя реализация гравитации на моем физическом движке #1
Моя реализация гравитации на моем физическом движке. В общем и целом: движок содержит класс PowerVector (направленная сила). Движок содержит объект круг с параметрами: радиус, плотность, положение, скорость и силы PowerVector, действующие на нее. Все данные разделяются на 2 части: по X и по Y.

На основе этих классов (движка) я написал систему взаимодействий сил гравитации (каждый объект взаимодействует с каждым).

Программа работает на языке Processing. Если хотите посмотреть, как работает эта программа, зайдите на сайт. Там будет ссылка на скачивание. Вставьте туда код и запустите.

P.S. Оцените мою программу (мой подход к решению задачи). Оценивайте строго

Java
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
int widthScreen = 600, heightScreen = 600;
float G = 0.007;
 
//Ellipse ellipse = new Ellipse(300, 300, 2, 0, 20, 1);
System system = new System(10);
 
public class PowerVector {
  private float fx, fy;
  
  public PowerVector(float fx_, float fy_) {
    fx = fx_;
    fy = fy_;
  }
  
  public float getFX() {
    return fx;
  }
  
  public float getVY() {
    return fy;
  }
  
  public float getBoostX(float mass) {
    return (fx / mass); 
  }
  
  public float getBoostY(float mass) {
    return (fy / mass); 
  }
  
  public void changePower(float fx_, float fy_) {
    fx = fx_;
    fy = fy_;
  }
}
 
public class Ellipse {
  private float x, y, r, pa, m, vx, vy, ax, ay;
  private ArrayList<PowerVector>power;
  
  public Ellipse(float x_, float y_, float vx_, float vy_, float r_, float pa_) {
    x = x_;
    y = y_;
    vx = vx_;
    vy = vy_;
    power = new ArrayList<PowerVector>();
    r = r_;
    pa = pa_;
    m = 2 * PI * pow(r, 2) * pa;
  }
  
  public void addPower(PowerVector p) {
    power.add(p);
  }
  
  private void move() {
    ax = 0;
    ay = 0;
    
    for(int i = 0; i < power.size(); ++i) {
      ax += power.get(i).getBoostX(m);
      ay += power.get(i).getBoostY(m);
    }
    
    vx += ax;
    vy += ay;
    x += vx;
    y += vy;
  }
  
  private void draw() {
    stroke(pa / 25);
    fill(pa / 25);
    ellipse(x, y, r, r);
    //println("drawing");
  }
  
  public void run() {
    move();
    draw();
  }
  
  public float getX() {
    return x;
  }
  
  public float getY() {
    return y;
  }
  
  public void removePower() {
    power.clear();
  }
}
 
public class System {
  ArrayList<Ellipse> planet;
  
  public System(int num_planet) {
    planet = new ArrayList<Ellipse>();
    for(int i = 0; i < num_planet; ++i) {
      planet.add(new Ellipse(random(widthScreen), random(heightScreen), 0/*random(4) - 2*/, 0/*random(4) - 2*/, random(30), 5));
    }
  }
  
  /*public void addPlanet() {
    
  }*/
  
  void run() {
    for(int i = 0; i < planet.size(); ++i) {
      for(int j = 0; j < planet.size(); ++j) {
        planet.get(i).addPower(new PowerVector((planet.get(j).getX() - planet.get(i).getX()) * G, (planet.get(j).getY() - planet.get(i).getY()) * G));
      }
    }
    
    for(int i = 0; i < planet.size(); ++i) {
      planet.get(i).run();
    }
    
    for(int i = 0; i < planet.size(); ++i) {
      planet.get(i).removePower();
    }
  }
}
 
void setup() {
  size(widthScreen, heightScreen);
  smooth();
}
 
void draw() {
  background(255);
  system.run();
}
Добавлено через 2 минуты
P.S. Подскажите, если я что-то упустил. Физический движок я только начал писать. В будущем собираюсь добавить другие объекты: упругость, трение, жидкости. Это только начало.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2013, 17:51     Моя реализация гравитации на моем физическом движке
Посмотрите здесь:

Не могу скомпилировать программу на движке ODE C++
Что не так в моем коде? C++
C++ Моя реализация функции перевода string в int
Моя реализация функции перевода STRING в DOUBLE C++
C++ Адреса переменных в моем ноуте
Нужна программа расчета полета мяча с учетом гравитации C++
C++ реализация функции c_str() в моем классе Str
Как на физическом уровне работает компоновщик в приведенном случае C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 02:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru