if文で判定結果が真なのにコードが実行されない – プログラミング – Home

if文で判定結果が真なのにコードが実行...
 
通知
すべてクリア

[解決済] if文で判定結果が真なのにコードが実行されない

固定ページ 1 / 2

ラジアン
 ラジアン
(@ラジアン)
ゲスト
結合: 22年前
投稿: 23
Topic starter  

現在、特定の点が線分上にあるか判定する関数を作っています。
それに以下のコードを使用しています。
しかし、最初のif文ではメッセージボックスが表示されません。
どうしてなのでしょうか?
開発環境 Win2000 VC++6.0 Pro APIのみ

このとき、Xは確実に0ではなく、cは線分の中点です。
当然ですが、ansと最初のif文での演算結果は同じです

float X = pVertex[1].x - pVertex[0].x,
A = (pVertex[1].y - pVertex[0].y) / X,
ans = ( (A * c.x) + ( pVertex[0].y - ( A * pVertex[0].x ) ) );

//メッセージボックスが表示されない
if(c.y == ( (A * c.x) + ( pVertex[0].y - ( A * pVertex[0].x ) ) ) )
MessageBox(NULL,線分上,",MB_OK);

//メッセージボックスは表示される
if(c.y == ans)
MessageBox(NULL,線分上,",MB_OK);


引用未解決
トピックタグ
Tonny
 Tonny
(@Tonny)
ゲスト
結合: 22年前
投稿: 32
 

思いっきりはずしていたらすみません。型がdoubleだったりしていませんか。


返信引用
ラジアン
 ラジアン
(@ラジアン)
ゲスト
結合: 22年前
投稿: 23
Topic starter  

floatのはずです。
線分の始点と終点はDirectXのD3DXVECTOR2構造体なので


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

デバッガーでステップ実行して、ウォッチで確認してみてください。


返信引用
Tonny
 Tonny
(@Tonny)
ゲスト
結合: 22年前
投稿: 32
 

if(c.y == (float) ( (A * c.x) + ( pVertex[0].y - ( A * pVertex[0].x ) ) ) )
MessageBox(NULL,線分上,",MB_OK);
ではいかがですか。


返信引用
ラジアン
 ラジアン
(@ラジアン)
ゲスト
結合: 22年前
投稿: 23
Topic starter  

Tonnyさんの通りにしてみましたが駄目でした。
アイススケーターさん、何を確認するんでしょうか?


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

>アイススケーターさん、何を確認するんでしょうか?
こんな質問が返ってくるとは思いませんでしたが

if文の右辺と左辺が同じかどうかです。

右辺は1個の変数に置き換えて確認したほうがデバッグしやすいですよ。

多分答えだと思いますが、誤差を考慮していないからではないかと思います。

例えば、実数で3と8の中心は5.5ですが整数で計算すると5になってしまう。
floatでも当然、誤差は発生します。

まずはデータを確認されては


返信引用
Tonny
 Tonny
(@Tonny)
ゲスト
結合: 22年前
投稿: 32
 

>Tonnyさんの通りにしてみましたが駄目でした。
大変失礼しました。
勿論c.yやansがintなんて事もないですよね。
お力になれないのにお手間取らせてしまい申し訳ありませんでした。


返信引用
ラジアン
 ラジアン
(@ラジアン)
ゲスト
結合: 22年前
投稿: 23
Topic starter  

しかし、デバッガで値を調べても等しいです。
c.y == ( (A * c.x) + ( pVertex[0].y - ( A * pVertex[0].x ) ) )
をデバッガで調べると1になっています。
c.y == ans
も同様です。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

>MessageBox(NULL,線分上,",MB_OK);
これは確実に表示するのを確認しました。
そうすると、どうしてもif文が成立していないとしかおもえないのですが。

ステップでMessageBox(NULL,線分上,",MB_OK);まで行ってますか。


返信引用
ラジアン
 ラジアン
(@ラジアン)
ゲスト
結合: 22年前
投稿: 23
Topic starter  

ちゃんとやっているんですけど
最初のif文はMessageBox(NULL,線分上,",MB_OK);を飛びこえてしまいます。
次のif文ではちゃんと表示されるんですけどね


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

飛び越すということは、左辺と右辺が違うということでしょう。
不思議ですね

ソースがあれば解析してみますが、必要な部分だけ提示されてはいかが

但し、今日は帰ります おやすみなさい。


返信引用
ラジアン
 ラジアン
(@ラジアン)
ゲスト
結合: 22年前
投稿: 23
Topic starter  

最初とあんまり変わりませんが一応ソースを載せておきます。
pVertexはWM_LBUTTONDOWNで得たマウス座標そのままです。

c = pVertex[0] + pVertex[1];
c /= 2.0f;

//ここでXは確実に0ではない
float X = pVertex[1].x - pVertex[0].x,
A = (pVertex[1].y - pVertex[0].y) / X,
ans = ( (A * c.x) + ( pVertex[0].y - ( A * pVertex[0].x ) ) );

//メッセージボックスが表示されないが、デバッガでの判定は1になっている
if(c.y == ( (A * c.x) + ( pVertex[0].y - ( A * pVertex[0].x ) ) ) )
MessageBox(NULL,交差しました,",MB_OK);

//メッセージボックスが表示される
if(c.y == ans)
MessageBox(NULL,交差しました,",MB_OK);


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

==の代わりに差の絶対値がDBL_EPSILONかDBL_MINより小さいかどうか、という判定方法に
するとか。


返信引用
ラジアン
 ラジアン
(@ラジアン)
ゲスト
結合: 22年前
投稿: 23
Topic starter  

if(DBL_EPSILON <
(c.y - ( (A * c.x) + ( pVertex[0].y - ( A * pVertex[0].x ) ) ) ) )
MessageBox(NULL,交差しました,",MB_OK);
ということでしょうか?
確かにこれならうまくいきました。
これってやっぱり誤差が原因ってことでしょうか


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました