HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0306
ポテロングマウスをドラッグして線を引いてその中にキャラがあるかどうか8解決


ポテロング

リンク

2012/3/6(Tue) 20:26:26|NO.45251

配列変数で複数の座標が
マウスで線を引いた中にあるかどうか調べたいですが
全然わからないです

マウスで囲ったのだけ動かしたくて
それ以外のはほっとくというプログラムなんですが
どなたかわかる方教えてくださいお願いします



この記事に返信する


HK2

リンク

2012/3/6(Tue) 21:08:48|NO.45255

数学の話になりますが、
二点を通る直線の方程式や
点と直線の距離の公式
をご存じであれば、それらを組み合わせてできると思います。
この方法はとてもまどろっこしくなりそうなので、実際は使えないでしょう。


私が考える方法は、
線の始点と終点のx座標とy座標の差の比と、線の始点とある点のx座標とy座標の比を求めて、
その誤差がある一定値以下であればその線上、もしくはその延長線上にあると判定する。
という感じです。

なお、延長線上か線分上にあるかは、マウスで引いた線の始点と終点で四角形を作り、
その四角形の中に入っていれば線分上、入っていなければ延長線上にあることになると思います。

この方法の問題点は、始点に近い点では厳しい判定になるが、
終点に近い側では始点付近より甘い判定に。
両方から調べるにしても、今度は中心付近が比較的厳しい判定になることです。



Taddi

リンク

2012/3/6(Tue) 21:37:34|NO.45257

単純な矩形の場合なら、
一般的なシューティングの当たり判定を活用すればできると思います。


title "マウスをクリックして範囲を指定すると、範囲内にある□が赤色になります。" ;仮データ設定 ランダムに画面内に□を配置 dim px,10 : dim py,10 repeat 10 px(cnt)=rnd(63)*10 : py(cnt)=rnd(47)*10 loop ;クリックフラグ 0=未選択 1=左上を設定(範囲を表示) flg=0 onclick gosub *click *main ;データが範囲にあるかをチェックするフラグ dim check,10 redraw 0 color 0,0,0 : boxf if flg=1{ ;範囲を表示 color 255,255,0 : boxf ft(0),ft(1),mousex,mousey ;範囲内にあるか判定(□の大きさは考慮していません) repeat 10 if (ft(0)<px(cnt))&(px(cnt)<mousex)&(ft(1)<py(cnt))&(py(cnt)<mousey){check(cnt)=1} loop } repeat 10 if check(cnt)=0{color 255,255,255}else{color 255,0,0} pos px(cnt),py(cnt) mes "□" loop redraw 1 await 16 goto *main *click ;未選択時にクリックするとftにマウス座標を代入 if flg=0{ dim ft,2 : ft=mousex,mousey : flg=1 }else{ flg=0 } return



ポテロング

リンク

2012/3/6(Tue) 22:19:20|NO.45260

やはりむずかしいですね・・
Taddiのやり方でもいいのですが
なんていうかペン(マウス)で自由に輪を書いてその中にキャラがあるかどうか
ていうことがやりたかったです

コメントありがとうございました



HK2

リンク

2012/3/6(Tue) 22:34:18|NO.45261

マウスで書いた円のx座標、y座標のそれぞれの最大値と最小値から、
円の中点を決め、マウスで描いた円と中点の距離の平均を半径として計算するのはどうでしょうか。



KA

リンク

2012/3/6(Tue) 22:46:36|NO.45262

>>なんていうかペン(マウス)で自由に輪を書いて

力技です、四角でも円でも閉じた多角形と見なせます。
画面上で閉じられた範囲の座標を求めて、その中にあるか判定します。

いわゆる、お絵かきソフトのマスク範囲ですね。



たんす

リンク

2012/3/6(Tue) 23:04:45|NO.45264

Taddiさんのスクリプトを一部利用させてもらい作ってみました。

;仮データ設定 ランダムに画面内に□を配置 dim px,10 : dim py,10 repeat 10 px(cnt)=rnd(63)*10 : py(cnt)=rnd(47)*10 loop ;画面初期化 color 0,0,0 boxf dim check,10 gosub *PutSquare dim stick_value ;マウスボタン入力状態 dim mouse_value ;左クリックされたかどうか *DrawLine ;線を引く wait 10 stick stick_value,256 if stick_value&256{ if mouse_value=0{ posX1=mousex :posY1=mousey pos mousex,mousey mouse_value=1 }else{ color 0,255,255 line mousex,mousey } }else{ if mouse_value{ ;左ボタンが離されたら、始点とつなげて閉曲線にする。 line posX1,posY1 goto *CheckSquare } } redraw 1 redraw 0 goto *DrawLine stop ; *CheckSquare redraw 1 repeat 10 outer=0 pget_y=py(cnt) repeat px(cnt) ;縦方向に1ドットずつ調べて、閉曲線を越えた回数が奇数なら内側、偶数なら外側とする。 pget cnt,pget_y if (ginfo_r = 0) and (ginfo_g = 255) and (ginfo_b = 255){ ;閉曲線の色で調べます outer=1-outer } loop if outer=1{check(cnt)=1} loop gosub *PutSquare redraw 1 stop *PutSquare ;□の描写 repeat 10 if check(cnt)=0{color 255,255,255}else{color 255,0,0} pos px(cnt),py(cnt) mes "□" loop return
正確さは保証できません。



ポテロング

リンク

2012/3/6(Tue) 23:07:06|NO.45265

KAさんの言うとおりのことがやりたいんですが
やりかたがわかりません(説明下手ですいません)



ポテロング

リンク

2012/3/6(Tue) 23:20:19|NO.45266

できました!
みなさん色々ありがとうございました

たんすさんのソースをいじって勉強します



ONION software Copyright 1997-2023(c) All rights reserved.