AS3 getBounds函数返回一个与旋转的椭圆不紧密的矩形。相反,它返回一个基于矩形边界的轴对齐矩形,其宽度/高度对应于椭圆的最大/最小直径,并跟随其旋转。
Stack Overflow上类似问题的答案优雅地概述了我问题的数学部分:
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);
答案 0 :(得分: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));