Compare commits

..

No commits in common. "307b5907964a0cdcf787ab2ef6129237c4d6e65a" and "47a383f3b6a5c71e7ddb268b69320b967cd567d7" have entirely different histories.

17 changed files with 35 additions and 397 deletions

View File

@ -1,39 +0,0 @@
# What is a bloub ?
## Philosophie
Bonne question, mais nous n'avons pas le temps, point suivant ?
En fait, si, il est tard, mais j'ai envie de raconter des
conneries.
## Technique
Voici la version du _Sat 19 Feb 2022 12:37:42 AM CET_
```
type t_bloubs
character(8) :: nick
logical :: alive
integer :: num ! ???
real :: px, py, pz
real :: vx, vy, vz
real :: radius
integer :: age
end type t_bloubs
```
Certains champs sont assez explicites, comme le nick, la position
dans l'espace, le rayon (pour nous, un bloub est
une entité abstraite assimilable à une bubulle)
ou la vitesse sur les trois axes.
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, 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 ?

View File

@ -1,12 +1,9 @@
julia julia
pickover pickover
lorentz
*.pgm *.pgm
*.gif *.gif
*.asc *.asc
*.png *.png
*.mp4

View File

@ -1,5 +1,5 @@
GFOPT = -Wall -Wextra -time -g -Imods/ GFOPT = -Wall -Wextra -time -g
# --------------------------------------------- # ---------------------------------------------
@ -9,8 +9,7 @@ spitpgm.o: spitpgm.f90 Makefile
fraktals.o: fraktals.f90 Makefile fraktals.o: fraktals.f90 Makefile
gfortran $(GFOPT) -c $< gfortran $(GFOPT) -c $<
OBJS = spitpgm.o fraktals.o OBJS = spitpgm.o fraktals.o
DOT_O = mods/points3d.o
# --------------------------------------------- # ---------------------------------------------
@ -18,17 +17,11 @@ julia: julia.f90 Makefile $(OBJS)
gfortran $(GFOPT) $< $(OBJS) -o $@ gfortran $(GFOPT) $< $(OBJS) -o $@
pickover: pickover.f90 Makefile $(OBJS) pickover: pickover.f90 Makefile $(OBJS)
gfortran $(GFOPT) $< $(OBJS) $(DOT_O) -o $@
lorentz: lorentz.f90 Makefile $(OBJS)
gfortran $(GFOPT) $< $(OBJS) -o $@ gfortran $(GFOPT) $< $(OBJS) -o $@
# --------------------------------------------- # ---------------------------------------------
lorentz.pgm: lorentz Makefile foo.pgm: pickover Makefile
./lorentz $@ > /dev/null ./pickover $@ > /dev/null
pickover.pgm: pickover Makefile
time ./pickover $@ > /dev/null
# --------------------------------------------- # ---------------------------------------------

View File

