現在、特定の点が線分上にあるか判定する関数を作っています。
それに以下のコードを使用しています。
しかし、最初の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);
思いっきりはずしていたらすみません。型がdoubleだったりしていませんか。
floatのはずです。
線分の始点と終点はDirectXのD3DXVECTOR2構造体なので
デバッガーでステップ実行して、ウォッチで確認してみてください。
if(c.y == (float) ( (A * c.x) + ( pVertex[0].y - ( A * pVertex[0].x ) ) ) )
MessageBox(NULL,線分上,",MB_OK);
ではいかがですか。
Tonnyさんの通りにしてみましたが駄目でした。
アイススケーターさん、何を確認するんでしょうか?
>アイススケーターさん、何を確認するんでしょうか?
こんな質問が返ってくるとは思いませんでしたが
if文の右辺と左辺が同じかどうかです。
右辺は1個の変数に置き換えて確認したほうがデバッグしやすいですよ。
多分答えだと思いますが、誤差を考慮していないからではないかと思います。
例えば、実数で3と8の中心は5.5ですが整数で計算すると5になってしまう。
floatでも当然、誤差は発生します。
まずはデータを確認されては
>Tonnyさんの通りにしてみましたが駄目でした。
大変失礼しました。
勿論c.yやansがintなんて事もないですよね。
お力になれないのにお手間取らせてしまい申し訳ありませんでした。
しかし、デバッガで値を調べても等しいです。
c.y == ( (A * c.x) + ( pVertex[0].y - ( A * pVertex[0].x ) ) )
をデバッガで調べると1になっています。
c.y == ans
も同様です。
>MessageBox(NULL,線分上,",MB_OK);
これは確実に表示するのを確認しました。
そうすると、どうしてもif文が成立していないとしかおもえないのですが。
ステップでMessageBox(NULL,線分上,",MB_OK);まで行ってますか。
ちゃんとやっているんですけど
最初のif文はMessageBox(NULL,線分上,",MB_OK);を飛びこえてしまいます。
次のif文ではちゃんと表示されるんですけどね
飛び越すということは、左辺と右辺が違うということでしょう。
不思議ですね
ソースがあれば解析してみますが、必要な部分だけ提示されてはいかが
但し、今日は帰ります おやすみなさい。
最初とあんまり変わりませんが一応ソースを載せておきます。
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);
==の代わりに差の絶対値がDBL_EPSILONかDBL_MINより小さいかどうか、という判定方法に
するとか。
if(DBL_EPSILON <
(c.y - ( (A * c.x) + ( pVertex[0].y - ( A * pVertex[0].x ) ) ) ) )
MessageBox(NULL,交差しました,",MB_OK);
ということでしょうか?
確かにこれならうまくいきました。
これってやっぱり誤差が原因ってことでしょうか