サイトトップ

Director Flash 書籍 業務内容 プロフィール

Adobe Flash非公式テクニカルノート

角度の値を換算して一定範囲に収める

ID: FN0911002 Product: Flash CS3 and above Platform: All Version: 9 and above/ActionScript 3.0

0から始まる度数の角度は、360度で1周します。したがって、360を超える角度やマイナスの角度は、0から360の範囲の値に換算できます。本稿では、この換算の仕方についてご説明します。

まず、正の値にかぎれば、0から360の値に換算するのは簡単です。剰余演算子%を使えば、指定した値で割った余りが求まりますので、360の剰余をとればよいでしょう。

var nTest:Number = 360 * 2 + 90;
var nDegrees:Number = nTest % 360;
trace(nDegrees);   // 出力: 90

マイナスの値の剰余は、その絶対値の剰余にマイナスをつけた(-1を掛合わせた)値になります。ですから、角度がマイナスであるとわかっていれば、剰余に360を足せば導けます。

var nTest:Number = -360 * 2 + 90;
var nDegrees:Number = nTest % 360 + 360;
trace(nDegrees);   // 出力: 90

すると、剰余をとった後、その値がマイナスだったら360を加えることにすれば、すべての実数値に対応できます。その処理を関数として定義したのが、以下のスクリプト001です。テスト結果は、つぎのようになります。

trace(xGetDegrees(90));   // 出力: 90
trace(xGetDegrees(360 * 2 + 90));   // 出力: 90
trace(xGetDegrees(-90));   // 出力: 270
trace(xGetDegrees(-360 * 2 + 90));   // 出力: 90
スクリプト001■すべての実数値を0から360までの範囲の角度に換算する関数
  1. function xGetDegrees(nDegrees:Number):Number {
  2.   nDegrees %= 360;
  3.   if (nDegrees < 0) {
  4.     nDegrees += 360;
  5.   }
  6.   return nDegrees;
  7. }

もっとも、値がマイナスかどうかに関わらず360を加えても、もう1度剰余をとれば範囲内の値に納まります(スクリプト002)。

スクリプト002■すべての実数値を0から360までの範囲の角度に換算する関数2
  1. function xGetDegrees(nDegrees:Number):Number {
  2.   nDegrees %= 360;
  3.   nDegrees += 360;
  4.   nDegrees %= 360;
  5.   return nDegrees;
  6. }

ActionScriptでは、角度を±180の範囲で扱うことも少なくありません。その場合には上記スクリプト1または2の処理で、予め角度の値に180を加え、求めた値から改めて180を引けばよいでしょう。

スクリプト003■すべての実数値を-180から180までの範囲の角度に換算する関数
  1. function xGetDegrees(nDegrees:Number):Number {
  2.   nDegrees += 180;
  3.   nDegrees %= 360;
  4.   if (nDegrees < 0) {
  5.     nDegrees += 180;
  6.   } else {
  7.     nDegrees -= 180;
  8.   }
  9.   return nDegrees;
  10. }

[*1] DisplayObject.rotationX/rotationY/rotationZプロパティでは、値の範囲は±180が基本とされるものの、実際には範囲を超える値が設定できてしまいます。したがって、プロパティ値を設定する前に、その範囲は制限しておくのが安心でしょう。



作成者: 野中文雄
作成日: 2009年11月30日


Copyright © 2001-2009 Fumio Nonaka.  All rights reserved.