Нужно избавиться от рекурсии в данной функции с помощью стека\очереди. Запутался где именно и какие параметры нужно добавлять в очередь.
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);
}
Вариант простым циклом, без стеков и очередей. 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++;
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Как двойным кликом по слову в RichTextBox выделить его и отобразить над ним Panel (панель изначально скрыта и должна появляться когда происходит...
Суть вопроса в том что если xstock_quantity = 5, а reserved = 1, результат равен 3
Нужно запустить приложение Win forms из командной строки cmd и передать параметры на выполнение функции, графический интерфейс при этом не должен...