static Vector listOfObjects;
static Vector listOfLights;
static Surface currentSurface;
static WorkVector eye, lookat, up; // векторынеобходимыедлязаданияпроекции
static float angle = 40; // уголобзора
static Color background = new Color (0,0,0); // цветфона
static int width=640, height=480;
static Frame frame = new Frame («Raytracing»); // созданиефреймадляотображения
public static void main (String[] args) {
frame.setSize (width, height);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
screen = frame.createImage (width, height);
gc = screen.getGraphics();
gc.setColor (frame.getBackground());
gc.fillRect (0, 0, width, height);
frame.addWindowListener (new WindowAdapter() {
@Override
public void windowClosing (WindowEvent e) {
System.exit(0);
}
});
// задание списков обьектов и источников освещения
listOfObjects = new Vector (kol_vo, kol_vo);
listOfLights = new Vector (kol_vo, kol_vo);
// добавлениеисточникаосвещения
listOfLights.addElement (new Light (new WorkVector((float) 2, (float) 2, (float) 1), 1, 1, 1));
listOfLights.addElement (new Light (new WorkVector((float) – 3, (float) 5, (float) 3), 1, 1, 1));
for (int i=0; i<40; i++)
for (int j=0; j<10; j++)
{
// Задание материала для обьектов
currentSurface = new Surface (i*j*0.02f, 0.7f, i*j*0.01f, 0.4f, 0.4f, 10.0f, 0f, 0f);
// Добавлениеобьекта
listOfObjects.addElement (new Sphere (currentSurface, new WorkVector((float) i*(float) 1.0–9, (float) – 5*(float) Math.sqrt((float) i)+7, (float) – j*j*(float) 1.00+(float) 6), (float) 0.8));
}
currentSurface = new Surface (0.6f, 0.6f, 0.4f, 0.2f, 0.4f, 10.0f, 1.0f, 0.2f);
listOfObjects.addElement (new Sphere (currentSurface, new WorkVector((float) 20, (float) 0, (float) – 40), (float) 15));
eye = new WorkVector (5, 0, 40); // координаты точки обзора
lookat = new WorkVector (0, 0, 0); // координаты точки направления взгляда
up = new WorkVector (0, 1, 0); // вектор указывающий верх
Graphics g = frame.getGraphics();
WorkVector Eye, Du, Dv, Vp;
WorkVector look = new WorkVector (lookat.x – eye.x, lookat.y – eye.y, lookat.z – eye.z);
float fl = (float) (width / (2*Math.tan((0.5*angle)*Math.PI/180)));
Eye = eye;
Du = WorkVector.normalize (look.cross(up)); // вектор являющийся вспомогательным вектором для рендера «по оси х»
Dv = WorkVector.normalize (look.cross(Du)); // вектор являющийся вспомогательным вектором для рендера «по оси y»
Vp = WorkVector.normalize(look); // вектор являющийся вспомогательным вектором для рендера «по оси z»
Vp = (Vp.mul(fl)).sub((((Du.mul(width)).add (Dv.mul(height))).mul (0.5f)));
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
WorkVector dir = new WorkVector(((Du.mul(i)).add (Dv.mul(j)).add(Vp))); // заданиеточкиначалалуча
Ray ray = new Ray (Eye, dir); // задание вектора направления луча
if (ray.trace(listOfObjects)) { // если было найдено пересечение с обектом
gc.setColor (ray. Shade (listOfLights, listOfObjects, background)); // то точка получает расчитываемый цвет
} else {
gc.setColor(background); // Если не было пересечения с обьектами то точка имеет цвет фона
}
gc.drawLine (i, j, i, j); // рисование точки на буферном изображении
}
}
g.drawImage (screen, 0, 0, frame); // отрисовка всего изображения на экране
}
}