Моя трассировка Джулии Рэй возвращает StackOverFlowError - PullRequest
1 голос
/ 25 сентября 2019

Я пытаюсь написать трассировщик лучей в julia, но моя основная функция возвращает StackOverFlowError.Ниже моя основная функция:

function trace(ray::Ray, surfaces::Array{Any, 1}, depth::Int64, maxDepth::Int64)
    material, t = findIntersection(ray, surfaces, Inf)
    if typeof(material) == Empty
        Vec3(0,0,0)
    end
    if depth > maxDepth
        Vec3(0,0,0)
    end
    if material.isLight == true
        material.emittance
    end
    normal = material.normal
    ρ = material.reflectance
    BRDF = ρ/3.14159
    R = randHemi(normal)
    cosθ = dot(R,normal)
    newRay = Ray(ray.s + t*ray.d, R)
    In = trace(newRay, surfaces, depth+1, maxDepth)
    2.0*3.14159*BRDF*In
end

А вот моя функция пересечения:

function findIntersection(ray::Ray, surfaces::Array{Any, 1}, tmin::Float64)
    hitSurface = Empty(Vec3(0,0,0), Vec3(0,0,0), Vec3(0,0,0), false)
    for surface in surfaces
        t = intersect(surface, ray)
        if t < tmin
            hitSurface = surface
            tmin = t
        end
    end
    return hitSurface, tmin       
end

Но я получаю эту ошибку:

StackOverflowError:

Stacktrace:
 [1] findIntersection(::Ray, ::Array{Any,1}, ::Float64) at .\In[31]:10
 [2] trace(::Ray, ::Array{Any,1}, ::Int64, ::Int64) at .\In[33]:2
 [3] trace(::Ray, ::Array{Any,1}, ::Int64, ::Int64) at .\In[33]:18 (repeats 
 14493 times)
 [4] top-level scope at In[35]:1

В чем причинаошибки?

Ответы [ 2 ]

3 голосов
/ 25 сентября 2019

Ваша проблема в том, что вы пропустили return.То, что вы хотели получить, было

if depth > maxDepth
    return Vec3(0,0,0)
end

Без возврата, эта строка просто выделяет Vec3, и код продолжает цикл.

0 голосов
/ 25 сентября 2019

Ошибка переполнения стека обычно возникает при слишком большом количестве рекурсивных вызовов.В двух словах, в большинстве языков программирования существует ограничение на количество рекурсивных вызовов, которые вы можете сделать.

В вашем примере функции trace вызывают себя рекурсивно, и это может вызвать переполнение стека.У вас есть параметры maxDepth, которые могут ограничить это.Установка более низкого значения, вероятно, решит эту конкретную проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...