2010-01-16 2 views
2

La fonction getBounds AS3 renvoie un rectangle qui ne correspond pas étroitement à une ellipse pivotée. Au lieu de cela, il renvoie un rectangle aligné sur l'axe basé sur les limites d'un rectangle dont la largeur/hauteur correspond au diamètre max/min de l'ellipse et suit sa rotation.Comment trouvez-vous une boîte de jonction serrée et alignée sur les axes d'une ellipse pivotée dans AS3?

La réponse à une question similaire sur Stack Overflow contours avec élégance la partie mathématique de ma question:

Stack Overflow Q/A about the math of ellipses and bounding boxes

Basé sur cela, je pris un coup de couteau à coder une solution dans AS3. Jusqu'à présent, j'ai été capable de produire un rectangle qui correspond parfaitement à l'axe des x, mais comme je tourne mon ellipse, il agit très bizarre le long de l'axe des y. Plutôt que d'alterner entre 2 * r_min et 2 * r_max en tournant, il alterne entre 2 * r_min et 0. Ma meilleure estimation est que j'ai fait quelque chose de mal en résolvant le t différencié pour gradient -> infini ...

Voici un exemple de mon code:

var r_max:uint = 45; 
var r_min:uint = 20; 
var rot:Number = ellipse.rotation * (Math.PI/180); 
var t_nil:Number = Math.atan(-r_min * Math.tan(rot)/r_max); 
var t_inf:Number = Math.atan(r_min * Math.atan(rot)/r_max) + (Math.PI/2); 
var x:Number = r_max * Math.cos(t_nil) * Math.cos(rot) - r_min * Math.sin(t_nil) * Math.sin(rot); 
var y:Number = r_min * Math.sin(t_inf) * Math.cos(rot) + r_max * Math.cos(t_inf) * Math.sin(rot); 

Répondre

2

Je supposais atan (x) et lit bébé (x) étaient interchangeables - se révèle qu'ils ne sont pas. Qui aurait cru;)

Mon code AS3 de travail a fini par ressembler à ceci:

var r_max:uint = 45; 
var r_min:uint = 20; 
var rot:Number = ellipse.rotation * (Math.PI/180); 
var t_nil:Number = Math.atan(-r_min * Math.tan(rot)/r_max); 
var t_inf:Number = Math.atan(r_min * (Math.cos(rot)/Math.sin(rot))/r_max); 
var rect_width:Number = 2 * (r_max * Math.cos(t_nil) * Math.cos(rot) - r_min * Math.sin(t_nil) * Math.sin(rot)); 
var rect_height:Number = 2* (r_min * Math.sin(t_inf) * Math.cos(rot) + r_max * Math.cos(t_inf) * Math.sin(rot)); 
Questions connexes