Adobe Flash非公式テクニカルノート 角度のように数値を循環させる
DisplayObject.rotationプロパティは、インスタンスの角度を±180度の範囲の値で示します。そして、この範囲を超える数値を与えても、範囲内の角度に換算されて設定されます。このプロパティ値のように、決まった範囲内で値を循環させる計算について考えます。お題としては、やはりわかりやすいので角度を採上げます[*1]。
01 角度を0から360度の範囲に換算する 数値 % 360 数値がマイナスのときは、剰余に360を加えなければなりません。そうすると、逆に正の場合に値が360以上になってしまいます。それだけでなく、負でも余りが0(たとえば-360)のとき360とされます。この問題を避けるには、改めて360の剰余をとればよいでしょう(表001)。計算の対象となる数値が変数nAngleに収められているとすれば、つぎのとおりです。 表001■剰余の式と計算結果
正負に拘らずひとつの式で答えを導けることは、パズルの解き方としては優れています。しかし、正数であれば剰余は1回求めれば済むことを考えると、計算には無駄があります。正負を分けた方が、扱いは速められるでしょう。
360の剰余がマイナスのときのみ360を加えることとしました。これで、要らぬ計算が省けます。 02 角度を±180度の範囲に換算する 前項のスクリプトでは360の剰余をとった後、角度がマイナスのとき360を加えました。そのうえで180差引くなら、合算で180加えればよいことになります。したがって、つぎのスクリプトは、剰余後の正負を分けて計算しています。
頭から数値の正負それぞれについての式を立て、条件演算子?:により振分けると、もう少し最適化できます[*2]。つぎのスクリプトはラジアン値の±πなどにも応用しやすいように、定数をconst宣言しました。
循環する数値の計算の仕方は、ほかにもいろいろあるでしょう[*3]。
作成者: 野中文雄 Copyright © 2001-2011 Fumio Nonaka. All rights reserved. |
||||||||||||||||||||||||||||||||||||||||||