โปรแกรมง่ายๆ ในการจำลองสิ่งมีชีวิตประดิษฐ์ในยุคดึกดำบรรพ์โดยใช้กฎแรงดึงดูดหรือแรงผลักอย่างง่ายระหว่างอนุภาคที่มีลักษณะคล้ายอะตอม ทำให้เกิดรูปแบบที่ซับซ้อนเหมือนสิ่งมีชีวิตที่จัดระเบียบตัวเอง หากไม่รวมองค์ประกอบ GUI โค้ดจะน้อยกว่าหนึ่งหน้า วิดีโอสอนและคำแนะนำมีอยู่ด้านล่าง
https://youtu.be/0Kx4Y9TVMGg
คลิกที่นี่เพื่อชมการสาธิตสด (JavaScript):
คุณไม่จำเป็นต้องระบุพารามิเตอร์ให้ตรงกันทั้งหมดเพื่อสร้างรูปแบบเหล่านี้ วิธีที่ดีที่สุดในการรับรูปแบบที่น่าสนใจคือการลองสำรวจพารามิเตอร์แบบสุ่มก่อน เมื่อคุณพบรูปแบบที่น่าสนใจแล้ว ให้ลองค่อยๆ ปรับแต่งอย่างละเอียด เพื่อหลีกเลี่ยงการติดค้างที่ค่าสูงสุดในพื้นที่ คุณสามารถข้ามพารามิเตอร์ขนาดใหญ่ได้เป็นครั้งคราว ด้วยวิธีนี้รูปแบบที่น่าสนใจและแตกต่างจะปรากฏขึ้นมาเรื่อยๆ
ดาวน์โหลด repo นี้ แตกไฟล์ จากนั้นไปที่โฟลเดอร์ /particle_life/bin/ และคลิกที่ particle_life.exe
ซอร์สโค้ดมีอยู่ใน C++, JavaScript และ Python ดูวิดีโอ YouTube นี้เพื่อดูคำแนะนำโดยละเอียด: https://youtu.be/0Kx4Y9TVMGg
หากคุณต้องการสนับสนุนโปรแกรม C++ อัลกอริธึมหลักคือโค้ด 100 บรรทัดแรกที่: "/particle_life/src/ofApp.cpp" ส่วนที่เหลือเป็นส่วนประกอบ GUI และการควบคุมการเรนเดอร์ซึ่งจัดทำโดยไลบรารี openFrameworks ซึ่งเป็นไลบรารีการเรนเดอร์รูปภาพแบบโอเพ่นซอร์สและใช้งานง่าย
ในการเริ่มต้น ให้ดาวน์โหลดพื้นที่เก็บข้อมูลนี้ จากนั้นดาวน์โหลดไลบรารี openFrameworks จากที่นี่: https://openframeworks.cc/ ใช้ projectGenerator ของ openFramework และนำเข้าโฟลเดอร์ /particle_life/ ไปยังโปรเจ็กต์
หรือสร้างโครงการ openFramework ใหม่และเพิ่ม ofxGui เมื่อไฟล์โปรเจ็กต์ถูกสร้างขึ้น ให้แทนที่โฟลเดอร์ /src/ ด้วยโฟลเดอร์ที่ให้ไว้ที่นี่
ตอนนี้คุณสามารถคอมไพล์โค้ด C++ บนเครื่องของคุณได้แล้ว
นอกจากนี้ โปรดดูที่ไฟล์ particle_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 >
การจำลองชีวิตอนุภาค, ซุปดึกดำบรรพ์ - วิวัฒนาการ, เกมแห่งชีวิตของคอนเวย์, ออโตมาตาเซลลูล่าร์, รูปแบบการจัดระเบียบตนเอง,
โครงการนี้ได้รับแรงบันดาลใจจาก: Clusters ของ Jeffery Ventrella http://www.ventrella.com/Clusters/ ฉันไม่สามารถเข้าถึงโค้ดของ Ventrella ได้ แต่ฉันเดาว่าความแตกต่างที่สำคัญของโปรเจ็กต์นี้จากโปรเจ็กต์อนุภาคอื่น ๆ ก็คือฉันไม่ได้ใช้การตรวจจับการชนกัน และทำให้การจำลองอนุภาคนับพันเป็นไปได้แบบเรียลไทม์ นอกจากนี้ ฉันยังเพิ่มการควบคุม GUI เพื่อเปลี่ยนพารามิเตอร์แบบเรียลไทม์ ทำให้ปรับแต่งและสำรวจได้ง่าย ดังนั้น ฉันจึงสามารถค้นหารูปแบบที่ไม่เคยเห็นมาก่อนซึ่งเกิดขึ้นจากแบบจำลองความสัมพันธ์ที่เรียบง่ายอย่างยิ่ง โค้ดที่นี่อาจมีลำดับความสำคัญที่ง่ายกว่าโค้ดชีวิตประดิษฐ์อื่นๆ เพราะฉันเริ่มโค้ดนี้เพียงเพื่อเป็นสื่อการเรียนรู้สำหรับผู้ที่ไม่ใช่โปรแกรมเมอร์และผู้ชมทั่วไป เพื่อพิสูจน์จุดที่ความซับซ้อนสามารถเกิดขึ้นได้จากความเรียบง่าย