2

AS3 getBounds 函数返回一个与旋转椭圆不紧密匹配的矩形。相反,它根据矩形的边界返回一个轴对齐的矩形,矩形的宽度/高度对应于椭圆的最大/最小直径并跟随其旋转。

Stack Overflow 上类似问题的答案优雅地概括了我问题的数学部分:

Stack Overflow Q/A 关于椭圆和边界框的数学

基于此,我尝试在 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);
4

1 回答 1

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));
于 2010-01-20T10:09:46.873 回答