Похоже, что это очень сложно и требует глубоких знаний физики, но на самом деле это очень просто, вам нужно знать только 2 формулы и базовое понимание векторов:
Сила притяжения (или гравитационная сила) между планетой 1 и планетой 2 с массой m1 и m2 и расстоянием между ними d: Fg = G * m1 * m2 / d ^ 2; Fg = m * a. G - это константа, найдите ее, подставив случайные значения, чтобы ускорение «а» не было слишком маленьким и не слишком большим, приблизительно «0,01» или «0,1».
Если у вас есть общая векторная сила, которая действует на текущую планету в этот момент времени, вы можете найти мгновенное ускорение a = (общая сила) / (масса текущей планеты). А если у вас есть текущее ускорение, текущая скорость и текущая позиция, вы можете найти новую скорость и новую позицию
Если вы хотите выглядеть реально, вы можете использовать следующий сверхлегкий алгоритм (псевдокод):
int n; // # of planets
Vector2D planetPosition[n];
Vector2D planetVelocity[n]; // initially set by (0, 0)
double planetMass[n];
while (true){
for (int i = 0; i < n; i++){
Vector2D totalForce = (0, 0); // acting on planet i
for (int j = 0; j < n; j++){
if (j == i)
continue; // force between some planet and itself is 0
Fg = G * planetMass[i] * planetMass[j] / distance(i, j) ^ 2;
// Fg is a scalar value representing magnitude of force acting
// between planet[i] and planet[j]
// vectorFg is a vector form of force Fg
// (planetPosition[j] - planetPosition[i]) is a vector value
// (planetPosition[j]-planetPosition[i])/(planetPosition[j]-plantetPosition[i]).magnitude() is a
// unit vector with direction from planet[i] to planet[j]
vectorFg = Fg * (planetPosition[j] - planetPosition[i]) /
(planetPosition[j] - planetPosition[i]).magnitude();
totalForce += vectorFg;
}
Vector2D acceleration = totalForce / planetMass[i];
planetVelocity[i] += acceleration;
}
// it is important to separate two for's, if you want to know why ask in the comments
for (int i = 0; i < n; i++)
planetPosition[i] += planetVelocity[i];
sleep 17 ms;
draw planets;
}
Да, вы можете добавить настраиваемый менеджер напрямую в класс User. Это обезьяна, и она делает ваш код менее удобным в обслуживании (кто-то, пытающийся выяснить ваш код, может не знать, где класс User получил этот настраиваемый менеджер или где они могли бы его найти). В данном случае это относительно безвредно, поскольку вы фактически не переопределяете какое-либо существующее поведение класса User, а просто добавляете что-то новое.
from django.contrib.auth.models import User
User.add_to_class('clients', ClientsManager())
Если вы используете Django 1.1+, вы также можете создать подкласс User с прокси модель ; не влияет на базу данных, но позволит вам подключать дополнительных менеджеров без monkeypatch.
You can user Profile for this
AUTH_PROFILE_MODULE = 'accounts.UserProfile'
When a user profile model has been defined and specified in this manner, each User object will have a method -- get_profile() -- which returns the instance of the user profile model associated with that User.
Or you can write your own authenticate backend. Added it in settings