Сейчас я опубликую несколько быстрых предложений, а затем рассмотрю больше, когда смогу.
Несмотря на то, что вы прямо указали в своем посте и комментариях, что это будет обработано на процессоре, сделайте это наGPU и использование OpenGL для отображения могут очень помочь.Обработка эффектов десятков тысяч точек с частотой 60 Гц (~ 16 мсек / с) требует большого количества ресурсов процессора, даже если он имеет восемь ядер.
Тем не менее, несколько подготовительных мыслей:
- Как указывает пользовательский треугольник, гравитация падает как квадрат расстояния.На некотором расстоянии вы можете игнорировать эффекты, тем более что все ваши объекты имеют одинаковую массу.
- Учитывая, что вы поддерживаете большое количество масс, возникают проблемы с масштабированием, сохраняя при этом хорошую частоту обновления для взаимодействия иплавная анимация.
- Ваша цель - визуализация. Это означает, что вы можете использовать ярлыки, к которым в противном случае может привести строгая интерпретация математики.На самом деле, я думаю, что по крайней мере некоторые ярлыки необходимы для работы на любой скорости, близкой к желаемой.
- Итерации по массам и всем точкам линии сетки, на которые они влияют, скорее всего, не приведут к привлекательному обновлению графики на скоростях.Ты бы хотел.
- Вам необходимо учитывать суперпозицию и векторов поля .(Я говорю здесь в общем смысле, а не в правильной терминологии.) Каждая масса будет влиять на все пространство вокруг нее.Из любой точки пространства будет некоторый вектор, указывающий на эту массу, длина вектора, представляющая силу притяжения.В любой точке пространства вы сложите векторы.Это может привести к «мертвой точке», когда два разных тела вытягиваются с силами, которые нейтрализуют.
- При большом количестве масс визуализация изогнутых линий сетки может стать настолько сложной, что скорее сбивает с толку, чем просвещает пользователя.Представьте себе эластичный резиновый лист с прикрепленными к нему тысячами стальных гирь, иногда с гирьками, сгруппированными вместе: форма поверхности может выглядеть очень сложно.
- Как писал Маурисио Селе Лопес Белон, вы можете смоделировать поверхность какЭластичный материал - то есть непосредственно реализует «резиновый лист» геометрии поверхности.За исключением использования CUDA и OpenGL на графическом процессоре, я не думаю, что вы заставите это работать, хотя.
- Основным препятствием является время расчета.
- Чтобы минимизировать время вычисления, предварительно вычислите какнасколько это возможно.
- Обратите внимание, что, поскольку ваши массы равны, эффекты этих масс при любом заданном смещении (dx, dy) одинаковы.
- Хотя точки, представляющие массы, могут иметь реальные-значные местоположения, такие как (23.32342, -15.38963) или что-то еще, вы, вероятно, можете (и, вероятно, должны) рассчитать влияние на целочисленную сетку, чтобы упростить вычисления.
Учитывая все это,Я имею в виду быструю технику, которая определяет гравитационное поле вокруг каждой массы как кусок памяти, который (более или менее) ИЛИ объединяется с другой памятью для получения окончательной карты векторов поля.
Тогда естьвопрос рисования.Опять же, использование OpenGL для создания настоящего 3D-представления, которое затем проецируется на 2D-дисплей, было бы моим предпочтительным вариантом.OpenGL может работать на интегрированной графике, и я рекомендую именно так.В противном случае расчеты по изменению 2D-линий сетки как 2D-фигур могут быть сложными.
Помимо этого, вероятно, существуют дополнительные настройки, читы и обходные пути, позволяющие получить что-то разумное, что поможет пользователю визуализировать происходящее, но безпредставление гравитационных полей так точно, как это может показаться некоторым.
Из исходного кода, который я написал просто для того, чтобы показать медленный и менее желательный способ решения проблемы, вот очень грубый пример изгибания линий сетки, рассматривая их как точки, которыеможет быть индивидуально подтянут к каждой массе.Это НЕ способ реалистично относиться к линиям сетки;в коде также есть некоторые ошибки.