![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
гравитация и её последствия [Delphi, Windows]
TButton © (2006-05-26 17:57:00)свершилось! =)
я собрал мысли в кучу и вдохновлённый передачей про зарождение солнечной системы в целом и земли в частности
написал систему взаимогравитирующих частиц
прикрутил это к движку на qPixels
(2Д, говорите, не модно)
и получилось собственно вот это
http://slil.ru/22783716
очень долго мучался с настройкой мировых констант
но вроде бы что-то получилось
Cash (2006-05-29 16:05:00) [121]Я тут поколдовал трохи. Бубен хороший взял, потряс над модулем перед
костром предков, и... в общем там:
http://webfile.ru/968300- бинарник
http://webfile.ru/968315- сам модуль с пояснениями внутри.
:)))
Частицы..., аж самому понравились! :)))
XProger (2006-05-29 15:44:00) [122]TButton, присвой указатели забудь про компилятор ;)
TButton (2006-05-29 15:36:00) [123]2 XProger
хм... тут мне компилятор говорит, что один динамический массив другому присвоить нельзя, нет я знаю что динамический массив - четырёхбайтовый указатель на область данных, но почему-то склонен согласиться с компилятором. думаю.
TButton (2006-05-29 12:56:00) [124]2 Cash
про уезжание системы
не смотря на то, что все законы физики соблюдается
и сумарная кинетическая энергия системы всегда равна нулю
система склонна расшатывать сама себя
поэтому центр масс описывает замысловатые фигуры вокруг нулевой точки
об этом уже писал Soughai в 12м посте
проблему эту я пофиксил следующим образом
после инициализации системы я "ручками" меняю параметры нулевой точки
делая её "звездой" (центром системы)
просто выставляю ей нулевые координаты, скорости и массу... очень большую массу =) это гарантирует, что прочие точки будут притягиваться к ней, а следовательно она останется центром системы
2 XProger
сейчас проверю. а ты сравнительные тесты не проводил?
2 Soughai
скоро. возможно сегодня.
Cash (2006-05-29 11:59:00) [125]Вон, лежит, можно брать.
http://webfile.ru/967951
100 объектов, мало но работает хорошо.
Cash (2006-05-29 11:39:00) [126]Ладно, с вращением разобрались. Вот только всетаки уезжает она.
Центр системы уезжает всегда по разному. Но тем не менее, сейчас
запакую и положу на просмотр.
Cash (2006-05-29 10:20:00) [127]TButton © (27.05.06 21:44) [14]:
Знаешь, TButton, я очень люблю танки! Особенно Т34, так люблю, что
поставил туда свой комп! Короче говоря в танке я сейчас и сижу! :)))
Собрал я форму, догадался как массу визуализировать, сделал систему,
а потом пронаблюдал как они все из центра разлетелись. :(
Непонял я как с ними кружиться. Они у меня только разлетаются.
Подскажи Plz, а я покажу, чего это такого я с ней сделал. В 2D через D3D!
Параметры взял с потолка: :)
Init:
n: 100;
m1: 10;
m2: 90;
r: 1;
doTic:
t: 1;
Вот так...
Тикает со скоростью 10..200 раз в сек. 50 по умолчанию.
Soughai (2006-05-29 09:31:00) [128]И это... Очень хочется следующую версию =)
XProger (2006-05-28 00:29:00) [129]TButton, дык исправленный код коллизий дал прирост в скорости? ;)
TButton (2006-05-27 21:44:00) [130]
> вещь красивая кстати =), можно часами наблюдать...
сам прусь =)
> Напрягает, что вся система постоянно уходит куда-то врпаво
> вниз =(
> нада скроллинг космоса замутить =)
это я пофиксил вскоре после того как екзешку залил
сейчас камера центрируется относительно "звезды"
правда иногда подглюкивает
прикручу к проге интерфейс для настройки "мировых констант" и начальных параметров - выложу.
> TButton:
> А как этим модулем пользоваться???
> Тыб форму свою тоже кинул, а то как то мало понятно что
> к чему...
а очень просто. прописываешь модуль uPts в uses формы
создаёшь объект типа tPSys (как глобальную переменную или переменную формы).
инициальзация
sys.Init(<кол-во частиц>, <минимальная масса>, <максимум случайной прибавки к массе>, <радиус системы>);
потом тикаешь (по таймеру или я не знаю как)
sys.Tic(<промежуток времени для которого делается рассчёт>);
чтобы получить данные по частице проще всего - завести переменную типа tPrt и присваивать ей конкретную частицу из системы
p:=sys.pts[n];
что может понадобиться для визуализации
p.m - масса частицы (не знаю как её визуализировать)
p.r - радиус частицы (вычисляется автоматически, как радиус сферы с объёмом равным массе частицы)
p.x, p.y - пространственное положение
(примечание sys:tPSys)
как использую это всё я
* для отображения у меня битмап 640х640
* ТО(точка отсчёта) системы частиц у меня привязана к центру битмапа
т.е. 0:0 ситемы = 320:320 битмапа
* систему я инициализирую с радиусом 1, а визуализирую с радиусом 300 (поэтому в модуле при определении расстояния между частицами сумма радиусов делится на 300. это приведение к единой системе)
* отрисовкой занимается обрубок моего пиксельного движка на базе "быстрых пикселей" (tQuickPixels, можно скачать здесь в статьях)
ну вот так)
если что-то плохо объяснил или есть конкретные вопросы - спрашивай)
Cash (2006-05-27 16:12:00) [131]TButton:
А как этим модулем пользоваться???
Тыб форму свою тоже кинул, а то как то мало понятно что к чему...
Soughai (2006-05-27 15:36:00) [132]Напрягает, что вся система постоянно уходит куда-то врпаво вниз =(
нада скроллинг космоса замутить =)
Soughai (2006-05-27 15:22:00) [133]вещь красивая кстати =), можно часами наблюдать...
TButton (2006-05-27 09:42:00) [134]
> Это не сила. Ибо не "обратнопропорционально квадрату расстояния"
правильно, заметил)
я не заметил)
вот это и называется проверка в две руки)
XProger (2006-05-26 23:39:00) [135]Кстати,
function tPSys.Gravity(p1, p2: tPrt): real;
begin
result:=p1.m*p2.m/Dist(p1,p2)*gamma;
end;
Это не сила. Ибо не "обратнопропорционально квадрату расстояния"
Soughai (2006-05-26 23:38:00) [136]Ух ты млин =)
оптимизировать и оптимизировать =))
XProger (2006-05-26 23:02:00) [137]
function tPSys.DistQ(var p1, p2: tPrt): Single;
begin
Result := sqr(p1.x - p2.x) + sqr(p1.y - p2.y);
end;
procedure tPSys.doCollision;
var
i, j : integer;
pb : array of tPrt;
sr, d : Single;
count : Integer;
begin
for i := 0 to HIGH(pts) do
if pts[i].m 0 then
for j := 0 to HIGH(pts) do
if i j then
begin
sr := sqr((pts[i].r + pts[j].r)/320);
d := DistQ(pts[i], pts[j]);
if d
TButton (2006-05-26 20:43:00) [138]кмтати уже на 600 сотнящ частиц фпс поднимается до 10-11, а после 400 - все 30 положеных
TButton (2006-05-26 20:42:00) [139]re [2], [3]
легко
http://slil.ru/22784148
только там мало комментариев, но там настолько сыро, что всё и так понятно)
re[4]
почему никакой? частица не взаимодействует сама с собой, только с другими частицами.
в оптимизации нуждается коллизия частиц, вот там да. там лес густой) просто я ещё не совсем определился как лучше это оптимизировать)
RzCoDer (2006-05-26 19:56:00) [140]хых, 3 фпс
Я так понимаю, что для каждой частици по отношению к каждой был просто применён закон всемирного тяготения и это всё без какой либо оптимизации? Мугага