Compare commits
5 Commits
5b525f5949
...
5030fda56f
Author | SHA1 | Date | |
---|---|---|---|
|
5030fda56f | ||
|
329f054fff | ||
|
1552320558 | ||
|
87645472b4 | ||
|
7bf219d77c |
2
BloubWorld/.gitignore
vendored
2
BloubWorld/.gitignore
vendored
@ -7,6 +7,7 @@ nbimg.inc
|
||||
*.mp4
|
||||
*.lst
|
||||
*.wav
|
||||
*.xyz
|
||||
frames/*
|
||||
log.*
|
||||
|
||||
@ -17,4 +18,5 @@ mergebloubs
|
||||
listbloubs
|
||||
essai
|
||||
|
||||
WS/*.data
|
||||
core
|
||||
|
@ -62,7 +62,10 @@ ce qu'il faut pour les différents moteurs de rendu.
|
||||
Bon, pour le moment, dans les formats il n'y a que POVray,
|
||||
mais Gnuplot et/ou Rdata arriveront bien un de ces jours.[source](exportbloubs.f90)
|
||||
|
||||
|
||||
Un exemple : l'idée est de générer un fichier `.inc` pour
|
||||
Povray pour utiliser les données exportées dans une scène,
|
||||
par exemple le barycentre des bloubs. Et c'est très facile
|
||||
à faire avec un [script Awk](toinc.awk).
|
||||
|
||||
### mergebloubs
|
||||
|
||||
|
@ -68,31 +68,37 @@ module bloubspace
|
||||
end subroutine load_boundingbox
|
||||
|
||||
! ----------------------------------------------------------------
|
||||
|
||||
subroutine make_a_random_bloub(blb)
|
||||
!-
|
||||
! coefxyz :
|
||||
! dispersion de la position autour de l'origine
|
||||
!-
|
||||
subroutine make_a_random_bloub(blb, coefxyz)
|
||||
type(t_bloubs), intent (out) :: blb
|
||||
real, intent(in) :: coefxyz
|
||||
|
||||
blb%px = 3.57 * (rand() - 0.50)
|
||||
blb%py = 2.66 * (rand() - 0.50)
|
||||
blb%pz = 3.57 * (rand() - 0.50)
|
||||
! write(0, *) "coef xyz = ", coefxyz
|
||||
blb%px = coefxyz * (rand() - 0.50)
|
||||
blb%py = coefxyz * (rand() - 0.50)
|
||||
blb%pz = coefxyz * (rand() - 0.50)
|
||||
|
||||
blb%vx = (rand()) / 2.500
|
||||
blb%vx = (rand()) / 5.000
|
||||
if (blb%px .LT. 0.0) blb%vx = -blb%vx
|
||||
|
||||
blb%vy = (rand()) / 4.000
|
||||
if (blb%py .LT. 0.0) blb%vy = -blb%vx
|
||||
blb%vy = 0.2 + (rand()) / 8.000
|
||||
if (blb%py .LT. 0.0) blb%vy = -blb%vy
|
||||
|
||||
blb%vz = (rand()) / 2.500
|
||||
blb%vz = (rand()) / 5.000
|
||||
if (blb%pz .LT. 0.0) blb%vz = -blb%vz
|
||||
|
||||
blb%state = 0
|
||||
blb%alive = .TRUE.
|
||||
blb%age = 0
|
||||
blb%agemax = 300
|
||||
blb%agemax = 100
|
||||
|
||||
end subroutine
|
||||
! ----------------------------------------------------------------
|
||||
! Load a blbs file into an array of bloubs
|
||||
|
||||
subroutine spit_bloubs_to_file (fname, blbarray, towrite)
|
||||
character(*), intent(in) :: fname
|
||||
type(t_bloubs), dimension(:) :: blbarray
|
||||
@ -125,7 +131,7 @@ module bloubspace
|
||||
enddo
|
||||
|
||||
close(output)
|
||||
write(0, '(1X, "spitted ", I6, " bloubs")') spitted
|
||||
write(0, '(1X, "spitted ", I0, " bloubs.")') spitted
|
||||
|
||||
end subroutine spit_bloubs_to_file
|
||||
! ----------------------------------------------------------------
|
||||
@ -201,7 +207,9 @@ module bloubspace
|
||||
|
||||
end subroutine
|
||||
! ----------------------------------------------------------------
|
||||
|
||||
!-
|
||||
! Deplacement d'un bloub
|
||||
!-
|
||||
subroutine move_bloub (blb, coef)
|
||||
type(t_bloubs), intent (inout) :: blb
|
||||
real, intent (in) :: coef
|
||||
@ -215,7 +223,9 @@ module bloubspace
|
||||
! ----------------------------------------------------------------
|
||||
!
|
||||
! detection des collisions avec les parois de la boite
|
||||
! laquelle boite gagnerais beaucoup a etre parametrable.
|
||||
! laquelle boite gagnerais beaucoup a etre parametrable,
|
||||
! ainsi qu'un éventuel coefficient de réduction de la
|
||||
! vitesse. XXX
|
||||
!
|
||||
subroutine bound_a_bloub (blb)
|
||||
type(t_bloubs), intent (inout) :: blb
|
||||
@ -282,13 +292,13 @@ module bloubspace
|
||||
subroutine green_soylent (blb)
|
||||
type(t_bloubs), intent (inout) :: blb
|
||||
|
||||
if (blb%age .gt. 24) then
|
||||
if (blb%age .gt. 240) then
|
||||
blb%alive = .FALSE.
|
||||
endif
|
||||
|
||||
! this is juste a molly-guard, don't worry
|
||||
!
|
||||
if (blb%radius .GT. 2.0) then
|
||||
if (blb%radius .GT. 4.0) then
|
||||
blb%alive = .FALSE.
|
||||
endif
|
||||
end subroutine
|
||||
|
@ -49,7 +49,7 @@ sur les trois directions de l'espace bloubeux.
|
||||
D'autres, comme `alive`, sont plus délicates à expliquer,
|
||||
sauf si l'on considère que les bloubs sont zombifiables.
|
||||
|
||||
D'autres, comme l'age et l'agemax, sont bien plus sujettes à de diverses
|
||||
D'autres, comme age et agemax, sont bien plus sujettes à de diverses
|
||||
interprétations. doit-on incrémenter l'age à chaque tick d'horloge
|
||||
ou à chaque évènement discret ? Et à quel age un bloub devient-il
|
||||
trop vieux, à quel age va-t-il mourir ?
|
||||
@ -78,7 +78,23 @@ taille, densité, age et couleur qu'il y a des choses à faire.
|
||||
* Agemax : (maximum des deux agemaxs) - forfait
|
||||
* Couleurs : un système de mutation selon critères ?
|
||||
|
||||
Il ne reste qu'à coder tout ça.
|
||||
Il ne reste qu'à coder tout ça...
|
||||
|
||||
## Analyse de population
|
||||
|
||||
Nous avons des moyens assez simple d'enregistrer l'état complet
|
||||
de la population de bloubs à chaque itération.
|
||||
La meilleure preuve étant les vidéos publiés dans les peertubes.
|
||||
Mais nous devrions plus nous pencher sur les aspects statistiques,
|
||||
comme la démographie, l'état de santé, la pyramide des ages...
|
||||
|
||||
Les traitements simples peuvent faire appel à Awk et Gnuplot.
|
||||
Pour les visions plus avancées, un logiciel spécialisé sera
|
||||
le bienvenu, et **R** est un bon candidat potentiel.
|
||||
On peut aussi envisager la pureté du code Fortran,
|
||||
couplé avec un *toolkit* graphique comme XXX.
|
||||
|
||||
Il ne reste qu'à coder tout ça...
|
||||
|
||||
## Et pour la suite ?
|
||||
|
||||
|
@ -33,8 +33,8 @@ program genbloubs
|
||||
|
||||
bloub%nick = 'noname '
|
||||
bloub%num = i + 41
|
||||
call make_a_random_bloub(bloub)
|
||||
bloub%radius = 0.035 + (0.03*rand())
|
||||
call make_a_random_bloub(bloub, 8.25)
|
||||
bloub%radius = 0.015 + (0.08*rand())
|
||||
|
||||
write(idu) bloub ! no error control ?
|
||||
|
||||
|
@ -33,7 +33,7 @@ program mergebloubs
|
||||
endif
|
||||
|
||||
call slurp_bloubs_file_in_array(trim(infile), bloubs, nbgot)
|
||||
write(0, '(A,I6,1X,A)') " slurped ", nbgot, "bloubs"
|
||||
write(0, '(A,I0,1X,A)') " slurped ", nbgot, "bloubs"
|
||||
|
||||
contacts = 0
|
||||
do ia = 1, nbgot
|
||||
@ -42,19 +42,26 @@ program mergebloubs
|
||||
dist = distance_of_bloubs(bloubs(ia), bloubs(ib))
|
||||
radd = bloubs(ia)%radius + bloubs(ib)%radius
|
||||
if (dist .LT. radd) then
|
||||
|
||||
contacts = contacts + 1
|
||||
call merge_two_bloubs(bloubs(ia), bloubs(ib), merged)
|
||||
bloubs(ia) = merged
|
||||
bloubs(ia)%nick = "marged"
|
||||
bloubs(ia)%state = 1;
|
||||
bloubs(ib)%alive = .FALSE.
|
||||
write(0, *) " *** merged ", ia, " and ", ib, &
|
||||
" new r = ", merged%radius
|
||||
|
||||
endif
|
||||
|
||||
enddo
|
||||
enddo
|
||||
|
||||
call spit_bloubs_to_file (outfile, bloubs, nbgot)
|
||||
! print *, contacts, "contacts pour ", nbgot, "bloubs"
|
||||
if (contacts .GT. 0) then
|
||||
write(0, '(A,I0,A,I0,A)') &
|
||||
" merge: ", contacts, " contacts pour ", nbgot, " bloubs"
|
||||
endif
|
||||
|
||||
! STOP 'mergebloubs [done]'
|
||||
|
||||
@ -77,8 +84,8 @@ contains
|
||||
blr%vy = (bla%vy + blb%vy) / 2.0
|
||||
blr%vz = (bla%vz + blb%vz) / 2.0
|
||||
|
||||
blr%radius = (bla%radius + blb%radius) / 2.222
|
||||
blr%age = min(bla%age, blb%age)
|
||||
blr%radius = (bla%radius + blb%radius)
|
||||
blr%age = max(bla%age, blb%age)
|
||||
|
||||
! bring it to life !
|
||||
blr%alive = .TRUE.
|
||||
|
@ -48,6 +48,9 @@ program movebloubs
|
||||
compteur = 0
|
||||
killed = 0
|
||||
|
||||
!-
|
||||
! begin of bigloop
|
||||
!-
|
||||
do
|
||||
read (unit=inu, iostat=errcode) bloub
|
||||
if (0 .ne. errcode) then
|
||||
@ -59,14 +62,14 @@ program movebloubs
|
||||
call move_bloub (bloub, 0.185)
|
||||
call bound_a_bloub (bloub)
|
||||
if (bloub%radius .GT. 0.0238) then
|
||||
bloub%radius = bloub%radius * 0.996
|
||||
bloub%radius = bloub%radius * 0.999
|
||||
endif
|
||||
|
||||
call green_soylent (bloub)
|
||||
if (.NOT. bloub%alive) then
|
||||
! write(0, '(A)') " KILL!"
|
||||
killed = killed + 1
|
||||
endif
|
||||
! XXX call green_soylent (bloub)
|
||||
! XXX if (.NOT. bloub%alive) then
|
||||
! XXX ! write(0, '(A)') " KILL!"
|
||||
! XXX killed = killed + 1
|
||||
! XXX endif
|
||||
|
||||
! calcul du barycentre
|
||||
bx = bx + dble(bloub%px)
|
||||
@ -84,33 +87,18 @@ program movebloubs
|
||||
enddo ! end of main loop
|
||||
|
||||
write(0, '(1X,I0,1X,A)') compteur, "bloubs processed"
|
||||
|
||||
! ok, we have read all the bloubs in the input file
|
||||
|
||||
! insert some fancy conditional here
|
||||
if (compteur .LT. 200) then
|
||||
call add_more_bloubs(outu, 4, 0.026)
|
||||
endif
|
||||
|
||||
! insert some very fancy conditional here
|
||||
if (compteur .LT. 800) then
|
||||
rnd = rand()
|
||||
! write (0, '(A,1X,F9.6)') "try to add bloubs, rnd is", rnd
|
||||
if (rnd .LT. 0.0604) then
|
||||
call add_more_bloubs(outu, 11, 0.019)
|
||||
endif
|
||||
endif
|
||||
|
||||
close(inu) ; close(outu)
|
||||
|
||||
if (killed .GT. 0) then
|
||||
write (0, '(1X,I0,A)') killed, " bloubs killed"
|
||||
endif
|
||||
|
||||
bx = bx / dble(compteur)
|
||||
by = by / dble(compteur)
|
||||
bz = bz / dble(compteur)
|
||||
write (0, '(A,3(F12.6,3X))') "barycentre : ", bx, by, bz
|
||||
! ok, we have read all the bloubs from the input file
|
||||
|
||||
! insert some fancy conditional here
|
||||
if (compteur .LT. 200) then
|
||||
call add_more_bloubs(outu, 5, 0.032)
|
||||
endif
|
||||
|
||||
close(inu) ; close(outu)
|
||||
|
||||
! --------------------------------------------------------------
|
||||
contains
|
||||
@ -121,14 +109,14 @@ contains
|
||||
type(t_bloubs) :: bloub
|
||||
integer :: foo, count
|
||||
|
||||
count = nbre+mod(irand(), 6)
|
||||
write(0, '(A,I4,1X,A)') "adding", count, "bloubs"
|
||||
count = nbre+mod(irand(), 3)
|
||||
write(0, '(A,I4,1X,A)') "movebloubs adding", count, "bloubs"
|
||||
|
||||
do foo=1, count
|
||||
|
||||
bloub%nick = 'newbie '
|
||||
call make_a_random_bloub(bloub)
|
||||
bloub%radius = rayon + (0.05*rand())
|
||||
call make_a_random_bloub(bloub, 7.12)
|
||||
bloub%radius = rayon + (0.09*rand())
|
||||
bloub%age = 1
|
||||
bloub%alive = .TRUE.
|
||||
bloub%num = mod(irand(), 42)
|
||||
|
5
BloubWorld/plotbary.sh
Executable file
5
BloubWorld/plotbary.sh
Executable file
@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
BARYDATAS="WS/log.barycentres"
|
||||
|
||||
wc -l $BARYDATAS
|
@ -7,16 +7,19 @@
|
||||
|
||||
INCFILE="WS/bloubs.inc"
|
||||
TMPPNG="/dev/shm/bloubs7.png"
|
||||
POVOPT="+Q9 -a -v -d -W1600 -H1200 -WT2"
|
||||
POVOPT="+Q9 +a -v -d -W800 -H600 -WT2"
|
||||
DDIR="frames/a"
|
||||
LOGERR="log.error"
|
||||
TXTCOLOR="#db7000"
|
||||
TXTCOLOR="#db2080"
|
||||
|
||||
BLOUBDATAS="WS/bloubs.data"
|
||||
BARYDATAS="WS/log.barycentres"
|
||||
|
||||
# --- put the work file in ramdisk
|
||||
BLBS_IN="/dev/shm/in.blbs"
|
||||
BLBS_OUT="/dev/shm/out.blbs"
|
||||
|
||||
NBIMG=120
|
||||
NBIMG=2000
|
||||
|
||||
make all
|
||||
err=$?
|
||||
@ -31,14 +34,20 @@ printf "\n#declare NbImg = %d;\n" $NBIMG > WS/nbimg.inc
|
||||
# first, we have to make a seminal buch of bloubs
|
||||
# --> this function need to be parametrizable
|
||||
#
|
||||
./genbloubs ${BLBS_IN} 50
|
||||
./genbloubs ${BLBS_IN} 97
|
||||
|
||||
for idx in $(seq 0 $((NBIMG-1)) )
|
||||
do
|
||||
|
||||
echo "======== run passe $idx ========="
|
||||
echo "============== run passe $idx ===================="
|
||||
|
||||
./exportbloubs ${BLBS_IN} | awk -f toinc.awk > $INCFILE
|
||||
# make the bloubs's data readable by POVray
|
||||
#
|
||||
./exportbloubs ${BLBS_IN} > $BLOUBDATAS
|
||||
awk -f toinc.awk < $BLOUBDATAS > $INCFILE
|
||||
awk '{ print $1, $2, $3 }' < $BLOUBDATAS > $BARYDATAS
|
||||
|
||||
echo "### raytracing pass $idx"
|
||||
|
||||
povray -Iscene.pov -K${idx} -O${TMPPNG} ${POVOPT} 2> $LOGERR
|
||||
if [ 0 -ne $? ] ; then
|
||||
@ -47,20 +56,20 @@ do
|
||||
fi
|
||||
|
||||
td=$(date -u +'%F %R:%S' | tr '01' 'ol')
|
||||
hi=$(printf "#%05d" $idx | tr '01' 'ol')
|
||||
hi=$(printf "#%04d" $idx | tr '01' 'ol')
|
||||
count=$(tail -1 "WS/log.nb_bloubs")
|
||||
|
||||
PNG=$(printf "%s/%05d.png" ${DDIR} $idx)
|
||||
|
||||
convert ${TMPPNG} \
|
||||
-font Courier-Bold \
|
||||
-pointsize 28 \
|
||||
-pointsize 22 \
|
||||
-fill "$TXTCOLOR" \
|
||||
-gravity south-east \
|
||||
-annotate +25+5 "$td" \
|
||||
-gravity south-west \
|
||||
-annotate +25+5 "$hi" \
|
||||
-pointsize 48 \
|
||||
-pointsize 28 \
|
||||
-gravity north-east \
|
||||
-annotate +45+5 "$count" \
|
||||
-gravity north-west \
|
||||
@ -73,8 +82,8 @@ do
|
||||
./mergebloubs ${BLBS_OUT} ${BLBS_IN}
|
||||
# mv ${BLBS_OUT} ${BLBS_IN}
|
||||
|
||||
echo
|
||||
sleep 90
|
||||
echo "### run done"
|
||||
sleep 10
|
||||
|
||||
done
|
||||
|
||||
|
@ -44,22 +44,43 @@ union {
|
||||
}
|
||||
}
|
||||
|
||||
plane { y, 0 pigment { color White } translate -4.20*y}
|
||||
cylinder { 0, -y, 30 pigment { color White } translate -4.20*y}
|
||||
|
||||
sky_sphere {
|
||||
pigment { color Gray20 }
|
||||
emission rgb <0.1, 0.1, 0.1>
|
||||
}
|
||||
|
||||
|
||||
// object { cylinder { <0, 0, 0>, <10, 0, 0>, 0.05 pigment { color Cyan } } }
|
||||
|
||||
// ----------------------------------------------------------
|
||||
|
||||
#declare Croisillon = object
|
||||
{
|
||||
union {
|
||||
cylinder { -1*x, 1*x, 0.04 }
|
||||
cylinder { -1*y, 1*y, 0.04 }
|
||||
cylinder { -1*z, 1*z, 0.04 }
|
||||
}
|
||||
texture {
|
||||
pigment { color Gray50 }
|
||||
}
|
||||
}
|
||||
|
||||
object { Croisillon scale 0.80 translate <Bary_X, Bary_Y, Bary_Z> }
|
||||
|
||||
// ----------------------------------------------------------
|
||||
|
||||
#declare BH = 6; // H = taille en horizontal
|
||||
#declare BV = 4; // V = taille en vertical
|
||||
#declare BR = 0.034;
|
||||
#declare BR = 0.056;
|
||||
|
||||
#declare Une_Borne = object
|
||||
{
|
||||
merge {
|
||||
cylinder { <0, BV, 0>, <0, -BV, 0>, BR }
|
||||
cylinder { <0, 0.018, 0>, <0, -0.018, 0>, BR*3 }
|
||||
cylinder { <0, 0.036, 0>, <0, -0.036, 0>, BR*2 }
|
||||
}
|
||||
}
|
||||
|
||||
@ -113,21 +134,19 @@ union {
|
||||
// ----------------------------------------------------------
|
||||
|
||||
light_source { <19, 12+NormClock, -17> color Gray80 }
|
||||
light_source { <11, 10-NormClock, -29> color Gray60 }
|
||||
light_source { <12, 10-NormClock, -29> color Gray70 }
|
||||
|
||||
#declare XCAM = 8 - ( 15 * NormClock);
|
||||
#declare YCAM = -1.1 + (0.95 * NormClock);
|
||||
#declare ZCAM = -13.10;
|
||||
#declare XCAM = 5 - ( 10 * NormClock);
|
||||
#declare YCAM = -1.1 + (1.15 * NormClock);
|
||||
#declare ZCAM = -16.50;
|
||||
|
||||
#declare XLAT = Bary_X;
|
||||
#declare YLAT = Bary_Y;
|
||||
#declare ZLAT = Bary_Z;
|
||||
|
||||
// object { Repere scale 2.5 translate <XLAT, YLAT, ZLAT> }
|
||||
#declare XLAT = 0;
|
||||
#declare YLAT = 0;
|
||||
#declare ZLAT = 0;
|
||||
|
||||
camera {
|
||||
location <XCAM, YCAM, ZCAM>
|
||||
look_at <XLAT, YLAT, ZLAT>
|
||||
right x*image_width/image_height
|
||||
angle 86
|
||||
angle 64
|
||||
}
|
||||
|
@ -9,6 +9,8 @@ BEGIN {
|
||||
count = 0
|
||||
bx = by = bz = 0.0
|
||||
print "// GENERATED FILE, DON'T TOUCH IT !"
|
||||
print "// --------------------------------"
|
||||
print
|
||||
print "#declare Bloubs = object\n{"
|
||||
print "union\t{"
|
||||
}
|
||||
@ -18,13 +20,14 @@ BEGIN {
|
||||
merged = $6
|
||||
|
||||
color = "Cyan"
|
||||
if (age < 2) color = "Yellow"
|
||||
if (age < 18) color = "Gray40"
|
||||
if (age < 2) color = "Gray10"
|
||||
if (merged) {
|
||||
if (age > 12) color = "Orange"
|
||||
else color = "Red"
|
||||
if (age > 120) color = "Orange"
|
||||
else color = "Yellow"
|
||||
}
|
||||
else {
|
||||
if (age > 12) color = "CadetBlue"
|
||||
if (age > 120) color = "Black"
|
||||
else color = "Aquamarine"
|
||||
}
|
||||
|
||||
|
@ -41,3 +41,4 @@ Generally writen as a *sequencial unformated* file.
|
||||
## See also
|
||||
|
||||
- https://www.maths.town/fractal-articles/mandelbulb/mandelbulb-all-powers/
|
||||
- https://discuss.pixls.us/t/intriguing-shapes-in-buddhabrot-like-fractals/41816
|
||||
|
Loading…
Reference in New Issue
Block a user