1.201 Animation

La fonction d’animation, permet de déplacer un ou plusieurs élément(s) de la sélection, selon une direction, un nombre d’étapes et une distance de variation dans l’espace du Plan. Les couleurs passagères peuvent être représentées avec différentes intensités !

4 périodes d’une heure à la bibliothèque des «quatre piliers» pour réaliser ce mini-programme d’animation, de la sélection dans l’espace du plan.

Cette fonction permet de distribuer régulièrement autant d’élément de la sélection active sur autant de calques (layer en américain) selon une direction et un décalage (offset en américain) et un certain nombre de répétition à déterminer.

La distribution de ces éléments s’effectue selon l’indication de cette direction selon laquelle ils seront projetés un certain nombre de fois avec un décalage entre eux d’une distance égale à celle qui est a définir.

Plus le nombre de répétition(s) est important et selon le facteur de variation entre ces éléments, plus la distance de projection qui est un facteur de ces deux valeurs est multipliée par ces deux coefficients.

Le nombre d’itération(s) (de boucle) va déterminer le nombre d’éléments total, sur autant de calque(s), et la distance entre eux, permet de calculer la distance de projection finale.

Dans un premier temps, il faut créer l’animation en fonction des trois paramètres suivant, orientation déplacement et nombre de répétition, puis simplement de lancer l’animation avec le bouton adéqua.

Cette programmation d’une animation selon trois facteurs d’évolution dans l’espace du plan.

    Mode opératoire

  • Indiquer d’un clic sur le cercle indiquant la direction de l’animation.
  • Cliquer et déplacer la souris pour faire varier l’angle d’inclinaison de la flèche de direction.
  • Appuyer sur le touche Majuscule pour ajuster l’angle de direction pour obtenir celui-ci par pas de 15° ou bien avec la touche Ctrl pour obtenir un pas de 5° d’angle, ce qui permet d’observer les angles remarquables : 15,30,45,60,90°….
  • Indiquer d’un clic le nombre d’étape(s) sur le «slider» de progression de la variation.
  • Indiquer d’un clic la distance respective de l’espace de la variation à chaque étape.

    Quelque soit la sélection, le mouvement s’applique à tous les éléments de Denis-draw

  • Cliquer sur le bouton créer l’animation.
  • Ceci fait, cliquer sur le bouton lancer l’animation pour l’observer.
  • Stopper l’animation et cliquer sur le bouton revenir à l’état initial, modifier les paramètres de contrôle pour appliquer une nouvelle animation.
  • La case à cocher blanche située en dessous, quand elle est activée affiche deux touches colorées et permet d’appliquer un fondu d’une couleur à l’autre dans l’intervale de cette transition.

    Résultat

  • Une suite de formes situées sur autant de calques, d’ailleurs, une fonction du dialogue Calques permet de les grouper sur un seul calque.

minizoom.gif DenisDraw, Logiciel de Dessin Vectoriel sur Windows  Pour créer une animation il faut une suite d'images, ce procédé permet de créer à partir d'une sélection un éventail d'images intermédiaires. Pour créer une animation il faut une suite d’images, ce procédé permet de créer à partir d’une sélection un éventail d’images intermédiaires.

Par la suite, l’idée nous est venus de l’appliquer à une suite de vecteurs et de points selon la position de chacun d’eux avec un indice sur chacune des listes de tableaux..

variation.jpg DenisDraw, Logiciel de Dessin Vectoriel sur Windows 1.201 Animation imagedujour.jpg DenisDraw, Logiciel de Dessin Vectoriel sur Windows 1.201 Animation terry_a_vierzon.jpg DenisDraw, Logiciel de Dessin Vectoriel sur Windows 1.201 Animation

zoom.gif DenisDraw, Logiciel de Dessin Vectoriel sur Windows  le dialogue de gestion des calque dispose lui aussi d'une fonction d'animation des calques et rendant visible l'un d'entre eux parmis l'ensemble des calques succésivement. le dialogue de gestion des calque dispose lui aussi d’une fonction d’animation des calques et rendant visible l’un d’entre eux parmis l’ensemble des calques succésivement.



unit Unit_animation;

interface

uses Windows,c_color,wbase,messages,dialbase,utile;

type

  TWin_animation = class(Wbase.TWindow)
    constructor Create(AParent:Wbase.TWindow);
    procedure   Setupwindow; override;
    procedure 	WMpaint(var msg:tmessage); override;
    procedure   WMCommand(var Msg:tmessage); override;
    procedure   Make_animation;
    procedure   Do_animation(ellapse:integer);
    procedure   Memoriser_l_etat_initiale;
    procedure   Revenir_a_l_etat_initial;
    procedure   Positionner_les_curseurs(var Msg: TMessage);
    procedure 	WMLButtonDown(var Msg: TMessage); override;
		procedure   WMLButtonUp(var Msg: TMessage); override;
		procedure   WMMOUSEMOVE(var msg:tmessage); override;
    procedure   WMTimer(var Msg: TMessage);	override;
    procedure   Animation_des_calques;
    procedure   WMClose(var msg:TMessage); override;
    procedure 	WMSet_painture_control(var Msg: TMessage); override;
    private
      angle:integer;
      down:boolean;
      offset,count:integer;
      timer_actif:boolean;
      variation_des_couleurs:boolean;
      color_one,color_two:tcolorref;
      color_one_picker:boolean;
      color_two_picker:boolean;
    end;

implementation

uses u_object,col_plan,wutil,wproche,unit_menu,g_base,wmain,
      wmenuk,deformat,U_fast_bitmap,haide,
      hls_rvb,sysutils,z_open_file,Dial_champs,
      GDIPAPI,gdipobj,Classes,relation,graphics,drawsym;
        {Ces unités avec ces définitions}

var rect_repetition : trect;
    rect_decalage : trect;
    rect_create_animation : trect;
    rect_lancer_animation : trect;
    rect_remise_a_zero : trect;
    rect_allow_color : trect;
    rect_color_one : trect;
    rect_color_two : trect;

const k_offset = 160;
      kid_animation = 1000;

constructor TWin_animation.Create(AParent:Wbase.TWindow);
  const k_window_size =180;
  begin
  inherited Create(AParent,'Animate',
    getsystemmetrics(SM_CXFULLSCREEN) div 2-k_window_size div 2,
    getsystemmetrics(SM_CYFULLSCREEN) div 2-k_window_size div 2,
      k_window_size,k_window_size+k_offset,True,false,0); {True pour l'exstyle}
  Self.Memoriser_l_etat_initiale;
  end; {TWin_animation.Create}

procedure TWin_animation.Setupwindow;
  begin
  inherited Setupwindow;
  self.angle:=90;
  self.down:=False;
  self.timer_actif:=False;
  self.offset:=10;
  self.count:=12;
  self.variation_des_couleurs:=false;
  self.color_one:=g_base.RGB_Bleu;
  self.color_two:=g_base.RGB_blanc;
  self.color_one_picker:=false;
  self.color_two_picker:=false;
  end;

procedure TWin_animation.WMpaint(var msg:tmessage);
  var i,j:integer;
      paintdc,memdc,memorydc:hdc;
      arect:trect;
      PaintStruct:TPaintStruct;
      une_distance,un_angulary:real;
      une_couleur:tcolorref;
      old_bitmap,old_deux_bitmap:hbitmap;
      apc:pc100;
      une_typo:hfont;
      abrush:hbrush;
      apoint:tpoint;
      Size:tsize;
      lr_angle_en_radian:real;
      graphics:gdipobj.TGPGraphics;
      pencil_vanille:TGPPen;
      faster:U_fast_bitmap.TFastBitmap2;
      bitmap:tbitmap;
      time_before:integer;
  begin
  time_before:=gettickcount;
  getcursorpos(apoint);
  screentoclient(self.hwindow,apoint);
  getclientrect(self.hwindow,arect);
  paintdc:=windows.beginpaint(self.hwindow,PaintStruct);
  memdc:=createcompatibledc(paintdc);
  with arect do old_bitmap:=selectobject(memdc,createcompatiblebitmap(paintdc,right,bottom));
  rectangle(memdc,-1,-1,succ(arect.right),succ(arect.bottom));
  if false then ellipse(paintdc,20,20,arect.right-20,arect.bottom-20);
  if true then
    begin
    with arect do faster.Creer(right,bottom);
    //Ceci pour dessiner la roue des couleurs un disque
    //Quelque soit la position d'un point si la distance de celui-ci
    //Par rapport au centre du cercle est inférieur au rayon le colorier.
    for i:=0 to arect.right do for j:=0 to arect.bottom-k_offset do
      begin
      une_distance:=utile.distance(i,j,arect.right div 2,(arect.bottom-k_offset) div 2);
      if une_distancenil then
          begin
          an_element:=un_calque_actif.formindex(un_index);
          if an_elementnil then
            begin
            an_element.deplace(i*deplacement_offset.x,i*deplacement_offset.y,0);
            if self.variation_des_couleurs then
              begin
              an_element.couleur_pinceau:=deformat.IN_Between_longint_RGB(self.color_one,self.color_two,i,nb_repetition);
              an_element.brush1.lbColor:=an_element.couleur_pinceau;
              end;
            an_element.Export_ato(flux_des_transitions,error,self.hwindow);
            an_element.deplace(-i*deplacement_offset.x,-i*deplacement_offset.y,0);
            end;
          end;
        end; {For j}
      end; {For i}
    flux_des_transitions.Free;
    end; {an_elementnil}
  wmain.MainWindow.Lecture_du_fichier(temp_file_transition);
  end; {TWin_animation.Make_animation}

procedure TWin_animation.WMLButtonDown(var Msg: TMessage);
  var apoint,un_point_menu_popup:tpoint; un_menu_popup:hmenu;
  begin
  apoint.x:=Smallint(loword(msg.lparam));
  apoint.y:=Smallint(hiword(msg.lparam));
  self.down:=true;
  self.WMMOUSEMOVE(msg);
  self.Positionner_les_curseurs(Msg);
  if ptinrect(Unit_animation.rect_lancer_animation,apoint) then
    begin
    if self.timer_actif then
      begin
      self.timer_actif:=False;
      killtimer(self.hwindow,kid_animation);
      invalidaterect(self.hwindow,nil,false);
      invalidaterect(wmain.MainWindow.hwindow,nil,false);
      end
    else
      begin
      un_menu_popup:=CreatePopUpMenu;
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_10_millisecondes,'10 millisecondes');
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_50_millisecondes,'50 millisecondes');
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_75_millisecondes,'75 millisecondes');
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_100_millisecondes,'100 millisecondes');
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_200_millisecondes,'200 millisecondes');
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_300_millisecondes,'300 millisecondes');
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_400_millisecondes,'400 millisecondes');
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_500_millisecondes,'500 millisecondes');
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_1000_millisecondes,'Une seconde');
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_2000_millisecondes,'Deux secondes');
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_3000_millisecondes,'Trois secondes');
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_4000_millisecondes,'Quatre secondes');
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_5000_millisecondes,'Cinq secondes');
      Appendmenu(un_menu_popup,MF_SEPARATOR,0,nil);
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_25_images_par_secondes,'25 images par secondes');
      Appendmenu(un_menu_popup,MF_String,Dial_champs.unit_timer_50_images_par_secondes,'50 images par secondes');
      GetCursorPos(un_point_menu_popup);
      TrackPopupMenu(un_menu_popup,0,un_point_menu_popup.x,un_point_menu_popup.y,0,self.hwindow,nil);
      end;
    end
  else if ptinrect(rect_create_animation,apoint) then
    self.Make_animation
  else if ptinrect(rect_remise_a_zero,apoint) then
    self.Revenir_a_l_etat_initial
  else if ptinrect(rect_allow_color,apoint) then
    begin
    self.variation_des_couleurs:=not self.variation_des_couleurs;
    invalidaterect(self.hwindow,nil,false);
    end;
  end; {TWin_animation.WMLButtonDown}

