Домашни - лекция 4 / 2011

Ето и условията на домашните работи към лекция 4:


Задача 0: Пресичане с тетраедър

Да се реализира пресичане с произволен тетраедър, зададен чрез четирите си върха. Можете да приемете, че фигурата няма да е изродена, т.е. няма да има съвпадащи върхове, и четирите върха няма да са в една равнина. В generateScene(), заменете сферата с вашия тетраедър.


Задача 1: Процедурна текстура

Да се реализира следната двумерна процедурна текстура (по подобие на Checker):

Където ColorX[i], и ColorsY[i] са дадени цветове (за начало можете да ги изберете случайно), а FreqX[i], и FreqY[i] са дадени честоти, от които зависи колко фин да е детайла. Като за начало на FreqX[] и FreqY[] задайте случайни стойности в интервала [0.0 .. 0.8].

Да се използва така направената текстура, на мястото на Checker-а за равнината. Нагласете параметрите на текстурата по ваш вкус.

Eто примерна картинка с тази текстура, при произволно генерирани параметри: click me.


Задача 2: Dithering

Въпреки, че TrueColor режимите изобразяват 16+ милиона цвята, това не значи, че човешкото око не може да види ясно разликата между два съседни цвята, и това сe демонстрира лесно, като си създадете зелен градиент. За целта, заменете сегашната generateScene() функция със следната, а от constants.h задайте RESX, RESY на 1024, 768 съответно. Трябва да получите нещо подобно. Видимо са изразени "слоеве" с еднакъв цвят (особено към по-тъмните области), които развалят усещането за гладкост на изображението. За по-нагледно, можете да PrintScreen-вате резултата от рендера и чрез инструмент за прагова бинаризация (например, в GIMP: Colors->Threshold) да видите границата между слоевете - пример.
Въпреки това, ние сме сметнали цветовете абсолютно правилно, и този слоест дефект се дължи на функцията, която превръща Color стойностите от vfb масива в обикновени, low-dynamic range цветове - виновниците са displayVFB() от sdl.cpp, и convertTo8bit() от color.h.
Dithering алгоритмите бяха често прилагани преди 10-15 години, когато повечето монитори и видеокарти не бяха TrueColor, но нищо не пречи да ги приложим и в нашия случай. Напишете модификация на текущото превръщане от Color → 8bit, което ползва избран от вас dithering (т.е., 8-битовите резултати, които displayVFB() генерира, трябва да се разбутат с ±1). Крайната цел е слоевете да престанат да бъдат видими. Ето как изглежда всъщност и бинаризацията след Floyd-Steinberg dithering - резултат (разбира се, може да ползвате и друг dithering алгоритъм).


Задача 3: Повече от една светлина

Да се реализира възможността да имаме повече от една светлина в сцената (т.е. позициите и интензитетите да се пазят в масив, по подобие на nodes[]/geometries[]/... масивите).
Сенките трябва да работят коректно (т.е. ако дадена област е в сянка само за една от светлините, то не трябва да бъде черна). Аранжирайнте сцена с 2 или повече светлини.


Допълнителна задача 4: Пресичане с тор

Реализирайте пресичане на лъч с тор (поничка). В интернет можете да прочетете за различните подходи за това (както с решаване на уравнения, така и с постъпкови методи/двоично търсене). Напълно приемливо е да ползвате стъпков подход (при който дадена точка се придвижва по протежение на лъча, докато не се окаже "вътре" в тора).
Ориентацията на тора е по ваш избор.
Ето пример какво трябва да се получи при тор с център (30, 50, 100), радиус 35 и радиус на тръбата 8:

Разпределяне на задачите и точкуване

За да се избегне опасността да проверявам 77 решения на една и съща задача (понеже се оказала най-лесна), в сила е следното разпределение на задачите:

K = вашият_факултетен_номер MOD 4
Имате право да решавате задача № К.
Освен това, всички имате право да решавате задача №4.
При правилни решения, задачи 0-3 носят по 6 точки, а задача 4 носи 8.
Крайният срок е 17-ти Ноември (Четвъртък), 23:00.
Ползвайте ревизия 622.
Препоръчвам ви да изготвите решенията си преди този срок - така, ако решението ви има проблем и не взима максималния брой точки, ще получите отговор и имате възможност да си го поправите (free of charge). При пращане в последната минута, очевидно няма да имате тази привилегия.

