6

クランチクランチ。

Get End Point in ArcSegment with Start X/Y and Start+Sweep Anglesの計算を使用して、どのように角度を縮めたり膨らませたりすることができますか。

以下の画像を参照してください。緑の箱はオリジナルです。黄色の線は、収縮または膨張した開始/終了角度がどうなるかを示していますが、赤い線は、収縮または膨張した楕円弧上で start=169、end=293 の元の角度が維持されている場合です。

緑のボックスの元の値と、青とオレンジのボックスの高さ/幅/xRadius/yRadius の値に基づいて、開始/終了の新しい角度を作成する方法を理解する方法が必要です。

オリジナル幅を縮めた背の高い

新しい角度がどうあるべきかを理解するための計算を知っている人はいますか?

4

2 に答える 2

1

これを計算するスプレッドシートを書きました。必要に応じて、 https://skydrive.live.com/redir?resid=23B7BEDE6527529E !529&authkey=!AGboDW72AySsnK8で見ることができます。(これにより、オンラインで動作するバージョンが生成されるはずですが、ダウンロードすることもできるはずです。)

基本的なテクニックは次のように機能します。

  1. スクランチされていないエンドポイントの X 座標と Y 座標を計算します
  2. 単純なスケーリングを使用してそれらをスクランチし、目的のエンドポイントの X 座標と Y 座標を取得します
  3. それらから角度に戻る

これにはかなりの計算が含まれます。そのスプレッドシートでそれをたどることができますが、すべての手順は次のとおりです。

まず、角度を変換して座標ジオメトリの規則を使用します。私が知る限り、3 時から時計回りに測定していますが、座標ジオメトリでは、正の角度が反時計回りであることがより一般的です。したがって、開始角度と終了角度はそれぞれ 191 度と 67 度になります。(私がこれを行ったのは、この方が数学の混乱が少ないことがわかったからです。))

次に、スプ​​レッドシートは始点と終点の半径を計算します。開始点と終了点に使用している式は次のとおりです。

=D2*D3/SQRT(POWER(D3*COS(RADIANS(D4)),2) + POWER(D2*SIN(RADIANS(D4)),2))
=D2*D3/SQRT(POWER(D3*COS(RADIANS(D5)),2) + POWER(D2*SIN(RADIANS(D5)),2))

D2 と D3 は、X と Y の半径です。D4 は開始角度で、D5 は終了角度です (「従来の」角度になるように調整されています)。この式は、Wikipedia のEllipsesの「中心に対する極形式」というセクションの項目から取得しました。その方程式は角度を取り、楕円の半径がその角度でどうなるかを教えてくれます。

次に、これを使用して、始点と終点の X 座標と Y 座標を計算します。開始 X および Y の式は次のとおりです。

=$B$8*COS(RADIANS(D4)) + D2
=D3-$B8*SIN(RADIANS(D4))

前述のように、D2 と D3 は X と Y の半径で、D4 は開始角度です。(端の X と Y の式は、D5 の場合のみ同じように見えます。X 半径を追加する理由は、この数値がないと、-Xradius から +Xradius までの範囲になるためです。これを追加すると、0 から幅の範囲になることを意味します。Y 軸は似たようなものですが、コンピューター グラフィックス システムではこれが上下逆になる傾向があるため (Y を大きくするとページが下に行く傾向があるため)、画面座標を取得するために反転させました。 。ごめん!

次に、縮んだ X と Y を計算します。開始点の式は次のとおりです。

=B9/B2*B13
=B10/B3*B14

B9 と B10 は、前の手順で計算されたストレッチ前の X と Y です。B2 と B3 は元の幅と高さで、B13 と B14 は縮んだ幅と高さです。(もちろん、最後の数式はかなり似ています。) したがって、これは単純なスケーリング操作です。

最後に、これらから角度を計算します。開始角度の式は次のとおりです (終了角度はほぼ同じです)。

=MOD(DEGREES(ATAN2(B16 - $D$13, $D$14-B17)), 360)

ATAN2 関数は、X 座標と Y 座標を取り、原点からその X、Y ポイントまでの線の角度を示します。Excel はラジアンで動作するため、これを度に戻す必要があります (以前の数式で度からラジアンに変換していたように)。そして、負の角度を避けるために MOD 360 を使用しています。ATAN2 は PI (つまり 180 度) より大きい値を生成することはなく、それを超える角度に対して負の値を生成します。そのモジュロ 360 を取ると、正の数に戻ります。

そして最後のステップは、これを時計回りの角度システムに戻すことです:

= 360 - B19

引き伸ばされた 1.88/3.4 次元を入力すると、165.51 度と 287.70 度が得られます。それはあなたの数字と完全には一致しませんが、私はあなたがそれらをどこから得たのかを突き止めようとしています. それらは目で行われますか?2.5/2.55 を入力すると、171.71 と 299.51 になります。繰り返しますが、あなたのものとはわずかに異なりますが、それほど違いはありません。

于 2013-03-08T18:11:22.210 に答える
1

このコードが実際に何をしているのかを考えてみると、縦または横のスケールに非常に似ています (ちなみに、どちらが機能しますか?)。楕円固有のジオメトリに実際に飛び込むことなく、これを解決する手がかりが得られると思います。

一般的なアプローチは、角度と半径の設定に基づいて X、Y 座標の端点を把握し、倍率を適用してから角度に変換することです。また、最初に知る必要があるのは、楕円の中心です。私たちが知っているのは、始点と終点、および始点と終点の角度です。その情報を使用して、非常に単純な一連の方程式を設定して解くことができます: ((x,y) は楕円の中心です)

(yEnd-y)/(xEnd-x) = tan(endAngle) = 中心から終点までの線の傾き (yStart-y)/(xStart-x) = tan(startAngle) = 中心から始点までの線の傾き

この便利な情報を使用して、新しい中心 (x',y')、x と y の半径、端点 (xEnd', yEnd') をスケール係数で計算できます。(定義上、開始点は 0,0 だと思いますが、必要に応じて変更してください)。

x' = x * xScale, y' = y*yScale xEnd' = xEnd * xScale, yEnd' = yEnd * yScale

xRadius' = xRadius * xScale, yRadius' = yRadius * yScale

次に、新しい角度を把握する必要があります。

Math.Atan2(yStart', xStart') = 新しい開始角度 Math.Atan2(yEnd', xEnd') = 新しい終了角度

その戦略は理にかなっていますか?

于 2011-04-02T05:55:45.360 に答える