2011年05月05日のツイート

領域判定の注意点

http://bal4u.dip.jp/mt/program/2004/12/post-13.htmlについて。

// ある直線に対し、任意の点がどちら側にあるかを判別する式(の一部)
int dist( int x1, int y1, int x2, int y2, int xa, int ya ) {
	return (x2-x1)*(ya-y1)+(y2-y1)*(x1-xa);
}

こういう関数を作って、得られた結果を乗算して判定してみたが、どうにも結果がおかしい。
具体的には、ある程度の幅を持った縞模様の形に判定が入れ替わる。
さらに詳細に数値を調べていくと、どうやら、乗算の結果がint型で扱える範囲を超えてしまい、符号の反転が起こっていたようだ。(それで縞模様に)。
なので、こういうのをさらに作る。

// 絶対値を1にした同じ符号の数値を返す。
int sign( int num ) {
	if ( num == 0 ) return 0;
	return num > 0 ? 1 : -1;
}

C言語とかC++で、signとかsgnは実装されてない、よね?
これで、数値を小さくしてから、sa*sbで判定するとうまくいった。

領域判定の注意点

http://bal4u.dip.jp/mt/program/2004/12/post-13.htmlについて。

// ある直線に対し、任意の点がどちら側にあるかを判別する式(の一部)
int dist( int x1, int y1, int x2, int y2, int xa, int ya ) {
	return (x2-x1)*(ya-y1)+(y2-y1)*(x1-xa);
}

こういう関数を作って、得られた結果を乗算して判定してみたが、どうにも結果がおかしい。
具体的には、ある程度の幅を持った縞模様の形に判定が入れ替わる。
さらに詳細に数値を調べていくと、どうやら、乗算の結果がint型で扱える範囲を超えてしまい、符号の反転が起こっていたようだ。(それで縞模様に)。
なので、こういうのをさらに作る。

// 絶対値を1にした同じ符号の数値を返す。
int sign( int num ) {
	if ( num == 0 ) return 0;
	return num > 0 ? 1 : -1;
}

C言語とかC++で、signとかsgnは実装されてない、よね?
これで、数値を小さくしてから、sa*sbで判定するとうまくいった。

2011年05月05日のツイート

領域判定の注意点

http://bal4u.dip.jp/mt/program/2004/12/post-13.htmlについて。

// ある直線に対し、任意の点がどちら側にあるかを判別する式(の一部)
int dist( int x1, int y1, int x2, int y2, int xa, int ya ) {
	return (x2-x1)*(ya-y1)+(y2-y1)*(x1-xa);
}

こういう関数を作って、得られた結果を乗算して判定してみたが、どうにも結果がおかしい。
具体的には、ある程度の幅を持った縞模様の形に判定が入れ替わる。
さらに詳細に数値を調べていくと、どうやら、乗算の結果がint型で扱える範囲を超えてしまい、符号の反転が起こっていたようだ。(それで縞模様に)。
なので、こういうのをさらに作る。

// 絶対値を1にした同じ符号の数値を返す。
int sign( int num ) {
	if ( num == 0 ) return 0;
	return num > 0 ? 1 : -1;
}

C言語とかC++で、signとかsgnは実装されてない、よね?
これで、数値を小さくしてから、sa*sbで判定するとうまくいった。

2011年05月05日のツイート