procedure TWin_animation.WMLButtonUp(var Msg: TMessage);
  var apoint:tpoint;
      arect,arect_help:trect;
      my_color_picker:c_color.tw_color_surgissante;
  begin
  getclientrect(self.hwindow,arect);
  apoint.x:=Smallint(loword(msg.lparam));
  apoint.y:=Smallint(hiword(msg.lparam));
  self.down:=false;
  if ptinrect(rect_color_one,apoint) then
    begin
    color_one_picker:=true;
    color_two_picker:=false;
    my_color_picker:=c_color.tw_color_surgissante.Create(self,false,false);
    end
  else if ptinrect(rect_color_two,apoint) then
    begin
    color_one_picker:=false;
    color_two_picker:=true;
    my_color_picker:=c_color.tw_color_surgissante.Create(self,false,false);
    end;
  setrect(arect_help,arect.right-20,4,arect.right-4,20);
  if ptinrect(arect_help,apoint) then
    haide.aide_context_by_string('animation');
  end; {TWin_animation.WMLButtonUp}

procedure TWin_animation.WMMOUSEMOVE(var msg:tmessage);
  var apoint:tpoint;
      arect:trect;
      une_distance:real;
  begin
  if self.down then
    begin
    getclientrect(self.hwindow,arect);
    apoint.x:=Smallint(loword(msg.lparam));
	  apoint.y:=Smallint(hiword(msg.lparam));
    une_distance:=utile.distance(apoint.x,apoint.y,arect.right div 2,(arect.bottom-k_offset) div 2);
    if une_distancenil) and (un_calque.ClassType=col_plan.TCalque) then
      if un_calque.visible=1 then
        isel:=i;
    end;
  //Passer tous les calques à invisible
  for i:=0 to pred(wmain.MainWindow.wmsg.col_dessin.list_calque.Count) do
    begin
    un_calque:=col_plan.TCalque(wmain.MainWindow.wmsg.col_dessin.list_calque.at(i));
    if (un_calquenil) and (un_calque.ClassType=col_plan.TCalque) then
      un_calque.visible:=0;
    end;
  //Activer le calque suivant ou le premier calque si la boucle est terminée
  isel:=(succ(isel)) mod wmain.MainWindow.wmsg.col_dessin.list_calque.count;
  un_calque:=col_plan.TCalque(wmain.MainWindow.wmsg.col_dessin.list_calque.at(isel));
  if (un_calquenil) and (un_calque.ClassType=col_plan.TCalque) then
    un_calque.visible:=1;
  old_cursor:=wmain.MainWindow.bool_show_cursor_when_redraw;
  wmain.MainWindow.bool_show_cursor_when_redraw:=false;
  invalidaterect(wmain.MainWindow.hwindow,nil,false);
  updatewindow(wmain.MainWindow.hwindow);
  wmain.MainWindow.bool_show_cursor_when_redraw:=old_cursor;
  if (GetKeyState(vk_Control)

&copy Beelog
www.Denisdraw.fr
Posted in .