Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2016, 07:36   #1
gusluk
Форумчанин
 
Аватар для gusluk
 
Регистрация: 16.10.2008
Сообщений: 205
По умолчанию Модель частиц

Насмотрелся я тут на досуге разных передачек про вселенную. И захотелось мне, любопытства ради и для разминки мозгов, по моделировать слегка. А именно сваять простенькую модель гравитационного взаимодействия частиц, и посмотреть, как же они так в спиральки то закручиваются. Отобрал вчера у племянника учебник о физике, полистал, подумал немного, и родил.
Частички решил определить через запись
Код:
type
TAtom = record
  X: real;//координаты
  Y: real;
  Z:real;
  r:real;//радиус частицы
  Mass:real;//масса
  u:real;//составляющие скорости
  v:real;
  w:real;
end;
const N=200; G=0.00005;
N-число частиц, G-гравитационная постаянная-по сути в модели это коэффициент пропорцианальности соотносящий массу, расстояние и скорость.

Код:
Procedure interactAtom(i,j:integer); //взаимодействие атомов
var R2,dVcurr,cosV,sinV,Fg,Fq,a:real;
begin
R2:=sqr(Atom[i].X-Atom[j].X)+sqr(Atom[i].Y-Atom[j].Y)+sqr(Atom[i].Z-Atom[j].Z); //квадрат расстояния
Fg:=G*Atom[i].Mass*Atom[j].Mass/R2; //гравитация
a:=Fg/Atom[i].Mass;

dVcurr:=P2PAgle(Atom[i].X,Atom[i].Y,Atom[j].X,Atom[j].Y);
cosV:=cos(dVcurr*3.14159/180);
sinV:=sin(dVcurr*3.14159/180);
Atom[i].u:=Atom[i].u+a*cosV+a*sinV;
Atom[i].v:=Atom[i].v+a*cosV-a*sinV;

dVcurr:=P2PAgle(Atom[i].X,Atom[i].Z,Atom[j].X,Atom[j].Z);
cosV:=cos(dVcurr*3.14159/180);
sinV:=sin(dVcurr*3.14159/180);
Atom[i].u:=Atom[i].u+a*cosV+a*sinV;
Atom[i].w:=Atom[i].w+a*cosV-a*sinV;
end;
Кривенькая реализация гравитации.
Для начала этого достаточно, теперь нужно посмотреть как частицы будут двигаться.
gusluk вне форума Ответить с цитированием
Старый 20.04.2016, 07:47   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

Тоже страдал этим. вот пример в архиве. левая клавиша мыши - запуск. средняя (клик на ролик) - остановить. правая - выход. Но не закручивается. Видать, что-то не учёл....
лучше всего работает на XP. на 7 может тормозить малость.
Вложения
Тип файла: rar SolnSistema.rar (144.3 Кб, 14 просмотров)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 20.04.2016, 10:05   #3
gusluk
Форумчанин
 
Аватар для gusluk
 
Регистрация: 16.10.2008
Сообщений: 205
По умолчанию

NetSpace, а если сделать все в реальном масштабе, будет совсем круто.

Решил добавить слипание частиц, если между ними расстояние меньше заданого, пока это делается так
Код:
procedure StikAtom(i,j:integer);
var A1,A2,k:integer; E1,E2,sumE:real;
begin
A1:=i;
A2:=j;
// u
E1:=Atom[A1].Mass*Atom[A1].u*Atom[A1].u/2;
E2:=Atom[A2].Mass*Atom[A2].u*Atom[A2].u/2;
if Atom[A1].u<0 then E1:=-E1;
if Atom[A2].u<0 then E2:=-E2;
sumE:=E1+E2;
if sumE<0 then k:=-1 else k:=1;
Atom[A1].u:=k*sqrt(abs(sumE)*2/(Atom[A1].Mass+Atom[A2].Mass));
// v
E1:=Atom[A1].Mass*Atom[A1].v*Atom[A1].v/2;
E2:=Atom[A2].Mass*Atom[A2].v*Atom[A2].v/2;
if Atom[A1].v<0 then E1:=-E1;
if Atom[A2].v<0 then E2:=-E2;
sumE:=E1+E2;
if sumE<0 then k:=-1 else k:=1;
Atom[A1].v:=k*sqrt(abs(sumE)*2/(Atom[A1].Mass+Atom[A2].Mass));
//w
E1:=Atom[A1].Mass*Atom[A1].w*Atom[A1].w/2;
E2:=Atom[A2].Mass*Atom[A2].w*Atom[A2].w/2;
if Atom[A1].w<0 then E1:=-E1;
if Atom[A2].w<0 then E2:=-E2;
sumE:=E1+E2;
if sumE<0 then k:=-1 else k:=1;
Atom[A1].w:=k*sqrt(abs(sumE)*2/(Atom[A1].Mass+Atom[A2].Mass));

