2010-01-16 50 views
2

AS3 getBounds函数返回一个矩形,该矩形不能与旋转的椭圆紧密配合。相反,它会根据矩形的边界返回一个轴对齐的矩形,该矩形的宽度/高度对应于椭圆的最大/最小直径并跟随其旋转。如何在AS3中找到一个旋转椭圆的紧配轴对齐边界框?

这个问题的答案在堆栈溢出类似的问题优雅概括我的问题的数学部分:在此基础上

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

我花了刺伤编码AS3的解决方案。到目前为止,我已经能够生成一个沿x轴完美匹配的矩形,但是当我旋转椭圆时,沿着y轴行为非常奇怪。不是在旋转时在2 * r_min和2 * r_max之间交替,而是在2 * r_min和0之间交替。我最好的猜测是我在求解梯度 - >无穷大的差分t时做了一些错误...

这里是我的代码示例:

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); 

回答

2

我假设atan(x)和cot(x)是可互换的 - 事实证明他们不是。谁也已经想到;)

我的工作AS3代码最终看上去像这样:

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));