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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0520
あsdf回転した正方形の当たり判定6解決


あsdf

リンク

2007/5/20(Sun) 19:59:59|NO.8397

マウスなどのカーソルを移動させて回転させた四角形に触れた時に
判定をさせたいのですがどのような方法があるでしょうか?
よろしくお願いします。



この記事に返信する


たこ

リンク

2007/5/20(Sun) 20:32:28|NO.8398

色を使って当たっているかどうかの判定ができます。


buffer 1 color ,,255:boxf 0,0,250,250 screen 0,500,500 repeat redraw 0 color 255,255,2555:boxf r=3.14*cnt/200 pos 250,250:grotate 1,0,0,r,250,250 pget mousex,mousey if ginfo_r=0&ginfo_g=0&ginfo_b=255{ title "四角形に触れています }else:title "" redraw 1 await 10 loop



Shinya

リンク

2007/5/20(Sun) 21:11:59|NO.8400

【色を使わない場合】
自分でプログラム組んでないから出来るか分かりませんが、次のようにしてみたら出来ると思います。

1.四角形の重心座標と、マウス座標を通る直線を考える
2.直線と四角形の周との交点で、重心からの距離が一番短いもの(四角形の場合関係ない)を Pg とする
3.重心からマウス座標までの距離を Pm とする
4.Pm ≦ Pg の時マウスは四角形に触れている

こうすれば、四角形内部すべてに当たり判断をする必要はなくなります。



あsdf

リンク

2007/5/20(Sun) 21:29:12|NO.8401

ありがとうございます。試してみます。



あsdf

リンク

2007/5/21(Mon) 03:02:19|NO.8403

色の方は試したみて上手く行きました。
しかし重心座標を〜の方がいまいちよく解りませんでした。
申し訳ないですが解りやすく説明お願いします。



f

リンク

2007/5/21(Mon) 08:36:40|NO.8405

四角形の4つの頂点に座標があるとしての話・・・

マウス座標(x,y)
直線座標 (x1,y1)-(x2,y2)
とした時

A = ((x2 - x1) * (y - y1)) - ((x - x1) * (y2 - y1))

の計算をした時、Aが+になるか−になるかで、
マウス位置が直線の左右どちらにあるか判断できる。
((x1,y1)を基点とし、(x2,y2)を見た方向に対しての左右)

+が右側で−が左側、0が直線上だったと思う。
(確認してないので、自分で確認してちょうだい)


この式を利用して、
「四角形の4辺全部に対しマウス座標が右側にある->マウス位置が四角形の内側にある」
等、この様な感じで、判定できると思うが、どうか。



pizza

リンク

2007/5/21(Mon) 20:04:46|NO.8413

マウス座標を逆回転させても判定できると思います。


bx = 200 : by = 200 bcx = bx / 2 bcy = by / 2 buffer 1, bx, by color 255 : boxf : color , 255 mes "左上" gsel 0 cx = ginfo_winx / 2 cy = ginfo_winy / 2 *main repeat 360 wait 10 r = 3.14 * cnt / 180 redraw 0 color 0, 255, 255 : boxf // 回転前 color 255, 255 boxf cx-bcx, cy-bcy, cx+bcx-1, cy+bcy-1 // 回転後 gmode 3, bx, by, 200 pos cx, cy grotate 1, 0, 0, r, bx, by // マウス座標を回転前の位置に mx = mousex - cx my = mousey - cy x = cos(-r)*mx - sin(-r)*my y = sin(-r)*mx + cos(-r)*my // 点を打つ(逆回転させたマウス座標) color boxf x+cx-1, y+cy-1, x+cx+1, y+cy+1 x += bcx y += bcy // 内側にあるか(回転してない時と同じ) if (x >= 0) & (x < bx) & (y >= 0) & (y < by) : flag = 1 : else : flag = 0 if flag : title "内側" : else : title "外側" redraw 1 loop goto *main



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