- ベストアンサー
クリックした点がその線上にあるかの計算
こんにちは。UNKOです。 PictureBox内に線を引き、その線上をクリックしたかを調べたいのですが、なかなか上手く行きません。 一応、作ったのですが、 dblA = (dblY2 - dblY1) / (dblX2 - dblX1) dblB = dblY2 - (dblA * dblX2) dblAnsY = (dblA * X) + dblB if dblAnsY = Y then … 始点(dblX1,dblY1)~終点(dblX2,dblY2) クリックした座標(MouseDownイベント時)が(X,Y)です。結果のdblAnsYの値が極端に狂ったりします(合っていたり、+30位狂ったり) 初歩的な質問で申し訳ありませんが、どなたかアドバイス宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
代数学は現役からしばらく離れていて、よく覚えてないのですが、、、 始点(X1,Y1) 終点(X2.Y2) クリック点(X3,Y3) と仮定する 線ベクトル(X2-X1,Y2-Y1) クリック点のベクトル(X3-X1,Y3-Y1) (Y2-Y1)/(X2-X1)=Tanθ (Y3-Y1)/(X3-X1)=Tanθ ∴(Y2-Y1)/(X2-X1) = (Y3-Y1)/(X3-X1) ↑この条件を満たしたら、線上? ただし、延長上を含むので、それらを考慮する必要ありかも?
その他の回答 (2)
- bikkuri
- ベストアンサー率33% (23/68)
+30ほど狂うのを気にされていますが、PictureBoxのScaleModeは なにになっていますか? デフォルトのTwipsだと、環境にもよりますが、1ドット=15Twipsになってたりします。 この場合、2ドットずれていても結果は30狂うことになります。 また、単位を何にするにしろ、ある程度の範囲を考慮しないとクリックする人がつかれますよ。
お礼
ご返答ありがとうございますm(__)m PictureBoxのScaleModeがTwipsになっていました。このプロパティの存在自体知りませんでした…(^^; これをピクセルに変更したところ、ほぼ解決できました。ただ全体の軸がY方向近くになると狂いが生じます。範囲を持たす事も考慮に入れていたのですが、角度によって範囲がバラバラになってしまうので、また別の方法で考えてみようと思います。いろいろと勉強になりました。有難うございました。
- liar_adan
- ベストアンサー率48% (730/1515)
すみません。VBの文法はよく知らないのですが、Cの方からの類推で考えてみました。 dblAとかdblBとかの型が整数型(Integer)ということはないでしょうか? 整数型でわり算をすると、たとえば11÷6だと答えが1になったりします。(Cの場合) ここで誤差が出るとそれ以降の計算がぐちゃぐちゃになってしまいます。 Double型とかだったら、誤差は少なくてすみます。 それでも、わり算の分母の方が非常に小さい場合は誤差が出る可能性があります。 また、Double型など浮動小数点型の場合、一般的に「=」での比較は よくありません。 浮動小数点型の性質上、二つの数値が完全に一致することは期待できません。 比較するときはいくらか幅を取って「このくらいの誤差なら一致するとみなそう」とします。 それに、たとえば(0 , 0)と(17, 19)の間で線を引くと、 間のどの点を取っても「その線上にある」とは見なされません。(dblAnsYが中途半端な値になるから) 計算されて出てくるdblAnsYの値から、0.5~1.0程度の誤差を許さないと 実用的でないと思います。
お礼
ねご返答ありがとうございますm(__)m 僕もintとdoubleの違いかなと思いまして、各変数をデバッグウィンドに表示させたのですが、小数点が一応くっついていたのでOKだったようです。この間違いは結構してしまいますね~(^^;一応、値にもある程度の範囲を持たせようと思っております。double型で範囲がなかったら、ユーザーの方は線を認識できなそうです…。おみくじみたいですね…(^^)また色々と考えてみようと思います。有難うございました。
補足
ご返答の前に'ね'が入ってました。すみません(^^;
お礼
ご返答ありがとうございますm(__)m この方法だと狂いが出なさそうで良いですね(^^)また、思ったのですが、(x1,y1)-(x3,y3)と(x1,y1)-(x2,y2)の傾きが=でも線上と判断できるのでしょうかね?なんだか色々と思い浮かんできましたよ~(^^)とても参考になりました。有難うございました。