Не уверен, поможет ли это вам, но это часть решения, над которым я работал для той же проблемы.Я не заметил огромного прироста производительности, если бы сделал это таким образом, все еще начинаю останавливаться на 200 частицах, но, возможно, это даст вам некоторые идеи.
C ++ модуль для вычисления x и yкомпоненты гравитационного притяжения на двухмерной плоскости:
#include <Python.h>
#include <math.h>
double _acceleration(double &Vxa, double &Vya, double &Vxb, double &Vyb, double xa, double ya, double xb, double yb, double massa, double massb)
{
double xdiff = xa - xb;
double ydiff = ya - yb;
double distance = sqrt(xdiff*xdiff + ydiff*ydiff) * pow(10, 5);
if (distance <= 0)
distance = 1;
double force = (6.674 * pow(10, -11))*(massa*massb)/(distance*distance);
double acca = force / massa;
double accb = force / massb;
double xcomponent = xdiff/distance;
double ycomponent = ydiff/distance;
Vxa -= acca * xcomponent;
Vya -= acca * ycomponent;
Vxb += accb * xcomponent;
Vyb += accb * ycomponent;
return distance;
}
static PyObject* gforces(PyObject* self, PyObject* args)
{
double Vxa, Vya, Vxb, Vyb, xa, ya, xb, yb, massa, massb, distance;
if (!PyArg_ParseTuple(args, "dddddddddd", &Vxa, &Vya, &Vxb, &Vyb, &xa, &ya, &xb, &yb, &massa, &massb))
return NULL;
distance = _acceleration(Vxa, Vya, Vxb, Vyb, xa, ya, xb, yb, massa, massb);
return Py_BuildValue("ddddd", Vxa, Vya, Vxb, Vyb, distance);
}
static PyMethodDef GForcesMethods[] = {
{"gforces", gforces, METH_VARARGS, "Calculate the x and y acceleration of two masses and the distance between the two."},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
initgforces(void)
{
(void) Py_InitModule("gforces", GForcesMethods);
}
Если вы скомпилируете это как файл pyd, вы должны получить объект python, который вы можете импортировать.Вы должны правильно настроить все параметры компилятора и компоновщика.Я использую dev-C ++ и мои параметры компилятора установлены на -shared -o gforces.pyd, а компоновщик установлен на -lpython27 (убедитесь, что вы используете ту же версию, что вы установили), и добавьте путь к каталогу python для включаемых файлов и библиотек.tabs.
Объект принимает аргументы (p1.speedx, p1.speedy, p2.speedx, p2.speedy, p1.x, p1.y, p2.x, p2.y, p1.mass,p2.mass) и возвращает новые p1.speedx, p1.speedy, p2.speedx, p2.speedy и расстояние между p1 p2.
Используя вышеупомянутый модуль, я также попытался вырезатьнесколько шагов для обнаружения столкновения путем сравнения возвращенного расстояния с суммой радиусов частиц как таковой:
def updateForces(self): #part of a handler class for the particles
prevDone = []
for i in self.planetGroup: #planetGroup is a sprite group from pygame
prevDone.append(i.ID)
for j in self.planetGroup:
if not (j.ID in prevDone): #my particles have unique IDs
distance = i.calcGForce( j ) #calcGForce just calls the above
if distance <= i.radius + j.radius: #object and assigns the returned
#collision handling goes here #values for the x and y speed
#components to the particles
Надеюсь, это немного поможет.Любые дальнейшие советы или указания на грубые ошибки с моей стороны приветствуются, я тоже новичок в этом.