fraktalist: refactoring in progress
This commit is contained in:
parent
cf2333cf1f
commit
307b590796
3
Fraktalism/.gitignore
vendored
3
Fraktalism/.gitignore
vendored
@ -1,9 +1,12 @@
|
|||||||
|
|
||||||
julia
|
julia
|
||||||
pickover
|
pickover
|
||||||
|
lorentz
|
||||||
|
|
||||||
*.pgm
|
*.pgm
|
||||||
*.gif
|
*.gif
|
||||||
*.asc
|
*.asc
|
||||||
*.png
|
*.png
|
||||||
|
*.mp4
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
GFOPT = -Wall -Wextra -time -g
|
GFOPT = -Wall -Wextra -time -g -Imods/
|
||||||
|
|
||||||
# ---------------------------------------------
|
# ---------------------------------------------
|
||||||
|
|
||||||
@ -10,6 +10,7 @@ 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
|
||||||
|
|
||||||
# ---------------------------------------------
|
# ---------------------------------------------
|
||||||
|
|
||||||
@ -17,11 +18,17 @@ 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 $@
|
||||||
|
|
||||||
# ---------------------------------------------
|
# ---------------------------------------------
|
||||||
|
|
||||||
foo.pgm: pickover Makefile
|
lorentz.pgm: lorentz Makefile
|
||||||
./pickover $@ > /dev/null
|
./lorentz $@ > /dev/null
|
||||||
|
|
||||||
|
pickover.pgm: pickover Makefile
|
||||||
|
time ./pickover $@ > /dev/null
|
||||||
|
|
||||||
# ---------------------------------------------
|
# ---------------------------------------------
|
||||||
|
@ -11,8 +11,24 @@ 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
|
||||||
|
1
Fraktalism/WS/.gitignore
vendored
Normal file
1
Fraktalism/WS/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
*.inc
|
@ -1,5 +1,11 @@
|
|||||||
module fraktals
|
module fraktals
|
||||||
|
|
||||||
|
use points3d
|
||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
|
!-----------------------------------------------------
|
||||||
|
|
||||||
|
!-----------------------------------------------------
|
||||||
contains
|
contains
|
||||||
|
|
||||||
!-----------------------------------------------------
|
!-----------------------------------------------------
|
||||||
@ -51,6 +57,42 @@ 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
|
||||||
@ -61,37 +103,60 @@ subroutine pickover_0(pic, count)
|
|||||||
integer, intent(inout), dimension (:,:) :: pic
|
integer, intent(inout), dimension (:,:) :: pic
|
||||||
integer, intent(in) :: count
|
integer, intent(in) :: count
|
||||||
|
|
||||||
double precision :: xa, ya, za, xb, yb, zb
|
type(t_point3d), dimension(:), allocatable :: points
|
||||||
double precision :: ka, kb, kc, kd
|
double precision, dimension(4) :: coefs
|
||||||
integer :: i, w, h, px, py
|
integer :: i, w, h, px, py, errcode
|
||||||
|
|
||||||
ka = 2.24 ; kb = 0.43 ; kc = -0.65 ; kd = -2.43
|
write(0, '(1X, A18 , I9)') "pickover_0 ", count
|
||||||
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, count
|
do i=1, ubound(points, 1)
|
||||||
|
|
||||||
xb = sin(ka*ya) - za*cos(kb*xa)
|
px = (points(i)%x * (w/4.09)) + (w / 2)
|
||||||
yb = za*sin(kc*xa) - cos(kd*ya)
|
py = (points(i)%y * (h/4.09)) + (h / 2)
|
||||||
zb = sin(xa)
|
pic(px, py) = 255 ! WARNING COREDUMP
|
||||||
|
|
||||||
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
|
||||||
@ -100,7 +165,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
|
||||||
|
31
Fraktalism/lorentz.f90
Normal file
31
Fraktalism/lorentz.f90
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
!
|
||||||
|
! 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
|
||||||
|
|
||||||
|
!-----------------------------------------------------
|
9
Fraktalism/mods/Makefile
Normal file
9
Fraktalism/mods/Makefile
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#
|
||||||
|
# compiling fraktalism's modules
|
||||||
|
#
|
||||||
|
|
||||||
|
GFOPT = -Wall -Wextra -time -g
|
||||||
|
|
||||||
|
points3d.o: points3d.f90 Makefile
|
||||||
|
gfortran $(GFOPT) -c $<
|
||||||
|
|
11
Fraktalism/mods/README.md
Normal file
11
Fraktalism/mods/README.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# 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)
|
||||||
|
|
9
Fraktalism/mods/documention.md
Normal file
9
Fraktalism/mods/documention.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# La doc (enfin !)
|
||||||
|
|
||||||
|
## Points 3d
|
||||||
|
|
||||||
|
|
||||||
|
## Portable Net Map
|
||||||
|
|
||||||
|
.pgm
|
||||||
|
|
33
Fraktalism/mods/points3d.f90
Normal file
33
Fraktalism/mods/points3d.f90
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
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
|
20
Fraktalism/pick2pov.awk
Normal file
20
Fraktalism/pick2pov.awk
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#!/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"
|
||||||
|
}
|
72
Fraktalism/pick3d.pov
Normal file
72
Fraktalism/pick3d.pov
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
#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
|
||||||
|
}
|
||||||
|
// ----------------------------------------------------------
|
||||||
|
|
32
Fraktalism/pick3d.sh
Executable file
32
Fraktalism/pick3d.sh
Executable file
@ -0,0 +1,32 @@
|
|||||||
|
#!/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
|
@ -6,6 +6,7 @@
|
|||||||
program pickover
|
program pickover
|
||||||
|
|
||||||
use spitpgm
|
use spitpgm
|
||||||
|
use points3d
|
||||||
use fraktals
|
use fraktals
|
||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
@ -13,18 +14,31 @@ program pickover
|
|||||||
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)
|
||||||
|
|
||||||
write (0, "(A)") "Pickover -> "//trim(filename)
|
nbr_points = 999999
|
||||||
|
allocate(points(nbr_points), stat=errcode)
|
||||||
|
if (0 .NE. errcode) then
|
||||||
|
STOP " : NO ENOUGH MEMORY"
|
||||||
|
endif
|
||||||
|
|
||||||
call pickover_0(picz, 50000)
|
coefs(1) = 2.24 ; coefs(2) = 0.43
|
||||||
call spit_as_pgm_8(picz, trim(filename))
|
coefs(3) = -0.65 ; coefs(4) = -2.43
|
||||||
|
|
||||||
|
|
||||||
|
call compute_pickover(points, coefs)
|
||||||
|
call list_points3d(points, 2, 32000)
|
||||||
|
|
||||||
end program
|
end program
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
ASCFILE="nuage.asc"
|
ASCFILE="nuage.asc"
|
||||||
IMAGE="pick3d.png"
|
IMAGE="pickplot.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 800,600
|
set term png size 1024,768
|
||||||
set output "${imgname}"
|
set output "${imgname}"
|
||||||
|
|
||||||
set title "3D Pickover"
|
set title "3D Pickover"
|
||||||
|
Loading…
Reference in New Issue
Block a user