2

AS3 の getBounds 関数は、回転した楕円にぴったりと合わない四角形を返します。代わりに、幅/高さが楕円の最大/最小直径に対応し、その回転に従う長方形の境界に基づいて、軸に沿った長方形を返します。

スタック オーバーフローに関する同様の質問への回答は、私の質問の数学部分をエレガントに概説しています。

楕円と境界ボックスの計算に関する 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 に答える