Compare commits

...

5 Commits

Author SHA1 Message Date
tTh
5030fda56f bloubworld: more tweaking, more pimping 2024-01-29 05:25:08 +01:00
tTh
329f054fff add a link 2024-01-28 15:53:57 +01:00
tTh
1552320558 more bla 2024-01-28 01:43:23 +01:00
tTh
87645472b4 tweaking 2024-01-28 00:06:57 +01:00
tTh
7bf219d77c tweaking 2024-01-28 00:06:11 +01:00
12 changed files with 149 additions and 86 deletions

View File

@ -7,6 +7,7 @@ nbimg.inc
*.mp4
*.lst
*.wav
*.xyz
frames/*
log.*
@ -17,4 +18,5 @@ mergebloubs
listbloubs
essai
WS/*.data
core

View File

@ -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

View File

@ -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
@ -226,7 +236,7 @@ module bloubspace
! X axis
if ((blb%px + blb%radius) .GT. SH) then
blb%vx = -1.0 * blb%vx
blb%px = SH- blb%radius
blb%px = SH - blb%radius
blb%age = blb%age + 1
endif
if ((blb%px - blb%radius) .LT. -SH) then
@ -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

View File

@ -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 ?

View File

@ -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 ?

View File

@ -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.

View File

@ -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
View File

@ -0,0 +1,5 @@
#!/bin/bash
BARYDATAS="WS/log.barycentres"
wc -l $BARYDATAS

View File

@ -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

View File

@ -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
}

View File

@ -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"
}

View File

@ -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