J'ai voulu refaire (je ne trouvé pas les images correspondantes) les pochettes (du moins l'extérieure) d'album de Kratwerk. Celles-ci sont toutes identiques aux couleurs du fond, des personnages, de l'ombre et éventuellement de la tête. J'ai fait une première version sans struct et je me suis dit que cela devait bien rentré dans le cadre des struct. J'ai donc codé, et j'ai un problème de passage d'arguments (je pense). En effet tout fonctionne, les personnages sont aux bons endroits, ils sont correctement représentés, sauf, leurs couleurs qui restent désespérément noire.
Est-ce que quelqu'un a une idée de comment je pourrais gérer ce petit problème (et éventuellement me dire quelles âneries j'ai faites).
Code : Tout sélectionner
settings.outformat="pdf" ;
import graph ;
import math ;
import geometry ;
usepackage("calrsfs") ;
import interpolate ;
import animate ;
animation K ;
struct Musicien
{
// dimension des blocs
real l = 0.3 ;
// Epaisseur de l'ombre
real ep = 0.075 ;
// Position sur l'image
pair pos ;
// Couleur
pen colCorp ;
pen colOmbre ;
pen colTete ;
// matrice des positions des blocs
int[][] m ;
void operator init(int[][] tab, pair ref, pen p1, pen p2, pen p3)
{
this.m = tab ;
this.pos = ref ;
this.colCorp = p1 ;
this.colOmbre = p2 ;
this.colTete = p3 ;
}
path carre = (0,0)--(l,0)--(l,l)--(0,l)--cycle ;
path[] personnage()
{
path[] c ;
for(int y = 0 ; y < 13 ; ++y)
{
for(int x = 0 ; x < 9 ; ++x)
{
if(this.m[y][x] == 1)
{
path d = shift(x*l,y*l)*carre ;
c = c^^d ;
}
}
}
return shift(-l*8,l*13)*reflect((l*4.5,0),(l*4.5,l*6))*rotate(180)*c;
}
void affiche()
{
fill(shift(pos.x-ep,pos.y+ep)*personnage(),this.colOmbre) ;
fill(shift(pos.x,pos.y)*personnage(),this.colCorp) ;
fill(shift(pos.x+l*4,pos.y+l*12)*carre,this.colTete) ;
}
void print()
{
write("Via la classe Musicien") ;
write("Couleur du corps : ",this.colCorp) ;
write("Couleur de l'ombre : ",this.colOmbre) ;
write("Couleur de la tete : ",this.colTete) ;
}
}
struct Cover
{
// Dimension de l'image
real L = 13 ;
real l = 0.3 ;
pen colFond ;
pen colCorpM ;
pen colOmbreM ;
pen colTeteM ;
int[][] ralf =
{
{0,0,0,1,0,0,0,0,0},
{0,1,0,1,0,0,0,0,0},
{0,1,1,1,1,0,0,0,0},
{0,0,1,1,1,1,0,0,0},
{0,0,0,1,1,0,1,0,0},
{1,1,1,1,1,1,1,1,1},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,0,0,0,0,0},
} ;
int[][] hennig =
{
{0,0,0,1,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0},
{0,0,1,1,1,0,0,0,0},
{0,0,1,1,1,0,0,0,0},
{0,0,0,1,1,1,0,0,0},
{1,1,1,1,1,1,1,1,1},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0},
} ;
int[][] fritz =
{
{0,0,0,0,1,0,0,0,0},
{0,0,0,0,1,0,0,0,0},
{0,0,0,1,1,1,0,0,0},
{0,0,0,1,1,1,0,0,0},
{0,0,1,0,1,0,0,0,0},
{1,1,1,1,1,1,1,1,1},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,0,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
} ;
int[][] falk =
{
{0,0,0,0,1,0,0,0,0},
{0,0,0,0,1,0,0,0,0},
{0,0,0,1,1,1,0,0,0},
{0,0,0,1,1,1,0,0,0},
{0,0,0,1,1,0,0,0,0},
{1,1,1,1,1,1,1,1,1},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,1,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0},
} ;
void operator init(pen p1, pen p2, pen p3, pen p4)
{
this.colFond = p1 ;
this.colCorpM = p2 ;
this.colOmbreM = p3 ;
this.colTeteM = p4 ;
}
path fond = (0,0)--(L,0)--(L,L)--(0,L)--cycle ;
pen cc = this.colCorpM ;
pen co = this.colOmbreM ;
pen ct = this.colTeteM ;
Musicien Ralf= Musicien(ralf,(0.6,L/2-6.5*l),cc,co,ct) ;
Musicien Hennig=Musicien(hennig,(12*0.3,L/2-6.5*l),cc,co,ct) ;
Musicien Fritz=Musicien(fritz,(22*0.3,L/2-6.5*l),cc,co,ct) ;
Musicien Falk=Musicien(falk,(32*0.3,L/2-6.5*l),cc,co,ct) ;
void print()
{
write("Via la classe Cover") ;
write("Couleur du corps : ",this.colCorpM) ;
write("Couleur de l'ombre : ",this.colOmbreM) ;
write("Couleur de la tete : ",this.colTeteM) ;
}
void afficheCover()
{
fill(fond,this.colFond) ;
Ralf.affiche() ;
Ralf.print() ;
Hennig.affiche() ;
Fritz.affiche() ;
Falk.affiche() ;
this.print() ;
}
}
unitsize(1cm,1cm) ;
Cover cd1 = Cover(yellow,blue,white,red) ;
cd1.afficheCover() ;
Olivier