Dibuja una línea hasta el infinito y cuenta cuántas veces cruzas la forma (par o impar), sin contar el segmento donde se encuentra la criatura. Luego verifica si la criatura va a la izquierda o derecha de esa línea.
En este ejemplo, cruzamos la forma dos veces (de manera uniforme) y nos dirigimos hacia la izquierda. El resultado es inmediato de esta tabla:
# Crosses | even | odd
Direction | |
-------------+-------+------
left | CCW | CW
right | CW | CCW
En pseudocódigo:
x, y = position of creature
vx, vy = direction of creature movement
crossings = 0
for each x1, y1, x2, y2 in shape segments:
if (x1 < x and x <= x2) or (x2 < x and x <= x1):
if y - y1 > (x - x1) * (y2 - y1) / (x2 - x1):
++crossings
if (crossings & 1) == (vx < 0):
return CW
else
return CCW