Пример #1
0
        /// <summary>
        /// Обратная трассировка лучей и отображение результата на картинке
        /// </summary>
        public void Run()
        {
            // находит общее число лучей для трассировки (количество пикселей, которые надо просчитать)
            var rayCount = _width * _height;

            var origin = _camera.GetPosition();

            // параллельно испускает лучи через каждый пиксель
            Parallel.For(0, rayCount, i =>
            {
                // получает вектор направления луча и испускает его
                var direction = _camera.GetDirection(_x[i], _y[i]);
                var color     = Ray(origin, direction, 0, double.PositiveInfinity, Depth);

                // преобразует вектор в цвет
                _buffer[i] = color.ToColor();
            });

            // отрисовывает содержимое буфера на картинке
            var index = 0;

            for (var y = 0; y < _height; y++)
            {
                for (var x = 0; x < _width; x++)
                {
                    _bitmap.SetPixel(x, y, _buffer[index++]);
                }
            }

            _box.Image = _bitmap;
            _box.Update();
        }