2010-01-16 74 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));