Домашните пращайте по e-mail, като трябва да изпратите само diff-а (вашите нововъведения) спрямо кода в SVN - тук има указания за домашните работи.

Въпроси по условията задавайте в тази тема.

Comments

Избор на задача

"Имате право да решавате задача № К.
Освен това, всички имате право да решавате задача №4."

Ако реша едновременно задача К и задача 4 колкото точки бих получил, 14 или 8?

14

14

Втора задача

Здравейте.
Мога ли да помоля да качите готовата картинка на втора задача ? И относно алгоритъма на Floyd–Steinberg, да попитам дали съм го разбрал правилно. Значи идеята (според мен) е, че взимаме цвета на даден пиксел и намираме грешката му (т.е. разликата между цвета, в който е пиксела и най-близкия до него ?!?). След това обхождаме останалите пиксели около текущия и събираме цветовете им с грешката. Внимаваме да не обходим пиксел, който вече е бил текущ.
Моля да бъда поправен на местата, в които не съм разбрал нещо.
Доста съм "пресен" в тази област, както евентуално е станало ясно вече.

Разяснения

Здравейте,
относно задача №2, първо да уточня, че не се длъжни въобще да реализирате именно Floyd-Steinberg, а спокойно може някой от по-простите алгоритми. Иначе - относно него - цветовете се обработват по канали, R, G и B са абсолютно независими един от друг. За оценката на грешката: след като float числото от даден канал на някой пиксел се ограничи до [0..1] и умножи по 255, то получената стойност трябва да се закръгли до цяло число. Грешката е точно разликата между нецялата и цялата стойност. Тази разлика трябва да се разхвърли по съседните пиксели на обработвания. Иначе даден канал на един пиксел се обработва само веднъж! Никога не се прави втори пас през него.
Относно картинка, нарочно не включвам такава, защото всички ще се юрнете да пишете точно този алгоритъм, който съм ползвал аз ;) целта тук е по-скоро да добиете представа за нещата, да експериментирате, и да стигнете сами до убеждението, че вашият алгоритъм е верен, а не да има - "а, съвпада с това от условието - готов съм значи" :)

ревизия върху която да бъде изготвен пача

Здрасти,

В условието пише да използваме ревизия 622, но в по-горните ревизии има фикснати някой бъгове, като например този за акумулиране на цвят в текущия. Да оправим каквото е нужно в нашия пач върху 622 или все пак да използваме по-горна ревизия ?

Имам и един втори въпрос по принцип в домашните (и накрая в проектите), дали можем да използваме за наше удобство неща от C++11, които вече ги има имплементирани в повечето компилатори, като например type inference и std::shared_ptr. Ако например искам да си пазя светлините в std::vector, а не в масив и за да не ги трия ръчно накрая, да използвам умни указатели ? Не че ще ми спести кои знае колко писане, но все пак си е удобство.

Поздрави,
Иван

Здравей, по първия въпрос -

Здравей,
по първия въпрос - ползвайте която ревизия желаете; ако по-новата ви върши работа, давайте смело с нея. Причината да въведа разясненията за ревизиите е по-скоро платформена: докато аз се потготвям за следващата лекция, често добавям нови неща в SVN (включително и нови сорс файлове) и не винаги тествам дали проекта се компилира без грижи на всички поддържани платформи и среди - демек, "latest svn" е потенциално проблемно. Затова, към домашните споменавам и конкретни ревизии, които съм тествал и би следвало да дават най-малко проблеми (Е, в конкретния случай не е точно така, но...).

по втория въпрос - имате пълната свобода да пробвате C++11 (проекта е доста подходящ за тестване на такива неща всъщност, тъй като не гоним особено велика задна съвместимост). Единствено се въздържайте от платформено-зависими неща (аз тествам с gcc 4.5 и ми се иска да не се налага да заобикалям MS-specific неща, да речем).

Домашните са проверени

Пратените домашни по лекция 4 са вече проверени.
Ако някой ми е пратил домашно и чака все още отговор, моля да ми пише пак за да видя, къде се е изгубила оценката му.

Сигурно сте забелязали новото линкче в меню "връзки" горе - текущата оценка ви дава възможност да видите точките си (там ще се събират всичките точки от домашни работи, тестове и курсовата работа).
Ако не си виждате очакваната оценка там, дайте профилактично reload на страницата (Ctrl+R).