楕円の軌道に傾斜をつける方法を教えてください

このQ&Aのポイント
  • ActionScriptでボールを楕円に動かすスクリプトを作成しています。斜め45度に動くやり方がわかりません。
  • 楕円の軌道に傾斜をつける方法を教えてください。どうしても式がわかりません。
  • 楕円の軌道に傾斜をつける方法を教えてください。サイトを見ても式がわからないので、教えていただけると助かります。
回答を見る
  • ベストアンサー

楕円の軌道に傾斜をつける方法を教えてください

ActionScriptでボールを楕円に動かすスクリプトを作成しています。 x軸、y軸に平行に動くスクリプトはできるのですが、斜め45度に動くやり方がわかりません。 ↓x軸y軸に平行運動する楕円スクリプト。 //-------------------------------------------- //長軸100、短軸50の楕円形にボールを動かす r = 100;//半径 onClipEvent (enterFrame) { ang += 10; //角度を10ずつ追加 radian = Math.PI/180*ang; //ラジアンに変換(1度=pai割る180で計算) X = Math.cos(radian)*r; //コサイン×半径 でx座標を計算 Y = Math.sin(radian)*r; //サイン×半径 でy座標を計算 this._x = X; //Xを座標に反映 this._y = Y/2; //Yの半分を座標に反映 } //-------------------------------------------- なんとか傾斜した動きを作りたくていろんなサイトを見ましたが、どうしても式がわかりません。 ぜひ教えてもらえませんでしょうか。 どうぞよろしくお願いします。

noname#45474
noname#45474
  • Flash
  • 回答数1
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

傾斜とは、□→◇というように楕円の軌道そのものを傾けるとの意味で、よろしいでしょうか? すご~く姑息な方法ですが。 ボールのムービークリップを別のムービークリップの入れ子にし、ボールのムービークリップを楕円の軌道で動かすスクリプトを書きます。 親のムービークリップを 45°傾けると、その子であるボールのムービークリップは傾いた座標系の中で移動しますので、結果的に傾いた楕円軌道を描いて動いているように見えます。 ただし、ボールのムービークリップにも角度が付きます。 そこで、親を傾ける角度とは逆の向き(親を 45°傾けるなら、ボールは -45°)に傾けます。 シンボルを作る時に傾けておくと簡単です。 単色の円だと分からないのですが、画像のように傾いていることがバレると困るものは、こうしてごまかしておくといいですよ。 ------------------------------------------------------------------ まあ、このようなごまかしもありますけれど、もう少し真面目に考えますと。 要するに、傾斜のない状態での楕円上の位置を算出した後、この座標を 45°傾けることができればいいのだと思います。 数学で考える座標軸はX・Y・Zの3種類があります。 Flash など2Dの絵を扱うグラフィックソフトでの回転といえば、普通はZ軸を回転軸とする回転です。 ある点をZ軸回りに回転させた時、回転後の座標は  x: X * cosθ - Y * sinθ  y: X * sinθ + Y * cosθ  z: Z で、求めることができます。大文字の X Y Z が元の座標、θは回転角度です。 画面の座標は2次元なので、Zの座標は無視して構いません。 ちなみに他の軸回りに回転させた場合の式は  X軸回り   x: X   y: Y * cosθ - Z * sinθ   z: Y * sinθ + Z * cosθ  Y軸回り   x: Z * sinθ + X * cosθ   y: Y   z: Z * cosθ - X * sinθ です。 こうして並べてみますと、2Dのグラフィックソフトは2次元座標でZ座標など考えないのに、なぜZ軸回りの回転を扱うかが分かるような気がしますね。 画面の表示に使うXとY座標をZ座標を使わずに計算できるのは、Z軸回りの回転だけだからです。 ********************** 楕円軌道を傾けるには、Z軸回りの回転の式を使います。 先述の通り、この回転はZ座標を考えずにXとY座標を計算できますから、3次元座標でなくても扱えます。 次のように考えます。 まず、普通に楕円運動の計算を行い、楕円軌道上の座標を計算します。 ここで出てきた座標を使ってZ軸回りに 45°回転させる計算を行い、この計算で求められた座標を最終的なムービークリップの座標にします。 ムービークリップの座標を保持する _x と _y プロパティは、親の基準点を原点とする座標になっています。 ステージに配置したムービークリップの親は通常は _root というムービークリップであり、_root の基準点は左上です。 つまり、ステージに直接ボールのムービークリップを配置して楕円状に動かすと、ステージの左上で回ってしまうことになります。 位置は座標を求めた後で配置したい場所の座標を加算することで補正できますが、いちいちそんなことをするのは面倒です。 こちらの場合もボールのムービークリップを他のムービークリップの入れ子にしておくと、ボールの座標は親の基準点から見た座標になります。 あとはこの親をステージに配置するだけで、補正を考えることなくステージのどこにでも置くことができます。 ********************** 仮に、ボールのムービークリップが他のムービークリップシンボルの中に配置されているものとします。 位置はスクリプトで決めますので、適当で構いません。 このボールを楕円状に動かし、更に楕円を 45°傾けるスクリプトは、大体、次のようになります。 このスクリプトはボールのインスタンスに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)  onClipEvent(load)  {   //楕円の長軸と短軸   long_r = 100;   short_r = 50;   //移動速度:単位は°   spd = 10;   //角度を保持   angle = 0;   //楕円の傾斜角度と、その角度のsinおよびcos   tilt_angle = 45;   tilt_sin = Math.sin( tilt_angle * Math.PI / 180 );   tilt_cos = Math.cos( tilt_angle * Math.PI / 180 );  }  onClipEvent(enterFrame)  {   //楕円上での位置を算出   rad = angle * Math.PI / 180;   this._x = Math.cos( rad ) * long_r;   this._y = Math.sin( rad ) * short_r;   //傾斜の角度だけ、座標をZ軸回りに回転させる   this._x = this._x * tilt_cos - this._y * tilt_sin;   this._y = this._x * tilt_sin + this._y * tilt_cos;   //角度を更新   angle = ( angle + spd ) % 360;  } Z軸回りに回転させる時にも sin と cos を使いますが、傾斜角度は常に一定なのでこの計算は1度だけで充分です。 上記のスクリプトでは load イベント発生時に計算を済ませて、結果を変数に保存しています。 楕円の傾斜角度は変数 tilt_angle に入っています。 書き換えると傾きを変更できますが、正負を問わず 90 の倍数は避けてください。 Math クラスのバグというか何と言うかなのですが、sin や cos がオーバーフロー(桁あふれが発生し、変数の値が破壊される現象)して異常な数値になる角度があります。 破壊された数値で更に計算しようとすると、動作がおかしくなるだけでなく Flash がクラッシュする場合があります。 90°単位の傾斜はこんなややこしい計算をしなくても他に方法がいろいろありますので、実際にはあまり使わないと思いますが。

noname#45474
質問者

お礼

丁寧な解説と実際のスクリプトまで書いていただいてありがとうございます。 大変分かりやすく、また知らないこともいっぱいあったのでとても勉強になりました。 いただいた解説と「教えてgoo」の数学の方にあった記事で、自分なりにスクリプトを組んでみました。 自分の備忘もかねて掲載いたします。 参考 ・教えてgoo「これはなぜ楕円なんですか?」ページ  http://oshiete1.goo.ne.jp/kotaeru.php3?q=1519820 ・「回転移動の1次変換」サイト  http://www.geisya.or.jp/~mwm48961/kou2/linear_image3.html //-----以下スクリプト onClipEvent (load) { center = Stage.width/2; //楕円の中心座標 r_long =100; //長軸 r_short = 50; //短軸 degree = 45; //傾斜度 slope = Math.PI/180*(degree); //楕円の傾斜角度をラジアンに変換 sin_slope = Math.sin(slope); //傾斜用のサイン cos_slope = Math.cos(slope); //傾斜用のコサイン } onClipEvent (enterFrame) { /* 原点中心に角θだけ回転させる変換式  傾斜用x'=xcosθ-ysinθ  傾斜用y'=xsinθ+ycosθ ▼θ=45度にする場合  傾斜用新x = x(※cos(radian)×長軸)×cos(45度) - y(※sin(radian)×短軸)×sin(45度)  傾斜用新y = x(※cos(radian)×長軸)×sin(45度) + y(※sin(radian)×短軸)×cos(45度) */ ang += 10; //移動速度(角度)を追加 radian = Math.PI/180*ang; //角度angをラジアンに変換(360度=2PI、180度=PI、90度=PI/2、1度=PI/180) x1 = Math.cos(radian)*r_long; //傾斜前のx座標→コサイン × 長軸 y1 = Math.sin(radian)*r_short; //傾斜前のy座標→サイン × 短軸 //傾斜用新x = 現在のxの長さ×cos(45度)- 現在のyの長さ×sin(45度) newx = (x1*cos_slope) - (y1*sin_slope); //傾斜用新y = 現在のxの長さ×sin(45度)+ 現在のyの長さ×cos(45度) newy = (x1*sin_slope) + (y1*cos_slope); this._x = newx + center; this._y = newy + center; } //-----スクリプト終わり

関連するQ&A

  • y軸に平行な直線と楕円の交点について

    y軸に平行な直線と 始点→x950、y100 終点→x950、y-100 楕円形 中心点→x1000,y0 x軸半径→100 y軸半径→50 軸の傾き→0° の交点を計算で求めたいのですがどの様な式で求められるでしょうか。 丸投げという形になってしまい申し訳ないのですがお力いただけますと幸いです。

  • 円と楕円の交点

    円1 円の中心(A、B) 円の半径R 楕円2 楕円の X軸半径P、Y軸半径Q 中心(X、Y) (これら全ては定数とする) これら円1と楕円2の交点の求め方についてご教示いただけますでしょうか。

  • 楕円と直線の交点を求めるには

    <楕円> 原点座標:(DX,DY) X軸の半径:a Y軸の半径:b  角度:なし <直線> 始点座標:(SX,SY) 終点座標:(EX,EY)  この2つの図形が交わるかどうか、また交わる場合にはその交点の座標を知りたいのです。  「楕円の方程式」「直線の方程式」「解の公式」を使用して手で計算することはできるのですが、 計算式として表すことができません。(中学レベル程度の知識なので・・・) EXCELで数式を設定したいので、上の変数名を使用した具体的な計算式を教えていただければありがたいです。 よろしくお願いいたします。

  • 欠けた楕円の面積

    欠けた楕円の面積の計算の仕方を教えてください。 長半径2.0m、短半径1.6mの楕円で、長径の軸から30度回転させた直線から平行に0.5m離れた直線で切られた楕円の面積の出し方を教えてください。 切られたどちら側の楕円の計算でも結構です。 どうか教えてください。

  • 円と二次曲線と、楕円

    次の方程式の表す図形を描け。 4x^2+9y^2-8x+54y+49=0 教えてください!この問題の回答は 4(x-1)^2+9(y+3)^2=36 よって、だ円4x^2+9y^2=36をx軸、y軸の方向にそれぞれ1、-3だけ移動したものである。。。 っと書かれていて、二つの図が書いてありました! 二つともx軸の方向に横に伸びた、だ円でした。 <教科書では> 中心が0でー3から3までがx軸の範囲で y軸は2と-2が4x^2+9y^2=36の図です。 つまり横が半径±3、縦が±2のだ円でした。 <4x^2+9y^2-8x+54y+49=0の図> これは式を整理すると、確かに 4(x-1)^2+9(y+3)^2=36 になるのですけど、 教科書に書かれてる図をみると、x軸の方向に長いだ円で、中心が(1、-3)で、 半径が横が±3で、縦が±2と 4x^2+9y^2=36の式と同じでした。 そして教科書の説明どおりに、1、-3だけ移動しただけの事にはなってるのですけど、 私がわからないのは、どうして半径が横は3で縦が2なのか不明です!! だって4(x-1)^2+9(y+3)^2=36の 式を見ても、これって半径は6の円じゃないのですか?? スゴクナゾです!!

  • 楕円→円への変換について

     例えば座標の集まりで表された楕円(画素の集まりのようなイメージ)があってそれぞれの座標を移動することで、楕円の短半径を半径とする円を作るとしたらそれぞれのx、y座標をどのように動かせば良いでしょうか?  ふと思いついたことなので説明がうまくないとは思いますが、それでも答えてくださる方いましたらよろしくお願いします。

  • 楕円内の任意の点から楕円周までの最短距離

    長半径がaで、短半径がbである楕円内に、ランダムに点(座標X0,Y0)をプロットし、その点から楕円周までの最短距離をperlを使って計算したいと思っています。 最終的には、最短距離の分布がどのようになっているのかを求めたいと思っています。   この計算の結果は、細胞の形を楕円に近似したときに、特定の組織の位置がランダムな場所にあるのか、細胞の表面近くに存在する傾向があるのかを調べるためのコントロールデータとして使う予定でいます。   しかし、座標X0,Y0から、楕円周までの最短距離をどのようにして計算したらよいのか見当もつきません。計算過程は省いていただいても構いませんので、最終的にどのような式を使えば計算できるのか、教えていただけないでしょうか。 よろしくお願いします。

  • 楕円計算で困っています

    長径2a、短径2bの楕円があり、長軸と短軸の交点座標(いわゆる中心点)を(0,0)とする この中心点からx軸からの角度αで直線を引き、楕円との交点座標を(x1,y1)とし、 また、この座標がx軸に対して対称な座標を(x1,-y1)とする この2点に対して楕円の接線を引いて、2つの線の角度をβとする この条件で(x1,y1)座標と角度βを、a,b,角度αを用いて表現する方法はないでしょうか? 色々考えてみたのですがどうも上手くいきません。 どうかよろしくお願いします。

  • 楕円体の慣性モーメントについてです

    長半径a短半径bの楕円体の慣性モーメントを求めたいです(原点が楕円の中心でx軸y軸z軸それぞれの慣性モーメントを求めたい) r^2dmの積分で慣性モーメントが求まるのでdmは楕円の媒介変数表示で表せる気がしますが、rはあらわしかたが想像できません 楕円体の慣性モーメントのもとめかたわかるかた教えてください

  • 楕円の書き方について

    長方形の4辺に接する楕円は描けるのですが、 平行四辺形の4辺に接するような楕円の描き方が わかりません。 座標を変えて等角図にすれば出来ると思いますが、 出来ればX-Y平面で描きたいと思っています。 どなたかご存知の方がいらっしゃいましたら 教えて頂けないでしょうか? よろしくおねがいします。 ちなみにCADはAutoCAD LT2002です。

専門家に質問してみよう