Andrés,
Una opción es desarmar la recursión para que se transforme en un procedimiento iterativo. Para eso tienen que usar un stack propio que vaya guardando las "llamadas" que aun quedan por ejecutar.
Si no quieren meterse en eso, una opción "fuerza bruta" es hacer un for que recorra todos los fotones y cuente los que caen en el radio especificado. Esta cuenta la hacen para cada pixel, por lo que va a ser lento. Pero debería ser fácil de implementar y dar resultados coherentes.
La tercera opción es armar una subdivisión uniforme del espacio y guardar los fotones dentro de ella (pueden hacerlo como un array de arrays). Luego, a la hora de consultar el mapa, se fijan solo en el cubo correspondiente y adyacentes. Así se acelera bastante el algoritmo "fuerza bruta" mencionado anteriormente.
Saludos,
José