Atom[A1].Mass:=Atom[A1].Mass+Atom[A2].Mass;
Atom[A2].Mass:=0;
Atom[A1].r:=Power(Atom[A1].Mass/4.188,1/3);
end;
Считается по составляющим кинетической энергии.
В приложении весь проект. Чтоб запустить, надо сначала в оптионсах жмакнуть позишион рандом.
Вложения
Тип файла: rar Atom.rar (398.2 Кб, 11 просмотров)
gusluk вне форума Ответить с цитированием
Старый 20.04.2016, 10:21   #4
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

что-то как-то они все влево ломанулись. там, вы, видать, тёмную материю запихнули....
а вообще, тогда уж начните с Большого Взрыва, когда ваши частички разлетаются во все стороны и притормаживают (Вселенная остывает). а потом они начинают обратно слипаться. и чёрных дыр добавьте - когда всё вещество притягивается к ним с ускорением и начинает излучать (сияние видим) а потом раз - и исчезают...
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 20.04.2016, 12:09   #5
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
SolnSistema.rar (144.3 Кб, 2 просмотров)
Красиво, но направления вращений перепутаны. На Солнечную не похоже.

Цитата:
Сообщение от gusluk Посмотреть сообщение
...надо сначала в оптионсах жмакнуть позишион рандом.
.ехе не закрывается.
При столкновении инфузорий ничего не происходит.
Репутация: полный "0"

Последний раз редактировалось zvygin1964; 20.04.2016 в 12:57.
zvygin1964 вне форума Ответить с цитированием
Старый 20.04.2016, 12:39   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
а если сделать все в реальном масштабе, будет совсем круто.
лучше отдай племяннику учебник по физике и отбери учебник по delphi.
реальный масштаб - это в сколково.

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 21.04.2016, 06:06   #7
gusluk
Форумчанин
 
Аватар для gusluk
 
Регистрация: 16.10.2008
Сообщений: 205
По умолчанию

Да, пока стоп не нажмешь, не закрывается. Но это не баг, это фича
Сам по себе учебник по delphi не особо полезен, нужна практика. А данная задача вполне себе не плохая практика.
gusluk вне форума Ответить с цитированием
Старый 21.04.2016, 06:22   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Учебник по Delphi тут не поможет. Практика вещь да полезная. Но тут стоит причесать код. Не более того. Есть обще принятые стандарты обозначения для данных. Есть библиотеки для работы с векторами и матрицами. Декомпозицию задачи на функций поправить.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 21.04.2016, 07:13   #9
gusluk
Форумчанин
 
Аватар для gusluk
 
Регистрация: 16.10.2008
Сообщений: 205
По умолчанию

Цитата:
Но тут стоит причесать код.
Надо, но думаю рановато, пока что это просто первый набросок.
Цитата:
Есть обще принятые стандарты обозначения для данных.
А тут поподробней пожалуйста. Хотелось бы выяснить, как это правильно делать.
Цитата:
Есть библиотеки для работы с векторами и матрицами.
Хотел кое что сам посчитать, для опыту и ясности.
Цитата:
Декомпозицию задачи на функций поправить.
Чаво? Порусски пожалуйста.

Чего то не пойму, почему у меня созданная gif-анимация прокручивается только один раз? Создается самым простым способом
Код:
gif := TgifImage.Create;
gif.Width := form1.PaintBox1.Width;
gif.Height := form1.PaintBox1.Height;
gif.AnimationSpeed := 50;
gif.Animate := true;
gif.add(ScrBitmap);
...
gif.OptimizeColorMap;
gif.SaveToFile(form2.Edit2.Text);
Вот пример анимации. Точек 20000, G=0.00005

Последний раз редактировалось gusluk; 21.04.2016 в 08:57.
gusluk вне форума Ответить с цитированием
Старый 22.04.2016, 17:05   #10
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Делал я что-то подобное. Задача n тел.
Всякими способами. Сначала просто - малыми приращениями ( вроде - метод Эйлера ), потом - Рунге-Кутты, потом - Эрмита ( там надо рассчитывать еще одну производную - рывок = da/dt).
Неплохо получается по методу Эрмита ( шагом порядка полчаса) - эфемериды тел Солнечной за год считает с ошибкой всего десятки-сотни километров. При масштабах сотни миллионов км, получается ошибка доли угловой секунды.

Но я графику делал - просто рисунки траекторий. Типа этого. Это я считал что-то вроде Из пушки на Луну, или наоборот метеорит с Луны..
Изображения
Тип файла: jpg N_corps.jpg (30.0 Кб, 60 просмотров)
type_Oleg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эффект разбрасывания частиц от курсора (С++, DirectX) _Fobos_ Общие вопросы C/C++ 1 15.03.2016 07:36
сделать программу на C++, которая переводит цветовую модель RGB в модель HSV Kabahol Помощь студентам 5 14.03.2014 19:05
Простая система частиц SaiLight Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 04.04.2013 19:14
Проблема с прозрачностью частиц(DirectX). zipwind Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 21.06.2011 21:54
Восстановление Треков частиц(фитирование) winny Общие вопросы C/C++ 0 01.10.2008 13:55