Простая программа для моделирования примитивной искусственной жизни с использованием простых правил притяжения или отталкивания между атомоподобными частицами, создавая сложные самоорганизующиеся модели, подобные жизни. Если исключить элементы графического интерфейса, код занимает меньше страницы. Видеоурок и пошаговое руководство доступны ниже.
https://youtu.be/0Kx4Y9TVMGg
Нажмите здесь, чтобы просмотреть живую демонстрацию (JavaScript):
Вам не нужно быть точным с параметрами, чтобы воспроизвести эти шаблоны. Лучший способ получить интересные шаблоны — сначала попробовать исследование случайных параметров. Как только вы найдете интересный шаблон, попробуйте постепенно его настроить. Чтобы не застрять на локальном максимуме, вы можете время от времени совершать большие скачки параметров. Таким образом, будут продолжать появляться интересные и разнообразные модели.
Загрузите этот репозиторий. разархивируйте файл, затем перейдите в папку /particle_life/bin/ и нажмите частицу_life.exe.
Исходный код доступен на C++, JavaScript и Python. Посмотрите это видео на YouTube с пошаговым руководством: https://youtu.be/0Kx4Y9TVMGg.
Если вы хотите внести свой вклад в программу C++, основной алгоритм — это первые 100 строк кода по адресу: «/particle_life/src/ofApp.cpp». Остальное — это компоненты графического пользовательского интерфейса и элементы управления рендерингом, которые предоставляются библиотекой openFrameworks — простой в использовании библиотекой рендеринга изображений с открытым исходным кодом.
Для начала загрузите этот репозиторий, а затем загрузите библиотеку openFrameworks отсюда: https://openframeworks.cc/. Используйте projectGenerator openFramework и импортируйте папку /particle_life/ в проект.
Альтернативно создайте новый проект openFramework и добавьте ofxGui. После создания файлов проекта замените папку /src/ на папку, представленную здесь.
Теперь вы можете скомпилировать код C++ на своем компьютере.
Кроме того, посмотрите более оптимизированную версию файлаarticle_life.html — спасибо тем, кто внес свой вклад.
< canvas id =" life " width =" 500 " height =" 500 " > </ canvas >
< script >
//Hunar Ahmad @ brainxyz
m = document . getElementById ( "life" ) . getContext ( "2d" ) ;
draw = ( x , y , c , s ) => {
m . fillStyle = c ;
m . fillRect ( x , y , s , s ) ;
} ;
atoms = [ ] ;
atom = ( x , y , c ) => {
return { x : x , y : y , vx : 0 , vy : 0 , color : c } ;
} ;
random = ( ) => {
return Math . random ( ) * 400 + 50 ;
} ;
create = ( number , color ) => {
group = [ ] ;
for ( let i = 0 ; i < number ; i ++ ) {
group . push ( atom ( random ( ) , random ( ) , color ) ) ;
atoms . push ( group [ i ] ) ;
}
return group ;
} ;
rule = ( atoms1 , atoms2 , g ) => {
for ( let i = 0 ; i < atoms1 . length ; i ++ ) {
fx = 0 ;
fy = 0 ;
for ( let j = 0 ; j < atoms2 . length ; j ++ ) {
a = atoms1 [ i ] ;
b = atoms2 [ j ] ;
dx = a . x - b . x ;
dy = a . y - b . y ;
d = Math . sqrt ( dx * dx + dy * dy ) ;
if ( d > 0 && d < 80 ) {
F = ( g * 1 ) / d ;
fx += F * dx ;
fy += F * dy ;
}
}
a . vx = ( a . vx + fx ) * 0.5 ;
a . vy = ( a . vy + fy ) * 0.5 ;
a . x += a . vx ;
a . y += a . vy ;
if ( a . x <= 0 || a . x >= 500 ) { a . vx *= - 1 ; }
if ( a . y <= 0 || a . y >= 500 ) { a . vy *= - 1 ; }
}
} ;
yellow = create ( 200 , "yellow" ) ;
red = create ( 200 , "red" ) ;
green = create ( 200 , "green" ) ;
update = ( ) => {
rule ( green , green , - 0.32 ) ;
rule ( green , red , - 0.17 ) ;
rule ( green , yellow , 0.34 ) ;
rule ( red , red , - 0.1 ) ;
rule ( red , green , - 0.34 ) ;
rule ( yellow , yellow , 0.15 ) ;
rule ( yellow , green , - 0.2 ) ;
m . clearRect ( 0 , 0 , 500 , 500 ) ;
draw ( 0 , 0 , "black" , 500 ) ;
for ( i = 0 ; i < atoms . length ; i ++ ) {
draw ( atoms [ i ] . x , atoms [ i ] . y , atoms [ i ] . color , 5 ) ;
}
requestAnimationFrame ( update ) ;
} ;
update ( ) ;
</ script >
Моделирование жизни частиц, Первичный суп — эволюция, Игра жизни Конвея, Клеточные автоматы, Паттерны самоорганизации,
Этот проект был вдохновлен: Кластерами Джеффри Вентреллы http://www.ventrella.com/Clusters/. У меня нет доступа к коду Вентреллы, но я думаю, что главное отличие этого проекта от других проектов жизни частиц заключается в том, что я не реализовал обнаружение столкновений, и это сделало возможным моделирование тысяч частиц в реальном времени. Кроме того, я добавил элементы управления графическим интерфейсом для изменения параметров в режиме реального времени, что позволяет легко выполнять точную настройку и исследование, следовательно, я смог обнаружить некоторые ранее не встречавшиеся закономерности, возникающие из некоторых чрезвычайно простых моделей отношений. Код здесь, вероятно, на порядок проще, чем любые другие коды искусственной жизни, потому что я начал этот код исключительно как учебный материал для непрограммистов и широкой аудитории, чтобы доказать, что сложность может возникнуть из простоты.