Deo zbornika Teorija razvoja igara

Otkrivanje sudara krugom

kolizija-kruznica

Otkrivanje sudara krugom (ili sferom u 3D) se vrši tako što se centar kruga postavi u centar predmeta, pa se meri rastojanje poluprečnikom. Ova metoda je neprecizna i ne odgovara za sve predmete.

Bitna prednost krugova je što jednako dobro rade i sa rotiranim predmetima.

Primer

Provera seku li se dva kruga je jednostavna: proverimo je li zbir dva poluprečnika veći od udaljenosti dva centra.

Razdaljina dve koordinate se računa pomoću Pitagorine teoreme (d = Math.sqrt(a**2 + b**2)). Važna optimizacija koju možemo uraditi je uklanjanje korenovanja:

const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')

class Circle {
  constructor(position, radius = 30, color = 'black') {
    this.position = position
    this.radius = radius
    this.color = color
  }
  draw() {
    ctx.fillStyle = this.color
    ctx.beginPath()
    ctx.arc(this.position.x, this.position.y, this.radius, 0, Math.PI * 2)
    ctx.fill()
  }
}

function intersect(a, b) {
  const r = (a.radius + b.radius) ** 2
  const dx = a.position.x - b.position.x
  const dy = a.position.y - b.position.y
  return r > dx ** 2 + dy ** 2
}

const circle1 = new Circle({ x: 100, y: 100 })
const circle2 = new Circle({ x: 200, y: 200 })

function draw() {
  ctx.clearRect(0, 0, canvas.width, canvas.height)
  circle1.color = circle2.color = intersect(circle1, circle2) ? 'red' : 'black'
  circle1.draw()
  circle2.draw()
}

draw()

canvas.addEventListener('mousemove', e => {
  circle1.position.x = e.offsetX
  circle1.position.y = e.offsetY
  draw()
})