bool CheckOnline(int x1,int y1,int x2,int y2,int MouseX,int MouseY){
int range = 10; //許容範囲
double a;
double b;
if(x2 == x1){
if( abs( MouseX -x1)<range ){
if( abs(MouseY -abs(y2-y1)) <range)
return true;
}
}else{
a=(y2-y1)/(x2-x1);
b= y1 - a*x1;
if( abs(MouseY - (a * MouseX +b)) <range ){
if( abs(MouseX - ((MouseY-b)/a)) <range )
return true;
}
}
return false;
}
ぴったりでなく少し誤差があっても線上と判定したいです。
上記の方法ではうまく行きませんでした。
一応、y=ax+bのaとbを求めて、マウスのxとマウスのyを代入
その結果がrange以内かどうかでやってみようとした結果です。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
>この環境ではアルゴリズムは変化するのでしょうか?
Nodeとマウスの位置座標とも同じ座標系ならアルゴリズムに変わりはありません。
Edge_eraseでNodeを書き換えていると思いますが、
とりあえずのデバッグ方法としては、Edge_eraseをコメント行にして、代わりに、
i, j, num, Node[i].x, Node[i].y, Node[num].x, Node[num].y, x, y
などを画面かファイルに出力して数値を確認してみてはいかがですか?
もしそれに異常がなければEdge_eraseのロジックに問題があるかもしれません。
No.3
- 回答日時:
>a=(y2-y1)/(x2-x1);
>この部分が常に0.0000000になっています。
int同士の演算はintになります。
doubleにしたかったらキャストする必要があります。
a = (double)(y2 - y1) / (x2 - x1);
ちなみに、書かれている方法では、線分が垂直に近い場合(x1とx2の差が0に近い場合)、
マウスの位置と線分の近くにあったとしても、MouseY と a*MouseX+b の差は大きくなる可能性があります。
abs(MouseY - (a * MouseX +b)) <range
と
abs(MouseX - ((MouseY-b)/a)) <range
の両方をtrue判定するのではなく、どちらか片方がtrueであればOKとすべきでしょう。
この回答への補足
回答ありがとうございます。
double型でキャストした所、true falseは返すようになりました。
しかし、線をクリックした際に意図していない点を返してきます。
クリックした線を消去するために作っています。
その為以下のような関数で呼び出されています。
引数はマウスの座標です。
Nodeは構造体で自分の位置座標と、どこにつながっているか(edges_to)を格納しています。
bool DeliteLine(int x,int y){
int i,j;
int num;
for(i=0;i<Node.size();i++){
for(j=0;j<Node[i].edges_to.size();j++){
num=Node[i].edges_to.at(j);
if( CheckOnline(Node[i].x,Node[i].y,Node[num].x,Node[num].y,x,y)){
Edge_erase(i,j);
return true;
}
}
}
return false;
}
あと一点気になったのですが、私の環境は画面左上を(0,0)として
下に行くとyは増加し右に行くとxが増加します。
この環境ではアルゴリズムは変化するのでしょうか?
何度も質問して申し訳ないのですが、どうしてもわからないいので
お力添えお願いします。
No.1
- 回答日時:
間違いは2点ほど。
(1) x2=x1の場合
if( abs( MouseX -x1)<range ) は問題ないですが、
if( abs(MouseY -abs(y2-y1)) <range) は違います。
正しくは、
y1<y2のとき、
y1-MouseY<range かつ MouseY-y2<range である必要があります。
(y2<y1のときは、y1とy2を逆にして比較)
(2) x2≠x1の場合
考え方は合ってますが、その方法だと2点を通る直線上にあるかどうかの判定です。
線分上にあるかどうかなら、さらにMouseXまたはMouseYの範囲チェックが必要です。
この回答への補足
bool CheckOnline(int x1,int y1,int x2,int y2,int MouseX,int MouseY){
int range = 10; //許容範囲
double a;
double b;
if(x2 == x1){
if( abs( MouseX -x1)<range ){
if(y1<y2){
if(y1-MouseY<range && MouseY-y2 <range)
return true;
}else if(y2<y1){
if(y2-MouseY<range && MouseY-y1 <range)
return true;
}
}
}else{
a=(y2-y1)/(x2-x1);
b= y1 - a*x1;
if( abs(MouseY - (a * MouseX +b)) <range ){
if( abs(MouseX - ((MouseY-b)/a)) <range ){
if(x1<x2){
if(y1<y2){
if(MouseX>x1 && MouseX<x2 && MouseY>y1 && MouseY<y2)
return true;
}else if(y1>y2){
if(MouseX>x1 && MouseX<x2 && MouseY<y1 && MouseY>y2)
return true;
}
}else{
if(y1<y2){
if(MouseX<x1 && MouseX>x2 && MouseY>y1 && MouseY<y2)
return true;
}else if(y1>y2){
if(MouseX<x1 && MouseX>x2 && MouseY<y1 && MouseY>y2)
return true;
}
}
}
}
}
return false;
}
出来る限り直してみました。
しかし、チェックが未だに成功していません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- その他(プログラミング・Web制作) Pythonにおける物理のシミュレーションでの単位変換について 2 2023/06/02 17:11
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- その他(プログラミング・Web制作) Pythonでのかんたんな物理シミュレーションについての書籍 5 2023/06/02 07:37
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2の補数を計算するプログラム
-
intとlongは同じ?
-
再起呼び出しの回数をカウント...
-
C言語で%を使わない余りの出し方
-
迷路を脱出する経路探索プログ...
-
画像の拡大・縮小
-
分数の足し算をさせるプログラ...
-
C言語で簡単なパックマンゲーム...
-
C++で表を作成したいのです ...
-
条件が多い場合
-
複数の共有メモリの作成
-
ヒストグラム均等化処理プログラム
-
3のつく数と3の倍数を表示 C言語
-
argvのNULLチェック
-
乱数で交互に偶数、奇数が、、、。
-
プログラミングに関して
-
OpenCVによる4値化について
-
再帰処理をループ処理に変換
-
16bitで乱数を生成する方法
-
C++ Debug Errorについて教えて
おすすめ情報