У меня есть новый эффективный код радиовещания:
vectorX, vectorY = math.cos(r * math.pi/180), math.sin(r * math.pi/180)
wallDistanceX, wallDistanceY = v[3] - v[1], v[4] - v[2]
wallParallelX, wallParallelY = -wallDistanceY, wallDistanceX
rayX, rayY = v[1] - cam.x, v[2] - cam.y
Distance = (
(rayX * wallParallelX) + (rayY * wallParallelY))/(
(vectorX * wallParallelX) + (vectorY * wallParallelY)
)
if (
(math.min(v[1],v[3]) <= (cam.x + (Distance * vectorX)) and math.max(v[1],v[3]) >= (cam.x + (Distance * vectorX))) and
(math.min(v[2],v[4]) <= (cam.y + (Distance * vectorY)) and math.max(v[2],v[4]) >= (cam.y + (Distance * vectorY)))
) then
table.insert(possibles, Distance)
else
table.insert(possibles, 0)
end
Этот фрагмент кода был преобразован в Lua из ответа этого сообщения, но когда лучи нарисованы, они выглядят разбитыми, как это:
Я выполнил отладку и так, и получается, что, когда луч проверяется на пересечение линии, возвращается расстояние 0 (возвращаемое расстояние 0 означает, что луч предположительно не пересекся со стеной). Как видите, есть стена, и миникарта в верхнем левом углу показывает именно это.
Есть идеи о том, почему луч не обнаруживается при его пересечении? Если вы не понимаете что-то, пожалуйста, спросите.
r = angle for ray
v = an index of the list {}; v[i] is either the x1,y1,x2,y2 of the line