Commit f5c67c1d authored by Mathys's avatar Mathys
Browse files

Ajout de pictures a jour ainsi que clock

parent 55719521
{
"WindowTitle": "Default",
"WindowSizeX": 500,
"WindowSizeY": 500,
"ParticleImage": "assets/particle.png",
"Debug": false,
"InitNumParticles": 10,
"RandomSpawn": false,
"scaleX":1,
"scaleY":1,
"SpawnRate": 0,
"SpawnX": 0,
"SpawnY": 0,
"SpeedLimit": [0,0,0,0],
"Colors": [1,1,1,1,1,1],
"Pictures": "assets/clock.jpeg",
"Scaleimg": true,
"Spawnimg" : true,
"GravityPoint": false,
"Clock" : true,
"Horlogescale" : 2
}
{
"WindowTitle": "Default",
"WindowSizeX": 1600,
"WindowSizeY": 900,
"ParticleImage": "assets/particle.png",
"Debug": true,
"InitNumParticles": 10,
"RandomSpawn": true,
"Scaleimg": true,
"scaleX":1,
"scaleY":1,
"SpawnX": 400,
"SpawnY": 400,
"SpawnRate": 0,
"SpeedLimit": [0,0.1,0,0.01],
"Spawnimg" : true,
"Pictures": "assets/tetris.jpeg",
"Colors": [1,1,1,1,1,1],
"GravityPoint": false
}
{
"WindowTitle": "Default",
"WindowSizeX": 1600,
"WindowSizeY": 900,
"ParticleImage": "assets/particle.png",
"Debug": true,
"InitNumParticles": 10,
"RandomSpawn": true,
"Scaleimg": false,
"scaleX":3,
"scaleY":3,
"SpawnX": 400,
"SpawnY": 400,
"SpawnRate": 0,
"SpeedLimit": [0,0,0,0],
"Spawnimg" : false,
"Pictures": "assets/creeper.jpeg",
"Colors": [1,1,1,1,1,1],
"GravityPoint": true
}
package pictures
import (
"fmt"
"image"
"image/jpeg"
"os"
"project-particles/config"
)
func Initpixel() {
// damn important or else At(), Bounds() functions will
// caused memory pointer error!!
image.RegisterFormat("jpeg", "jpeg", jpeg.Decode, jpeg.DecodeConfig)
}
func Gettabpixels() (w int, h int,tab [][]int){
imgfile, err := os.Open(config.General.Pictures)
if err != nil {
fmt.Println("image non trouvé")
os.Exit(1)
}
defer imgfile.Close()
imgCfg, _, _ := image.DecodeConfig(imgfile)
width := imgCfg.Width
height := imgCfg.Height
imgfile.Seek(0, 0)
img, _, _ := image.Decode(imgfile)
for y := 0; y < height; y++ {
for x := 0; x < width; x++ {
r, g, b, a := img.At(x, y).RGBA()
tab = append(tab,[]int{x,y,int(r/257),int(g/257),int(b/257),int(a/257)})
}
}
return width, height, tab
}
......@@ -6,9 +6,13 @@
"Debug": true,
"InitNumParticles": 10,
"RandomSpawn": true,
"scaleX":1,
"scaleY":1,
"SpawnX": 400,
"SpawnY": 400,
"SpawnRate": 0,
"SpeedLimit": [0,20,0,0],
"Spawnimg" : false,
"Pictures": "",
"Colors": [1,1,1,1,1,1]
}
......@@ -14,11 +14,17 @@ type Config struct {
Debug bool
InitNumParticles int
RandomSpawn bool
Scaleimg bool // Determine la taille des pixels d'une image pour qu'elles regroupent toute la fenetre ou non
ScaleX, ScaleY float64
SpawnX, SpawnY int
SpawnRate float64
SpeedLimit []float64
Spawnimg bool //fait directement apparaitre les pixels d'une image vers leurs position d'origine
Pictures string //fait apparaitre l'image donnée en lien, elles sont au format jpeg, il est non recommandé de mettre des images trop lourdes
Colors []float64
Gravity,GravityCenter bool
Gravity,GravityCenter,GravityPoint bool //Active plusieurs type de gravités, GravityPoint attire les pixels d'une image vers leur position d'origine sur celle ci
Clock bool //fait apparaitre une les aiguilles d'une horloge analogique s'actualisant, peut etre combine avec Pictures pour rajouter un fond
Horlogescale int //determine la taille des aiguilles, une valeur de 1 pour 250pixels est recommandé
}
var General Config
......@@ -40,11 +40,27 @@ func commands() {
},
},
{
Name: "Wesh",
Aliases: []string{"w"},
Usage: "Use the default config file",
Name: "Pictures",
Aliases: []string{"p1"},
Usage: "Compose une image se dégradant",
Action: func(c *cli.Context) {
ExecPart("./Extension/Pictures/pictures1.json")
},
},
{
Name: "Pictures2",
Aliases: []string{"p2"},
Usage: "Decompose une image",
Action: func(c *cli.Context) {
ExecPart("./Extension/Pictures/pictures2.json")
},
},
{
Name: "Clock",
Aliases: []string{"c"},
Usage: "Affiche une horloge analogique se mettant à jour",
Action: func(c *cli.Context) {
ExecPart("./Extension/Wesh.json")
ExecPart("./Extension/Clock/clock.json")
},
},
}
......
......@@ -4,6 +4,8 @@ import (
"project-particles/config"
"math/rand"
"time"
"project-particles/Extension/Pictures"
"strconv"
)
// NewSystem est une fonction qui initialise un système de particules et le
......@@ -23,16 +25,25 @@ func GenPart() (Particle) { // Crée une particule avec Px,Py comme position
return Particle{
PositionX: float64(PosX),
PositionY: float64(PosY),
ScaleX: 1, ScaleY: 1,
ScaleX: config.General.ScaleX, ScaleY: config.General.ScaleY,
ColorRed: config.General.Colors[0] + rand.Float64() * ( config.General.Colors[1] - config.General.Colors[0] ),
ColorGreen: config.General.Colors[2] + rand.Float64() * ( config.General.Colors[3] - config.General.Colors[2] ),
ColorBlue: config.General.Colors[4] + rand.Float64() * ( config.General.Colors[5] - config.General.Colors[4] ),
Opacity: 1,
SpeedX: config.General.SpeedLimit[0] + rand.Float64()* (config.General.SpeedLimit[1]-config.General.SpeedLimit[0]),
SpeedY: config.General.SpeedLimit[2] + rand.Float64()* (config.General.SpeedLimit[3]-config.General.SpeedLimit[2]),
CibleX: float64(PosX),
CibleY: float64(PosY),
}
}
func gettime()[]float64 {
t := time.Now()
a,_ := strconv.Atoi(t.String()[11:13])
b , _:= strconv.Atoi(t.String()[14:16])
c , _ := strconv.Atoi(t.String()[17:19])
return []float64{float64(a),float64(b),float64(c)}
}
// fonction NewSystem
func NewSystem() System {
// Initialise les variables et la seed de math/rand
......@@ -40,8 +51,72 @@ func NewSystem() System {
var NombreDeParticules int = config.General.InitNumParticles
// Génére les particules et les ranges dans un tableau
for i:=0; i < NombreDeParticules; i++ {
TabParticule = append(TabParticule,GenPart())
if config.General.Pictures!=""{
h,w,image := pictures.Gettabpixels()
rand.Seed(time.Now().UnixNano())
for k:=0;k<len(image);k++{
l := rand.Intn(len(image))
image[k] , image[l] = image[l] , image[k]
}
precision :=10.0
NombreDeParticules = h*w
if config.General.Scaleimg{
config.General.ScaleX = float64(config.General.WindowSizeY) / float64(w)
config.General.ScaleY = float64(config.General.WindowSizeX) / float64(h)
if !config.General.Spawnimg{
config.General.ScaleX = float64(int(config.General.ScaleX))
config.General.ScaleY = float64(int(config.General.ScaleY))
}
}
config.General.ScaleX = config.General.ScaleX /precision
config.General.ScaleY = config.General.ScaleY/precision
for i:=0; i < NombreDeParticules; i++ {
TabParticule = append(TabParticule,GenPart())
TabParticule[i].CibleX, TabParticule[i].CibleY = float64(image[i][0] )*config.General.ScaleX*precision, float64(image[i][1])*config.General.ScaleY*precision
TabParticule[i].ColorRed,TabParticule[i].ColorGreen,TabParticule[i].ColorBlue = float64(image[i][2])/255 ,float64(image[i][3])/255,float64(image[i][4])/255
TabParticule[i].Opacity = float64(image[i][5])/255
if config.General.Spawnimg{
TabParticule[i].PositionX , TabParticule[i].PositionY = TabParticule[i].CibleX, TabParticule[i].CibleY
}
}
}else{
for i:=0; i < NombreDeParticules; i++ {
TabParticule = append(TabParticule,GenPart())
}
}
if config.General.Clock{
config.General.GravityPoint = true
horlogescale := config.General.Horlogescale
config.General.InitNumParticles = len(TabParticule)
for k:=0; k < (horlogescale*7); k++ {
TabParticule = append(TabParticule,GenPart())
i := len(TabParticule)-1
TabParticule[i].ColorRed,TabParticule[i].ColorBlue,TabParticule[i].ColorGreen = 0.3,0.3,0.3
TabParticule[i].ScaleX,TabParticule[i].ScaleY = 1.0 ,1.0
}
for k:=(horlogescale*7); k < (horlogescale*18); k++ {
TabParticule = append(TabParticule,GenPart())
i :=len(TabParticule)-1
TabParticule[i].ColorRed,TabParticule[i].ColorBlue,TabParticule[i].ColorGreen = 0.7,0.7,0.7
TabParticule[i].ScaleX,TabParticule[i].ScaleY = 0.8,0.8
}
for k:=(horlogescale*18); k < (horlogescale*31); k++ {
TabParticule = append(TabParticule,GenPart())
i := len(TabParticule)-1
TabParticule[i].ColorRed,TabParticule[i].ColorBlue,TabParticule[i].ColorGreen = 1,0,0
TabParticule[i].ScaleX,TabParticule[i].ScaleY = 0.8,0.8
}
}
// Retourne le tableau
return System{Content: TabParticule}
......
......@@ -22,4 +22,6 @@ type Particle struct {
SpeedX,SpeedY float64
Gravity bool
GravityCenter bool
GravityImg bool
CibleX, CibleY float64
}
package particles
import "project-particles/config"
import (
"project-particles/config"
"math"
)
// Update mets à jour l'état du système de particules (c'est-à-dire l'état de
// chacune des particules) à chaque pas de temps. Elle est appellée exactement
......@@ -38,7 +41,67 @@ func gravite(p Particle) (Particle){
return p
}
func gravitepoint(p Particle) (Particle){
if p.PositionX - p.CibleX < 10 {
p.PositionX = p.CibleX
}
if p.PositionY - p.CibleY <10{
p.PositionY = p.CibleY
}
if p.PositionX == p.CibleX{
p.SpeedX =0
}
if p.PositionX > p.CibleX{
p.SpeedX = -3
}
if p.PositionX < p.CibleX{
p.SpeedX = 3
}
if p.PositionY == p.CibleY{
p.SpeedY =0
}
if p.PositionY > p.CibleY{
p.SpeedY = -3
}
if p.PositionY < p.CibleY{
p.SpeedY = 3
}
return p
}
func ClockUpdate(TabParticule []Particle) ([]Particle){
t := gettime()
t[2] = t[2]/60
t[1] = (t[1]+ t[2])/60
t[0] = (t[0]+ t[1])/12
horlogescale := config.General.Horlogescale
Clockminparticule := config.General.InitNumParticles
for k:=0; k < (horlogescale*7); k++ {
i := k + Clockminparticule
TabParticule[i].CibleY, TabParticule[i].CibleX = math.Sincos( math.Pi * (t[0]*2 + 1.0/2.0))
TabParticule[i].CibleY = -1 *TabParticule[i].CibleY* float64(k*9) + float64(config.General.WindowSizeY)/2
TabParticule[i].CibleX = -1 * TabParticule[i].CibleX *float64(k*9) +float64(config.General.WindowSizeX)/2
}
for k:=(horlogescale*7); k < (horlogescale*18); k++ {
i := k + Clockminparticule
TabParticule[i].CibleY, TabParticule[i].CibleX = math.Sincos( math.Pi * (t[1]*2 + 1.0/2.0))
TabParticule[i].CibleY = -1*TabParticule[i].CibleY* float64((k-(horlogescale*7))*8) + float64(config.General.WindowSizeY)/2
TabParticule[i].CibleX = -1*TabParticule[i].CibleX *float64((k-(horlogescale*7))*8) +float64(config.General.WindowSizeX)/2
}
for k:=(horlogescale*18); k < (horlogescale*31); k++ {
i := k + Clockminparticule
TabParticule[i].CibleY, TabParticule[i].CibleX = math.Sincos( math.Pi * (t[2]*2 + 1.0/2.0))
TabParticule[i].CibleY = -1*TabParticule[i].CibleY* float64((k-(horlogescale*18))*8) + float64(config.General.WindowSizeY)/2
TabParticule[i].CibleX = -1*TabParticule[i].CibleX *float64((k-(horlogescale*18))*8) +float64(config.General.WindowSizeX)/2
}
return TabParticule
}
func spirale(p Particle) (Particle){
var centerX = config.General.WindowSizeX/2
var centerY = config.General.WindowSizeY/2
......@@ -113,6 +176,13 @@ func (s *System) Update() {
if config.General.GravityCenter{
s.Content[i] = spirale(s.Content[i])
}
if config.General.GravityPoint{
s.Content[i] = gravitepoint(s.Content[i])
}
}
if config.General.Clock{
s.Content = ClockUpdate(s.Content)
}
NbSpaw := config.General.SpawnRate + s.SpawBuffer
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment