トピック
つばさ☆ nsm2116

円の内側の判定

画像のような円の中をタッチしたら処理を行うにはどうすればいいですか? GCIRなんとか っていう命令で描画しました。160,120,50です。
4そうだね
プレイ済み
返信[1]
親投稿
つばさ☆ nsm2116
GCIRCLE 160,120,50でした。コメント数が0になった。
2そうだね
プレイ済み
返信[2]
親投稿
透明色でOK? ならちょっとせこい方法がある 円の中だけ透明度を中途半端な値にしておくとGSPOIT()で知れる。
8そうだね
プレイ済み
返信[3]
親投稿
イスターリャ arduinotexter
天郷さんの方法のほうが速い けど 数式だけでやるなら、ピタゴラスの定理を使って 長さ=SQR(POW(タッチX-中心点X,2)+POW(タッチY-中心点Y,2)) で求められる けど、非常に遅い 加減乗除の2~3倍くらいの時間がかかる
6そうだね
プレイ済み
返信[4]
親投稿
イスターリャ arduinotexter
あ、長さは中心点からの距離だった これをIFで長さ判定してやると円の中か判定できます
3そうだね
プレイ済み
返信[5]
親投稿
(長さの式なんか使おうと思った記憶がある、あの中3で習った三平方の定理の出番だったのね。)
4そうだね
プレイ済み
返信[6]
親投稿
あきと SideBurnsM
100回計算しても処理落ちしないでしょ。 重くないし正しい方法。 ちなみに円の半径を2乗して保存しておけばSQRはいらなくなる。 タッチ座標と円の中心の2点間の距離を求めて、円の半径より小さかったら内側。大きかったら外側ということです。
6そうだね
プレイ済み
返信[7]
親投稿
イスターリャ arduinotexter
ちなみに POW(変数,2) より 変数*変数 の方が軽い模様 T-PAINT Gではこの方法で若干の処理軽量化を施しているのである
5そうだね
プレイ済み
返信[8]
親投稿
イスターリャ arduinotexter
>>あきと さん 別に絶対的に重いと言っているわけではなく、ピタゴラスの定理以外の、加減乗除のみで構成された数式と比較して相対的に遅いと言っただけです
2そうだね
プレイ済み
返信[9]
親投稿
Hanzo rzsense
正確さを求めないなら、円の内部の点全てを判定せず、例えば、円に内接する正方形の内部かどうかを判定する、次のような判定式を使うことも考えられます。 IF TX>=(160-35)&& TX<=(160+35)&& TY>=(120-35)&& TY<=(120-35)THEN … TX,TYはタッチ座標、35とは、円の半径50のルート2分の1で、つまり円に内接する正方形の1辺の長さの半分です。
3そうだね
プレイ済み
返信[10]
親投稿
MIKI ifconfig
前提として sqrt は遅いってのがあって、 「なら先に計算しとこう」ってのがあきとさんの方法 これは今回みたいに半径が決まってる場合有効。 毎回半径が異なるような場合は、両辺を二乗して if 長さ^2 < 半径^2 then 内側 のようにして sqrt を回避するのが常道です。
3そうだね
プレイ済み
返信[11]
親投稿
ΖΕΧ ZEX256
XSCREEN 2:DISPLAY 1 CX=160:CY=120:R=50 GCIRCLE CX,CY,R REPEAT:WAIT TOUCH OUT TM,TX,TY IF TM<1 THEN CONTINUE LX=TX-CX:LY=TY-CY IF SQR(LX*LX+LY*LY)<=R THEN ?"処理" ELSE ? UNTIL 0
2そうだね
プレイ済み
返信[12]
親投稿
あきと SideBurnsM
加減乗除だけで書くとこうですね。 TOUCH OUT ST,TX,TY WX=TX-160 WY=TY-120 RR=50*50 IF RR<(WX*WX+WY*WY) THEN ? "内側" ELSE ? "外側" ENDIF
2そうだね
プレイ済み
返信[13]
親投稿
つばさ☆ nsm2116
昨日は共感しつつ返信できずすみせん… おぉ!できた。色々な方法で試してみた! ついでにSQRとかの命令やPOW(変数,2)より変数*変数の方が速いなど知らない情報がたくさん!! ありがとうございました!!!!
1そうだね
プレイ済み