コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
まるだい ◆AdwyE6qhnxpV
2019/1/19 16:13
質問
範囲外かどうかを求めたい
あるゲーム内で三角形を描画(GTRI)するのですが、
その三角形に任意の座標(CX,CY)が含まれるかどうかを判定したいです。
いちいち描画せずにしたいです。
できればDEF 関数名(X1,Y1,X2,Y2,X3,Y3)で、結果がTrueかFalseで返るものがいいです
語彙力がなくてすみません

コメント

アバター
まるだい 2019/1/19 16:22 ◆AdwyE6qhnxpV
こんな感じ
アバター
Soybeanman 2019/1/19 16:40 ◆SDLkyXUP6WqK
こんな感じの方法がいいのではないでしょうか…?
アバター
まるだい 2019/1/19 16:47 ◆AdwyE6qhnxpV
検討してみます
アバター
こういち 2019/1/19 17:20 ◆ou0jbJnEJ0Kb
DEF DET(X1,Y1,X2,Y2)
 RETURN X1*Y2-Y1*X2
END
DEF TRIHITPOINT(X1,Y1,X2,Y2,X3,Y3,CX,CY
)
 VAR DOT1=DET(X2-X1,Y2-Y1,CX-X1,CY-Y1 )
 VAR DOT2=DET(X3-X2,Y3-Y2,CX-X2,CY-Y2)
 VAR DOT3=DET(X1-X3,Y1-Y3,CX-X3,CY-Y3)
 RETURN SGN(DOT1)==SGN(DOT2)&&SGN(DOT2)==SGN(DOT3)
END
かな?
アバター
まるだい 2019/1/19 18:11 ◆AdwyE6qhnxpV
こういちさんの方法で試したところ、うまくいきました!
ヒットする範囲を実際のGTRIに描画してみたところ、
プチコンの範囲のほうが若干大きかったです

いままで、GLINEでGTRIの座標をつなぐと少しずれが出ることがありましたが
そのずれを考慮すると、GRTIは不正確?ということがわかりました

ありがとうございます!

どういう仕組みなのか教えていただけませんか?
アバター
こういち 2019/1/19 20:43 ◆ou0jbJnEJ0Kb
DET()は2次元外積を求める関数です。
行列式とも言う。
(X1,Y1)と(X2,Y2)が時計回りの順なら値がプラスになり、反時計回りなら値がマイナスになります。

そして、TRIHITPOINT()で三角形と点の当たり判定をとってます。
頂点1からみた、頂点2と点の外積、2からみた3と点の外積、3から見た1と点の外積を調べ、全ての符号が同じ(==全て時計回りか、全て反時計回り)ならTRUEを返します。

ちょっと範囲が小さいのは多分辺の上をFALSEにしてるから。辺の上に点があるとDET()の値は0になるので…
アバター
おちゃめ 2019/1/20 0:05 ◆jH1opV6FnGyx
私のサイトのプチコン講座でも書いていますが、外積を計算することで線分に対して点がどっち側にあるかが分かります。

  画像が小さすぎて見えない場合はこちらからどうぞ
   http://ochameclub.web.fc2.com/petitcom/lecture.htm

講座では線分や多角形と円との当たり判定を書いていますが、点との判定であれば大きさは考慮が不要なので外積だけで簡単に求められるのです。
この方法を使えば三角形に限らず、多角形との当たり判定も簡単で、すべて符号が一致すればその多角形の中に点が含まれるのです。
外積を計算して0になれば多角形の辺上に点があるのでそれも考慮するならば例外処理が必要になりますが。

あと、GTRIとGLINEで囲んだ三角形に違いがあるのは単にアルゴリズムが異なるためだと思います。
画面というのは有限のピクセルで表現されていますのでアルゴリズムの違いで1ドットの差は必ず出てきます。
アバター
まるだい 2019/1/20 9:31 ◆AdwyE6qhnxpV
わかったような
わかってないような
ありがとうございます

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -