トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     MovieClipの座標の比較について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
yonhon
Åê¹ÆNo.25166
投稿日時: 2006-4-26 2:12
新米
居住地:
投稿: 17
使用環境:
WinXP,Flash8Pro,FCS1.5(Linux)
MovieClipの座標の比較について
MovieClipの_xや_yについてですが、
小数点のついたマイナス数値の比較が
うまくいきません。

_root.createEmptyMovieClip( "mc", 1 );

var x = -4.1;

mc._x = x;

if( mc._x != x )
{
	trace( "違います" );
}


私の頭の中では、
test_mc._x と x は両方とも-4.1のハズなのですが
実行するとなぜかトレース部分が走ってしまいます。

何か根本的に勘違いをしているのだと思うのですが、
ハマってしまってうまく理解できません。

ご指摘いただけるとありがたいです
森 なおき
Åê¹ÆNo.25167
投稿日時: 2006-4-26 2:39
モデレータ
居住地: 福岡(心は大阪)
投稿: 527
使用環境:
:MacOSX10.6.8
:FlashCS5.5
Re: MovieClipの座標の比較について
なおきです。

まず?でなく「4.1」でも同じ結果になるはずです。
それはさておき「-4.05」などにするとyonhonさんが望まれる結果になるはずです。

これは内部の精度が1ピクセルの1/20になっていることに起因していると思われます。
だとしたら-4.1でも問題がなさそうな気がするのですが謎ですね。
ちなみに「-4.15」などとしても望まれる結果が得られます。


----------------
な お き
Dev.:MacOSX+FlashCS5.5
View:---

yonhon
Åê¹ÆNo.25168
投稿日時: 2006-4-26 3:11
新米
居住地:
投稿: 17
使用環境:
WinXP,Flash8Pro,FCS1.5(Linux)
Re: MovieClipの座標の比較について
引用:
まず?でなく「4.1」でも同じ結果になるはずです。

あ、そうみたいですね。気づきませんでした^^;

引用:
これは内部の精度が1ピクセルの1/20になっていることに起因していると思われます。

parseFloat()をかますとなぜか望む結果になりました。

_root.createEmptyMovieClip( "mc", 1 );

var x = 4.1;

mc._x = x;

if( parseFloat( mc._x ) != x )
{    
	trace( "違います" );
}

ちなみにmc._xはトレースすると4.1と出ます。
回避策としてはウマくいったのですが、
parseFloat()するとウマくいくのが釈然としません。
mc._xには4.100000.....0000001のような
数値が入っているのかなぁ?
情報おまちしております^^;
野中文雄
Åê¹ÆNo.25169
投稿日時: 2006-4-26 3:42
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: MovieClipの座標の比較について
私の環境(Flash 8.0/Mac OS X.4.6)では、プラスマイナスいずれの値でも、問題は再現しません。
引用:
yonhonさんは書きました:
引用:
まず?でなく「4.1」でも同じ結果になるはずです。

あ、そうみたいですね。気づきませんでした^^;

以下をtrace()してみてください。
trace([mc._x, x, mc._x-x>0, mc._x-x == 0, mc._x-x<0]);

引用:
ちなみにmc._xはトレースすると4.1と出ます。

丸め誤差」の発生している可能性が考えられます。
引用:
mc._xには4.100000.....0000001のような
数値が入っているのかなぁ?

コンピュータの演算では、「丸め誤差」は不可避ですので、浮動小数値同士の等価比較は避けることが安全でしょう。
var x:Number = 1000;
var nAns0:Number = Math.log(x)/Math.LN10;
trace(nAns0);  // 出力: 3 
trace(Math.floor(nAns0));  // 出力: 2 
trace(Math.floor(parseFloat(nAns0.toString())));  // 出力: 3
trace(xIsEqual(nAns0, 3));  // 出力: true
// parseFloat()はつねに有効ではない
var nAns1:Number = 1.001-1;
trace(nAns1);  // 出力: 0.00099999999999989
trace(parseFloat(nAns1.toString()));  // 出力: 0.00099999999999989
trace(xIsEqual(nAns1, 0.001));  // 出力: true
function xIsEqual(n0:Number, n1:Number, nExp:Number):Boolean {
	nExp = (!isNaN(nExp)) ? nExp : -15;
	return (Math.abs(n0-n1)<Math.pow(10, nExp));
}


----------------
 

yonhon
Åê¹ÆNo.25173
投稿日時: 2006-4-26 4:59
新米
居住地:
投稿: 17
使用環境:
WinXP,Flash8Pro,FCS1.5(Linux)
Re: MovieClipの座標の比較について
ありがとございまーす
なんとなくわかってきました。

MovieClipの_xに値を指定。

MovieClipの_xのsetterメソッドでは
指定した値そのものではなく
内部の精度による計算結果を格納。

ただしそれは、指定した値と、
まるめ誤差程度しか違わない値。

なので
Math.pow(10, -15)
程度の誤差なら
イコールと判断してOK。

これでいいのかなぁ( ´ω`) ?
野中文雄
Åê¹ÆNo.25180
投稿日時: 2006-4-26 12:58
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: MovieClipの座標の比較について
MovieClip._xプロパティがgetter/setterプロパティである点は、そのとおりです。
引用:
yonhonさんは書きました:
MovieClipの_xのsetterメソッドでは
指定した値そのものではなく
内部の精度による計算結果を格納。

XY座標の最小単位」は、森さんのいわれるように1/20ピクセルです。
引用:
森 なおきさんは書きました:
これは内部の精度が1ピクセルの1/20になっていることに起因していると思われます。

引用:
ただしそれは、指定した値と、
まるめ誤差程度しか違わない値。

Flashの浮動小数値の処理一般については、そのとおりです。

けれども、MovieClip._x/MovieClip._yは上述のとおり1/20刻みの値ですし、同じ座標でもMovieClip._xmouse/MovieClip._ymouseは整数値で扱われます。また、MovieClip._alphaプロパティは、内部的に1/256(256階調)を単位としています。

したがって、扱うプロパティごとに、確認は必要です。
引用:
なので
Math.pow(10, -15)
程度の誤差なら
イコールと判断してOK。


----------------
 

yonhon
Åê¹ÆNo.25188
投稿日時: 2006-4-26 16:03
新米
居住地:
投稿: 17
使用環境:
WinXP,Flash8Pro,FCS1.5(Linux)
Re: MovieClipの座標の比較について
おかげさまで完全に理解できました。
詳しい説明ありがとうございます
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops