【问题标题】:How do you find a tight-fitting, axis-aligned, bounding box of a rotated ellipse in AS3?如何在 AS3 中找到旋转椭圆的紧密配合、轴对齐的边界框?
【发布时间】:2010-01-16 14:45:21
【问题描述】:

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

【问题讨论】:

    标签: actionscript-3 rotation bounding-box ellipse


    【解决方案1】:

    我认为 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-10
      • 2010-09-13
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      相关资源
      最近更新 更多