Избавиться от рекурсии

328
02 июня 2017, 09:58

Нужно избавиться от рекурсии в данной функции с помощью стека\очереди. Запутался где именно и какие параметры нужно добавлять в очередь.

Vector3 GetIntersectionPointColor(Ray ray, IHitable world, int depth)
{
    if (world.Hit(ray, 0.001f, float.MaxValue, out var hitRecord))
    {
        if (depth < 50 && hitRecord.Material.Scatter(ray, hitRecord, out var attenuation, out var scattered))
        {
            return attenuation * GetIntersectionPointColor(scattered, world, ++depth);
        }
        return Vector3.Zero;
    }
    var unitDirection = Vector3.Normalize(ray.Direction);
    var amount = (float)(0.5f * (unitDirection.Y + 1.0));
    var white = new Vector3(1, 1, 1);
    var blue = new Vector3(0.5f, 0.7f, 1);
    return Vector3.Lerp(blue, white, amount);
}
Answer 1

Вариант простым циклом, без стеков и очередей. while(true) можно заменить на проверку depth, чтобы в бесконечный цикл не уйти.

Vector3 GetIntersectionPointColor(Ray ray, IHitable world, int depth)
{
    var scattered = ray;
    Vector3 result = Vector3.One;
    while(true)
    {
        if (!world.Hit(scattered, 0.001f, float.MaxValue, out var hitRecord))
        {
            var unitDirection = Vector3.Normalize(scattered.Direction);
            var amount = (float)(0.5f * (unitDirection.Y + 1.0));
            var white = new Vector3(1, 1, 1);
            var blue = new Vector3(0.5f, 0.7f, 1);
            return result * Vector3.Lerp(blue, white, amount);
        }
        if (depth >= 50 || !hitRecord.Material.Scatter(scattered, hitRecord, out var attenuation, out scattered))
        {
            return Vector3.Zero;
        }
        result *= attenuation;
        depth++;
    }
}
READ ALSO
Выделить слово в RichTextBox

Выделить слово в RichTextBox

Как двойным кликом по слову в RichTextBox выделить его и отобразить над ним Panel (панель изначально скрыта и должна появляться когда происходит...

279
Помогите разобраться. С#

Помогите разобраться. С#

Суть вопроса в том что если xstock_quantity = 5, а reserved = 1, результат равен 3

213
Как вызвать функцию Win Forms приложения из console?

Как вызвать функцию Win Forms приложения из console?

Нужно запустить приложение Win forms из командной строки cmd и передать параметры на выполнение функции, графический интерфейс при этом не должен...

369
Можно ли узнать кто прячется за ServiceHost?

Можно ли узнать кто прячется за ServiceHost?

При работе с пакетом офиса через MicrosoftOffice

193