mieki256's diary



2021/06/20() [n年前の日記]

#2 [love2d] 点が三角形の内外にあるか判定したい

love2d を使って、点が三角形の内外にあるか判定したい。

以下のページが参考になった。

_点が三角形の内側か判定したい - Thoth Children
_点と三角形の当たり判定( 内外判定 )

ベクトルの外積を使って判定できる。

以下のような感じになった。

_main.lua
function love.load()
  polys = {
    {200, 30, 300, 30, 250, 200},
    {400, 100, 600, 60, 500, 200},
    {120, 300, 300, 250, 500, 400},
    {60, 20, 180, 180, 20, 100},
  }
  
  hits = {}
  for i=1, #polys do
    hits[i] = false
  end

  mx, my = 0, 0
end

function getCrossVec2D(vx1, vy1, vx2, vy2)
  return (vx1 * vy2 - vx2 * vy1)
end

function checkHitTri(pos, xa, ya)
  local b1, b2, b3
  local x1, y1, x2, y2, x3
  x1, y1 = pos[1], pos[2]
  x2, y2 = pos[3], pos[4]
  x3, y3 = pos[5], pos[6]
  b1 = (getCrossVec2D(x2 - x1, y2 - y1, xa - x1, ya - y1) < 0)
  b2 = (getCrossVec2D(x3 - x2, y3 - y2, xa - x2, ya - y2) < 0)
  b3 = (getCrossVec2D(x1 - x3, y1 - y3, xa - x3, ya - y3) < 0)
  return ((b1 == b2) and (b2 == b3))
end

function love.update(dt)
  mx, my = love.mouse.getPosition()
  
  for i = 1, #polys do
    hits[i] = checkHitTri(polys[i], mx, my)
  end
end

function love.draw()
  -- clear canvas
  love.graphics.clear(0, 0, 0, 1)

  -- draw polygon
  for i = 1, #polys do
    if hits[i] then
      love.graphics.setColor(1, 0, 0, 1)
    else
      love.graphics.setColor(0, 1, 0, 1)
    end
    love.graphics.polygon("fill", polys[i])
  end

  -- draw text
  love.graphics.setColor(1, 1, 1, 1)
  love.graphics.print("ESC to exit.", 8, 8)
  love.graphics.print("mx, my = " .. mx .. "," .. my, 8, 24)
end

function love.keypressed(key, scancode, isrepeat)
  if key == "escape" then
    love.event.quit()
  end
end

_conf.lua
function love.conf(t)
  t.window.width = 640
  t.window.height = 480
  t.window.title = "Collision Triangle"
  t.window.fullscreen = false
  -- t.window.fullscreentype = "exclusive"
end

判定処理は、checkHitTri(頂点が入った配列, 点のx座標, 点のy座標) で行ってる。点が中に入ってたら true が、外なら false が返る。

triangle_collision というディレクトリを作成して、main.lua と conf.lua を入れて、love triangle_collision で実行。以下のような感じで動いた。

triangle_collision_ss.gif

以上です。

過去ログ表示

Prev - 2021/06 - Next
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project