Разработка и практическая апробация программы для соответствия поставленным требованиям: реализация трассировки лучей с просчетом теней, освещения, отражения, преломления лучей, что является несомненным достоинством данной спроектированной программы.
При низкой оригинальности работы "Отрисовка сцены "Отражающиеся дорожки" алгоритмом обратной трассировки лучей", Вы можете повысить уникальность этой работы до 80-100%
Курсовая работа на тему: «Отрисовка сцены «Отражающиеся дорожки» алгоритмом обратной трассировки лучей» Екатеринбург 2011 г. Алгоритм работы программы 1) Заранее в программе заданы объекты и источники света, тип поверхности объектов, размеры окна для отображения изображения, цвет фона, а также координаты точки обзора; 2) Затем для каждого пикселя изображения рассчитываем цвет, для этого направляем лучи; 3) Если заданный луч не пересекает ни одного объекта сцены, то закрашиваем данный пиксель в цвет фона. 5) Программа передает все найденные выше параметры в метод класса Surface, который рассчитывает цвет в данной точке. Color; import java.util. Vector; /** * * @author Алексей */ // Луч public class Ray { float max_distance = Float.MAX_VALUE; // максимальная значение для currentDistance луча WorkVector initRay; // начало луча WorkVector finalRay; // направление луча float currentDistance; // Текущее расстояние до обьекта Sphere object; // Обьект, с которым произошло столкновение луча public Ray (WorkVector eye, WorkVector dir) { initRay = new WorkVector(eye); finalRay = WorkVector.normalize(dir); } public boolean trace (Vector objects) { currentDistance = max_distance; object = null; for (int i = 0; i ray.currentDistance) return false; // нахождение суммы квадрата v и квадратов элементов вектора dv float t = radius*radius v*v - dv.x*dv.x - dv.y*dv.y - dv.z*dv.z; if (t ray.currentDistance) || (t 0) { if (kRasseivania > 0) { float diffuse = kRasseivania*lambert; r = diffuse*ir*light.lightred; g = diffuse*ig*light.lightgreen; b = diffuse*ib*light.lightblue; } if (kOtragenia > 0) { lambert *= 2; float spec = v.dot (lambert*n.x - luch.x, lambert*n.y - luch.y, lambert*n.z - luch.z); if (spec > 0) { spec = kOtragenia*((float) Math.pow((double) spec, (double) ns)); r = spec*light.lightred; g = spec*light.lightgreen; b = spec*light.lightblue; } } } } // ОТРАЖЕНИЕ if (kr > 0) { // если коэффициент отражения больше нуля, то обьект может отражать float t = v.dot(n); // получение результата скалярного произведения вектора направленного к началу источника луча и нормали поверхности в данной точке if (t > 0) { t *= 2; WorkVector reflect = new WorkVector (n.mul(t).sub(v)); WorkVector poffset = new WorkVector (p.add (reflect.mul(TINY))); Ray reflectedRay = new Ray (poffset, reflect); if (reflectedRay.trace(objects)) { Color rcolor = reflectedRay. Shade (lights, objects, bgnd); r = kr*rcolor.getRed(); g = kr*rcolor.getGreen(); b = kr*rcolor.getBlue(); } else { r = kr*bgnd.getRed(); g = kr*bgnd.getGreen(); b = kr*bgnd.getBlue(); } } } // ПРИЛОМЛЕНИЕ if (kt > 0) { WorkVector tr; WorkVector incident = v.add(p); float eta = (float) 0.7; float c1 = incident.mul(-1).dot(n); float c2; c2 = 1 - eta*eta*(1-c1*c1); if (c2 > 0.0) { c2 = (float) (Math.sqrt(c2)); float maae = (eta*c1 - c2); tr = incident.mul(eta).add (n.mul(maae)); tr.normalize(); WorkVector poffset = p.add (n.mul(-TINY)); Ray reflectedRay = new Ray (poffset, tr); if (reflectedRay.trace(objects)) { Color rcolor = reflectedRay. Shade (lights, objects, bgnd); r = kt*rcolor.getRed(); g = kt*rcolor.getGreen(); b = kt*rcolor.getBlue(); } else { r = kt*bgnd.getRed(); g = kt*bgnd.getGreen(); b = kt*bgnd.getBlue(); } } } // чтобы избежать выход за границы r = (r > 1f)?.
Вы можете ЗАГРУЗИТЬ и ПОВЫСИТЬ уникальность своей работы