@ -11,24 +11,8 @@ qui montre ma première expérience dans ce domaine.
Le gros des calculs de fractales est fait dans XXX, et la gestion Le gros des calculs de fractales est fait dans XXX, et la gestion
des pixels 'physiques' est fait dans YYY des pixels 'physiques' est fait dans YYY
Les fonctions d'usage général sont dans
[mods/](répertoire mods/) ave trop peu
[d'explications](mods/documentation.md)
Des scripts _shell_ sont utilisés pour construire les vidéos. Des scripts _shell_ sont utilisés pour construire les vidéos.
## File Formats
```
type t_point3d
double precision :: x, y, z
integer :: seq
end type t_point3d
```
Generally writen as a *sequencial unformated* file.
## TODO ## TODO
- Voir de près le calcul du cadrage - Voir de près le calcul du cadrage

View File

@ -1 +0,0 @@
*.inc

View File

@ -1,11 +1,5 @@
module fraktals module fraktals
use points3d
implicit none implicit none
!-----------------------------------------------------
!-----------------------------------------------------
contains contains
!----------------------------------------------------- !-----------------------------------------------------
@ -57,42 +51,6 @@ subroutine simple_julia(pic, cx, cy, maxiter)
enddo enddo
end subroutine simple_julia end subroutine simple_julia
!-----------------------------------------------------
!
! d'après les pages 91/92 du livre de Roger T Stevens
! "Fractal programming in C"
!
subroutine compute_pickover(array, coefs)
type(t_point3d), dimension(:) :: array
double precision, dimension(4) :: coefs
double precision :: xa, ya, za, xb, yb, zb
integer :: i
! print *, "coefs ", coefs
write(0, '(1X, A18, I9)') "compute pickover ", ubound(array, 1)
xa = 0.00 ; ya = 0.00 ; za = 0.0
do i=1, ubound(array, 1)
xb = sin(coefs(1)*ya) - za*cos(coefs(2)*xa)
yb = za*sin(coefs(3)*xa) - cos(coefs(4)*ya)
zb = sin(xa)
array(i)%x = xb
array(i)%y = yb
array(i)%z = zb
array(i)%seq = i
xa = xb ; ya = yb ; za = zb
! print *, xb, yb, zb
enddo
end subroutine
!----------------------------------------------------- !-----------------------------------------------------
! !
! d'après les pages 91/92 du livre de Roger T Stevens ! d'après les pages 91/92 du livre de Roger T Stevens
@ -103,60 +61,37 @@ subroutine pickover_0(pic, count)
integer, intent(inout), dimension (:,:) :: pic integer, intent(inout), dimension (:,:) :: pic
integer, intent(in) :: count integer, intent(in) :: count
type(t_point3d), dimension(:), allocatable :: points double precision :: xa, ya, za, xb, yb, zb
double precision, dimension(4) :: coefs double precision :: ka, kb, kc, kd
integer :: i, w, h, px, py, errcode integer :: i, w, h, px, py
write(0, '(1X, A18 , I9)') "pickover_0 ", count ka = 2.24 ; kb = 0.43 ; kc = -0.65 ; kd = -2.43
xa = 0.00 ; ya = 0.00 ; za = 0.0
allocate(points(count), stat=errcode)
if (0 .NE. errcode) then
STOP " : NO ENOUGH MEMORY"
endif
coefs(1) = 2.24 ; coefs(2) = 0.43
coefs(3) = -0.65 ; coefs(4) = -2.43
call compute_pickover(points, coefs)
w = ubound(pic, 1) w = ubound(pic, 1)
h = ubound(pic, 2) h = ubound(pic, 2)
do i=1, ubound(points, 1) do i=1, count
px = (points(i)%x * (w/4.09)) + (w / 2) xb = sin(ka*ya) - za*cos(kb*xa)
py = (points(i)%y * (h/4.09)) + (h / 2) yb = za*sin(kc*xa) - cos(kd*ya)
pic(px, py) = 255 ! WARNING COREDUMP zb = sin(xa)
px = (xb * (w/4.05)) + (w / 2)
py = (yb * (h/4.05)) + (h / 2)
pic(px, py) = 200 ! WARNING COREDUMP
print *, xb, yb, zb
xa = xb ; ya = yb ; za = zb
enddo enddo
deallocate(points)
end subroutine pickover_0 end subroutine pickover_0
!----------------------------------------------------- !-----------------------------------------------------
!
! d'après les pages NN/NN du livre de Roger T Stevens
! "Fractal programming in C"
!
subroutine lorentz_0(pic, count)
implicit none
integer, intent(inout), dimension (:,:) :: pic
integer, intent(in) :: count
! XXX double precision :: xa, ya, za, xb, yb, zb
! XXX double precision :: ka, kb, kc, kd
! XXX integer :: i, w, h, px, py
end subroutine lorentz_0
!-----------------------------------------------------------
! -- some support functions -- ! -- some support functions --
!----------------------------------------------------------- !-----------------------------------------------------
!-----------------------------------------------------------
function dist0 (x, y) function dist0 (x, y)
implicit none implicit none
@ -165,7 +100,7 @@ function dist0 (x, y)
dist0 = ( x*x + y*y ) dist0 = ( x*x + y*y )
end function end function
!----------------------------------------------------------- !-----------------------------------------------------
function modulus2(pt) function modulus2(pt)
implicit none implicit none
complex, intent(in) :: pt complex, intent(in) :: pt

View File

@ -1,31 +0,0 @@
!
! this is the main programm
!
!-----------------------------------------------------
program lorentz
use spitpgm
use fraktals
implicit none
integer, dimension(800, 600) :: picz
integer :: argc
character(200) :: filename
argc = IARGC()
if (1 .NE. argc) then
STOP ": LORENTZ NEED A FILENAME !"
endif
call getarg(1, filename)
write (0, "(A)") "Lorentz -> "//trim(filename)
call lorentz_0(picz, 50000)
call spit_as_pgm_8(picz, trim(filename))
end program
!-----------------------------------------------------

View File

@ -1,9 +0,0 @@
#
# compiling fraktalism's modules
#
GFOPT = -Wall -Wextra -time -g
points3d.o: points3d.f90 Makefile
gfortran $(GFOPT) -c $<

View File

@ -1,11 +0,0 @@
# Modules
Premier point : trouver les bonnes options de gfortran pour
définir l'emplacement des `.mod`.
Deuxième point : construire un Makefile cohérent d'un bout à l'autre,
avec un script de build bien robuste.
Troisième point : Faire la [documentation](documentation.md)

View File

@ -1,9 +0,0 @@
# La doc (enfin !)
## Points 3d
## Portable Net Map
.pgm

View File

@ -1,33 +0,0 @@
module points3d
implicit none
!-----------------------------------------------------
type t_point3d
double precision :: x, y, z
integer :: seq
end type t_point3d
!-----------------------------------------------------
contains
subroutine list_points3d(array, start, length)
type(t_point3d), dimension(:), intent(in) :: array
integer, intent(in) :: start, length
integer :: sz, i
sz = ubound(array, 1)
if ((start+length) .GT. sz) then
STOP ' : OUT OF BOUND'
endif
! send oi to stdout.
do i = start, start+length
print *, array(i)%x, array(i)%y, array(i)%z, array(i)%seq
enddo
end subroutine list_points3d
!-----------------------------------------------------
end module points3d

View File

@ -1,20 +0,0 @@
#!/usr/bin/awk
BEGIN {
print "// generated file, don't touch it bastard !"
print "#declare Pickover = object {"
print "union {"
}
# for every line
{
printf "sphere { <%f, %f, %f> 0.015 }\n", $1, $2, $3
}
END {
print "} }"
print "// done"
}

View File

@ -1,72 +0,0 @@
#version 3.7;
global_settings {
ambient_light rgb <0.12, 0.04, 0.04>
assumed_gamma 1.0
}
#include "colors.inc"
#include "WS/pickover.inc"
#declare Tiers = NBPASS * 0.3333333;
#declare CK = (clock/Tiers)*180;
#declare Rep = object
{
union {
#local RB = 0.015;
cylinder { 0, <2, 0, 0>, RB pigment { color Red } }
cylinder { 0, <0, 2, 0>, RB pigment { color Green } }
cylinder { 0, <0, 0, 2>, RB pigment { color Blue } }
}
}
// object { Rep translate <-1, 0.10, -1> }
object {
object {
Pickover
texture {
pigment { color srgb <0.35, 0.45, 0.80> }
finish { phong 0.38 metallic 0.55 }
}
}
#if (clock < (Tiers))
rotate x*(CK)
#elseif (clock < (Tiers*2))
rotate y*(CK)
#else
rotate z*(CK)
#end
translate y*2.25
}
// ----------------------------------------------------------
plane {
<0, 1, 0>, 0
texture {
pigment { color srgb <0.133, 0.155, 0.111> }
finish { phong 0.18 metallic 0.55 }
}
}
// ----------------------------------------------------------
light_source { <-12, 17, -11> color Gray90 }
light_source { <-11, 11, 9> color Gray60 }
#declare XCAM = -3.8;
#declare YCAM = 3;
#declare ZCAM = 2.1;
camera {
location <XCAM, YCAM, ZCAM>
look_at <0, 2.09, 0>
right x*image_width/image_height
angle 86
}
// ----------------------------------------------------------

View File

@ -1,32 +0,0 @@
#!/bin/bash
POVOPT=" -d +q9 +a +W1920 +H1080 -v +WT4"
PASS=600
ERR="/tmp/pov.error"
for pass in $(seq 0 $PASS)
do
dstname=$(printf "frames/pick3d/%05d.png" $pass)
echo $dstname
povray -ipick3d.pov -K${pass} \
Declare=NBPASS=${PASS} \
$POVOPT -O${dstname} 2> $ERR
if [ $? -ne 0 ]
then
tail $ERR
exit
fi
sleep 16
done
ffmpeg -nostdin \
-loglevel warning \
-y -r 25 -f image2 -i frames/pick3d/%05d.png \
-metadata artist='---[ tTh ]---' \
-c:v libx264 -pix_fmt yuv420p \
pick3d.mp4

View File

@ -6,39 +6,25 @@
program pickover program pickover
use spitpgm use spitpgm
use points3d
use fraktals use fraktals
implicit none implicit none
integer, dimension(800, 600) :: picz integer, dimension(800, 600) :: picz
integer :: argc integer :: argc
character(200) :: filename character(200) :: filename
double precision, dimension(4) :: coefs
type(t_point3d), dimension(:), allocatable :: points
integer :: nbr_points
integer :: errcode
argc = IARGC() argc = IARGC()
if (1 .NE. argc) then if (1 .NE. argc) then
STOP ": PICKOVER NEED A FILENAME !" STOP ": PICKOVER NEED A FILENAME !"
endif endif
call getarg(1, filename) call getarg(1, filename)
write (0, "(A)") " *** Pickover -> "//trim(filename)
nbr_points = 999999 write (0, "(A)") "Pickover -> "//trim(filename)
allocate(points(nbr_points), stat=errcode)
if (0 .NE. errcode) then
STOP " : NO ENOUGH MEMORY"
endif
coefs(1) = 2.24 ; coefs(2) = 0.43 call pickover_0(picz, 50000)
coefs(3) = -0.65 ; coefs(4) = -2.43 call spit_as_pgm_8(picz, trim(filename))
call compute_pickover(points, coefs)
call list_points3d(points, 2, 32000)
end program end program

View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
ASCFILE="nuage.asc" ASCFILE="nuage.asc"
IMAGE="pickplot.png" IMAGE="pick3d.png"
make pickover make pickover
if [ $? -ne 0 ] ; then if [ $? -ne 0 ] ; then
@ -27,7 +27,7 @@ local angle="$2"
printf "== %s == %3d ==\n" $imgname $angle printf "== %s == %3d ==\n" $imgname $angle
gnuplot << __EOC__ gnuplot << __EOC__
set term png size 1024,768 set term png size 800,480
set output "${imgname}" set output "${imgname}"
set title "3D Pickover" set title "3D Pickover"
@ -49,7 +49,7 @@ ddir="frames"
rm $ddir/p???.png rm $ddir/p???.png
idx=0 idx=0
for angle in $(seq 0 5 360) for angle in $(seq 0 6 360)
do do
fname=$(printf "%s/p%03d.png" $ddir $idx) fname=$(printf "%s/p%03d.png" $ddir $idx)

View File

@ -15,7 +15,7 @@ subroutine spit_as_pgm(pic, fname)
integer :: ix, iy integer :: ix, iy
real :: fk, fpix real :: fk, fpix
write(0, '(1X, A)') "> spit_as_pgm to " // trim(fname) ! XXX print *, "> spit_as_pgm to ", fname
open(newunit=io, file=fname) open(newunit=io, file=fname)
write (io, '(a2)') "P2" write (io, '(a2)') "P2"