Цилиндрична камера

Това задание все още не е осъвременено към текущата версия на рейтрейсъра; възможно е да има несъответствия между имената на файловете, класовете и/или очакваните резултати!

Да се напише модификация към текущата камера, която я превръща в цилиндрична камера. При нея, лъчите се генерират по следният начин:

Екранните координати (x, y) се третират като (ъгъл, височина). X-координатът указва ъгъла на генерираните лъчи в XZ равнината; Y-координатът указва височината на началото на лъча, като началото се движи във цилиндър с някаква зададена височина height. Иначе казано, все едно лъчите тръгват от цилиндър, с височина height, като центъра на този цилиндър съвпада с позицията на камерата (т.е. точния център на цилиндъра, а не центъра на долната или горната основа). Цилиндърът е чисто вертикален - височината му е успоредна на Oy.

Ъгълът, задаван чрез екранните координати по x, трябва да описва 360-градусов диапазон (за X екранни координати от 0..frameWidth()). По средата на кадъра, камерата трябва да "гледа" в посоката, зададена чрез yaw ъгъла (припомняме, че при yaw = 0, камерата гледа в посока +Z). Т.е., за тази част трябва да превърнете x чрез подходяща трансформация до ъгъл 0..2PI, след което (чрез полярни -> декартови координати) да зададете X и Z компонентите на посоката на генерирания лъч (Y = 0 за посоката). Екранните координати по Y задават началото на лъча - това начало трябва да се движи по височината в цилиндъра; за y = 0, лъчът трябва да се генерира в горната точка на цилиндъра, а за y = frameHeight() - долната.

Очаквани резултати:
1. boxed.hexray с височина на цилиндъра = 60
2. meshes.hexray с височина на цилиндъра = 90

Така зададената задача носи 10 точки

Бонус (5т):
Да се добави възможност ъглите по X да се генерират само в определен сегмент (вместо 360 градусов, както е в базовата задача). За целта да се ползва параметъра fov на камерата (при fov 360, имаме базовата задача. Ако сложим fov 90, то камерата трябва да гледа в 90-градусов сегмент, центриран спрямо yaw ъгъла, естествено). Пример:

3. boxed.hexray@fov120, височина на цилиндъра = 60

Реализацията изисква да се добави параметър "cylindrical" към Camera, който да я прави цилиндрична, когато е включен, както и double параметър "height", указващ височината на цилиндъра.