Overblog Suivre ce blog
Editer la page Administration Créer mon blog
/ / /

/************************************************************************
                          REPETITION d'une IMAGE
                          CASCADE en perspective
************************************************************************
- Activer le calque qui sera repete.
- Un unique calque est cree derriere contenant toutes les images
************************************************************************
06/07/2009 V1r01b Habaki : Init RulerUnits to CM, Add comments
05/07/2009 V1r01 Habaki : Creation
************************************************************************/
var ScriptName = "Cascade01";
var ScriptVers = "V1r01b";
var Doc = app.activeDocument;
var RulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.CM;
/*----------------------------------------------------------------------*
Configuration du mouvement d'images
*----------------------------------------------------------------------*/
var NbMax = 20; // Nombre d'images a generer
var Larg = 12.0; // Largeur du mouvement entier (cm)
var Reduc = 95.0; // Pourcentage de reduction de chaque image
var Pente = 0.25; // Pente de la perspective y/x (1 = 45dgrs)
var Angle = 0.0; // Angle de rotation de chaque image (degres)
// Cercle de rebond
var Cr = Larg/3; // Rayon
var Ch = Cr*2/3 // Hauteur du rebond (0 .. Rayon)
/*----------------------------------------------------------------------*
                       Donnees internes
*----------------------------------------------------------------------*/
var Cy = Cr - Ch; // Position centre (-y)
var Cx = Math.sqrt(Cr*Cr - Cy*Cy); // Position centre (x)
var Ex = Larg * 2; // Position oeil (x)
var Ey = 30.0; // Position oeil (-y)
/*----------------------------------------------------------------------*
                       MAIN
*----------------------------------------------------------------------*/
try {
  var X,X1,Y,Y1;
  var Cx1;
  var Layer, Layer1, Layer2=null;
  
  // Choix du claque de depart : calque selectionne
  var Layer0 = Doc.activeLayer;

  X1 = 0.0;
  Y1 = 0.0;
  Cx1 = Cx;
  Layer1 = Layer0;
  // Boucle sur les NbMax images a creer
  for(n=1; n <= NbMax; n++) {
    // Duplication du calque precedent
    Layer = Layer1.duplicate();
    Layer.move(Layer1, ElementPlacement.PLACEAFTER); // Deplacement apres
    Layer.name = Layer0.name + "_" + n; // Nommage du calque
   
    if (Angle)
      Layer.rotate(Angle, AnchorPosition.MIDDLECENTER); // Angle
    
    // Calcul de la position horizontale de l'image : X
    // Perspective d'images qui s'eloignent
    Y = (Ey * n) /NbMax; // Position reelle image (0,Y)
    X = Y*Ex/(Ey + Y); // Avec perspective (X,0)
    Layer.resize(Reduc, Reduc); // Reduction
    
    // Calcul de la position verticale de l'image : Y
    // Rebond sur des arcs de cercle
    if (Cr*Cr < (X-Cx1)*(X-Cx1)) {
      // Passage au rebond suivant
      // (meme cercle. Prevoir reduction si beaucoup de rebonds)
      Cx1 += Cx * 2;
    }
    Y = Math.sqrt(Cr*Cr - (X-Cx1)*(X-Cx1)) - Cy;
    // Perspective verticale (Pente positive : remonte l'horizon)
    Y += X * Pente;
  
    Layer.translate(X-X1, Y1-Y); // Deplacement relatif
    // Sur l'ecran Y va vers le bas
 
    // Fusionne les claques -2 et -1
    if (Layer2 && Layer2 != Layer0) {
      Layer2.merge();
    }
 
    // Ce calque devient le precedent
    X1 = X;
    Y1 = Y;
    Layer2 = Layer1;
    Layer1 = Layer;
  } // for
  // Fusionne l'avant dernier calque
  if (Layer2 && Layer2 != Layer0) {
    Layer2.merge();
  }
}  // try
catch(ex){
  alert(ex.message, ScriptName);
}
/*----------------------------------------------------------------------*
                 Restaure le contexte initial
*----------------------------------------------------------------------*/
app.preferences.rulerUnits = RulerUnits;

 

Partager cette page

Repost 0
Published by