Forums Développement Multimédia

Aller au contenu

Qu'est-ce la methode getRect() a dans le ventre?

getRect geometrie bounds

1 réponse à ce sujet

#1 Le_Pioo

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 09 December 2018 - 20:29 PM

Bonjour,

Je tente actuellement de recoder la méthode getRect() de la classe DisplayObject à la main pour la raison suivante... je suis un fou furieux ! Et puis aussi j'aimerais comprendre ce que cette méthode a dans le ventre et comment elle fonctionne réellement.

J'ai réussi à calculer le rectangle d'un clip enfant au sein de son clip parent en appliquant la matrice (position,rotation,scale) de ce dernier aux coordonnées du clip enfant.
En revanche lorsque les deux clips ne sont pas enfant ou parent l'un de l'autre mon calcul est erroné...

Auriez-vous une piste, voir même les sources de cette méthode ?

J'ai conscience que ma demande est un peu "poussée" et je remercie quiconque s'y penchera!

PS:J'ai décompilé les sources en .swf mais la classe DisplayObject fait apparemment appel à du code C++ et toutes les méthodes sont natives et "vides".


package  {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.Shape;
import flash.display.DisplayObjectContainer;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.geom.Matrix;
import flash.display.DisplayObject;

public class Main extends MovieClip {
 
  private var parentClip:Sprite ;
  private var childClip:Sprite;
 
  public function Main() {
   parentClip=new Sprite();
   childClip=new Sprite();
 
   var shape=new Shape();
   shape.graphics.beginFill(0x0000FF);   //
   shape.graphics.drawRect(0, 0, 100,100);  //Drawing a 100*100 square
   shape.graphics.endFill();     //
 
   parentClip.scaleX=parentClip.scaleY=1.5;
   parentClip.rotation=15;
   parentClip.x=parentClip.y=5;
 
   childClip.scaleX=childClip.scaleY=1.2;
   childClip.rotation=13;
   childClip.y=childClip.x=10;
 
   childClip.addChild(shape);  
   //parentClip.addChild(childClip);    //When this line is commented the myOwnGetRect won't work anymore
 
   trace(childClip.getRect(parentClip));
   trace(myOwnGetRect(childClip, parentClip));
  }
 
  private function myOwnGetRect(source:DisplayObjectContainer,target:DisplayObjectContainer){
   var minX:Number=Number.POSITIVE_INFINITY;
   var maxX:Number=Number.NEGATIVE_INFINITY;
   var minY:Number=Number.POSITIVE_INFINITY;
   var maxY:Number=Number.NEGATIVE_INFINITY;
 
   var topLeft:Point=new Point(source.getChildAt(0).x,source.getChildAt(0).y);
   var topRight:Point=new Point(source.getChildAt(0).x+source.getChildAt(0).width,source.getChildAt(0).y);
   var botLeft:Point=new Point(source.getChildAt(0).x,source.getChildAt(0).y+source.getChildAt(0).height);
   var botRight:Point=new Point(source.getChildAt(0).x+source.getChildAt(0).width,source.getChildAt(0).y+source.getChildAt(0).height);
   var directParent:DisplayObjectContainer=source;
 
   while(directParent  && directParent != target && directParent != stage){
   topLeft=applyMatrix(topLeft,directParent);
   topRight=applyMatrix(topRight,directParent);
   botLeft=applyMatrix(botLeft,directParent);
   botRight=applyMatrix(botRight,directParent);
   directParent=directParent.parent;
   }
 
   var pts = [topLeft,topRight,botLeft,botRight];
 
   for (var i:int = 0; i < pts.length; i++) {
         var pt:Point = pts[i];
         if (pt.x < minX) minX = pt.x;
         if (pt.x > maxX) maxX = pt.x;
         if (pt.y < minY) minY = pt.y;
         if (pt.y > maxY) maxY = pt.y;
   }
   return(new Rectangle(minX,minY,maxX-minX,maxY-minY));
  }
 
  private function applyMatrix(point:Point, matrixSource:DisplayObject){
   var matrix:Matrix=new Matrix();
   matrix.scale(matrixSource.scaleX, matrixSource.scaleY);
   matrix.rotate(matrixSource.rotation * Math.PI / 180);
   matrix.translate(matrixSource.x,matrixSource.y);
   return(matrix.transformPoint(point));
  }
}

}
 


#2 bigso11

    Ceinture Blanche

  • Members
  • Pip
  • 4 messages

Posté 14 December 2018 - 13:22 PM



Fax Cover Sheet Fax Cover Sheet Template Fax Cover Sheet PDF Free Fax Cover Sheet Printable Fax Cover Sheet Fax Cover Sheet Word Fax Cover Sheet Printable Blank Fax Cover Sheet Sample Fax Cover Sheet Bill of Sale Bill of Sale Form Bill of Sale Template Vehicle Bill of Sale Car Bill of Sale DMV Bill of Sale Auto Bill of SaleBill of Sale PDF


2019 calendar printable Download Free 2019 Calendar 2019 Calendar templatejanuary 2019 Calendar template 2019 printable calendar january2019 printable calendar january 2019 calendar holiday 2019 calendar PDF 2019 calendar wordjanuary printable calendar 2019 2019 blank calendar




1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP