ΠΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ΅Π½Ρ Β«ΠΡΡΠ°ΠΆΠ°ΡΡΠΈΠ΅ΡΡ Π΄ΠΎΡΠΎΠΆΠΊΠΈΒ» Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠΈ Π»ΡΡΠ΅ΠΉ
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)); WorkVector v = new WorkVector (-ray.finalRay.x, — ray.finalRay.y, — ray.finalRay.z); // Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π²Π΅ΠΊΡΠΎΡΠ° — ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π»ΡΡΠ°. Public Color Shade (WorkVector p, WorkVector n, WorkVector v… Π§ΠΈΡΠ°ΡΡ Π΅ΡΡ >
ΠΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ΅Π½Ρ Β«ΠΡΡΠ°ΠΆΠ°ΡΡΠΈΠ΅ΡΡ Π΄ΠΎΡΠΎΠΆΠΊΠΈΒ» Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠΈ Π»ΡΡΠ΅ΠΉ (ΡΠ΅ΡΠ΅ΡΠ°Ρ, ΠΊΡΡΡΠΎΠ²Π°Ρ, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ)
ΠΡΡΡΠΎΠ²Π°Ρ ΡΠ°Π±ΠΎΡΠ°
Π½Π° ΡΠ΅ΠΌΡ:
"ΠΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ΅Π½Ρ «ΠΡΡΠ°ΠΆΠ°ΡΡΠΈΠ΅ΡΡ Π΄ΠΎΡΠΎΠΆΠΊΠΈ» Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠΈ Π»ΡΡΠ΅ΠΉ"
ΠΠΊΠ°ΡΠ΅ΡΠΈΠ½Π±ΡΡΠ³ 2011 Π³.
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
1) ΠΠ°ΡΠ°Π½Π΅Π΅ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π·Π°Π΄Π°Π½Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΈ ΡΠ²Π΅ΡΠ°, ΡΠΈΠΏ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΎΠΊΠ½Π° Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΡΠ²Π΅Ρ ΡΠΎΠ½Π°, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΡΠΎΡΠΊΠΈ ΠΎΠ±Π·ΠΎΡΠ°;
2) ΠΠ°ΡΠ΅ΠΌ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΈΠΊΡΠ΅Π»Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠ²Π΅Ρ, Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ Π»ΡΡΠΈ;
3) ΠΡΠ»ΠΈ Π·Π°Π΄Π°Π½Π½ΡΠΉ Π»ΡΡ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°Π΅Ρ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΡΠ΅Π½Ρ, ΡΠΎ Π·Π°ΠΊΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ Π΄Π°Π½Π½ΡΠΉ ΠΏΠΈΠΊΡΠ΅Π»Ρ Π² ΡΠ²Π΅Ρ ΡΠΎΠ½Π°.
4) ΠΡΠ»ΠΈ ΠΆΠ΅ Π·Π°Π΄Π°Π½Π½ΡΠΉ Π»ΡΡ ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°Π΅Ρ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠ΅Π½Ρ, ΡΠΎ ΠΎΠ±ΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΊ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΊΠ»Π°ΡΡΠ° Ray ΡΠ°ΡΡΡΠΈΡΡΠ²Π°ΡΡΠ΅ΠΌΡ ΡΠ²Π΅Ρ Π² ΡΠΎΡΠΊΠ΅ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡ. ΠΠ½ Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΊ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠΌΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΊΠ»Π°ΡΡΠ° Sphere, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Ρ ΠΎΠ΄ΠΈΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΡΠΎΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡ Π»ΡΡΠ° Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ, ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ Π΄Π»ΠΈΠ½Ρ Π»ΡΡΠ° (Π²Π΅ΠΊΡΠΎΡΠ°) Π΄ΠΎ ΡΠΎΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ, Π½Π°Ρ ΠΎΠ΄ΠΈΡ Π²Π΅ΠΊΡΠΎΡ Π½ΠΎΡΠΌΠ°Π»ΠΈ ΠΊ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ Π² ΡΠΎΡΠΊΠ΅ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡ.
5) ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ Π²ΡΠ΅ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠ΅ Π²ΡΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² ΠΌΠ΅ΡΠΎΠ΄ ΠΊΠ»Π°ΡΡΠ° Surface, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΠ²Π΅Ρ Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΠΎΡΠΊΠ΅. Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ²ΠΎΠΉΡΡΠ² ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π° ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π½Π°Ρ ΠΎΠ΄ΠΈΡ Π·Π°ΡΠ΅Π½Π΅Π½Π½ΠΎΡΡΡ, ΠΎΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΏΡΠ΅Π»ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΠΎΡΠΊΠ΅. ΠΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ Π΄Π²ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ Π»ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠ°ΡΡΠΈΡΡΠ΅ΡΡΡ (Ρ.Π΅. ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ Π·Π°Π½ΠΎΠ²ΠΎ ΠΏΡΠ½ΠΊΡΡ 3−5 Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° (ΡΠ΅ΠΊΡΡΡΠΈΡ)). ΠΡΠΈ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠ΅ ΡΡΠΎΠ³ΠΎ Π»ΡΡΠ° ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ²Π΅Ρ Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΠΎΡΠΊΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅ΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² Π³Π»Π°Π²Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ.
ΠΠ»ΠΎΠΊ-ΡΡ Π΅ΠΌΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΠ΅Π½Ρ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΠ΅
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ°Π±ΠΎΡΡ Π½Π°Π΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ Π±ΡΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Ρ ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ: ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠ° Π»ΡΡΠ΅ΠΉ Ρ ΠΏΡΠΎΡΡΠ΅ΡΠΎΠΌ ΡΠ΅Π½Π΅ΠΉ, ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΡ, ΠΎΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΏΡΠ΅Π»ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π»ΡΡΠ΅ΠΉ, ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΡΠΎΠΌΠ½Π΅Π½Π½ΡΠΌ Π΄ΠΎΡΡΠΎΠΈΠ½ΡΡΠ²ΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π’Π°ΠΊΠΆΠ΅ Π·Π°Π΄Π°Π½ ΠΎΠ±ΡΠ΅ΠΊΡ — ΡΡΠ΅ΡΠ°. ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΡΠΈΡΠ°Ρ ΡΠΎ, ΡΡΠΎ Π½Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ ΡΠ°ΠΊΠΈΠ΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΈ ΡΠ²Π΅ΡΠ°, ΠΊΠ°ΠΊ ΡΠ²Π΅Ρ ΠΎΠΊΡΡΠΆΠ°ΡΡΠ΅ΠΉ ΡΡΠ΅Π΄Ρ ΠΈ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ ΡΠ²Π΅Ρ.
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 1
ΠΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 2
ΠΠΈΡΡΠΈΠ½Π³ Light. java
package objects;
/**
*
* @author ΠΠ»Π΅ΠΊΡΠ΅ΠΉ
*/
// ΠΡΡΠΎΡΠ½ΠΈΠΊ ΡΠ²Π΅ΡΠ°
public class Light {
public WorkVector lightvec; // ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΈΡΡΠΎΠ½ΠΈΠΊΠ° ΡΠ²Π΅ΡΠ°
public float lightred, lightgreen, lightblue; // ΡΠ²Π΅Ρ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΡΠ²Π΅ΡΠ°
public Light (WorkVector v, float r, float g, float b) {
lightvec = v;
lightred = r;
lightgreen = g;
lightblue = b;
}
}
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 3
ΠΠΈΡΡΠΈΠ½Π³ Ray. java
package objects;
import java.awt. 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 < objects. size (); i++) {
Sphere object = (Sphere) objects. elementAt (i);
object.intersection (this); // ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ
}
return (object≠ null); // Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ true Π΅ΡΠ»ΠΈ Π±ΡΠ»ΠΎ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΠ΅
}
public final Color Shade (Vector lights, Vector objects, Color bgnd) {
return object. Shade (this, lights, objects, bgnd);
}
}
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 4
ΠΠΈΡΡΠΈΠ½Π³ Sphere. java
package objects;
import java.awt. Color;
import java.util. Vector;
/**
*
* @author ΠΠ»Π΅ΠΊΡΠ΅ΠΉ
*/
// Π‘ΡΠ΅ΡΠ°
public class Sphere {
Surface surface; // ΡΠΈΠΏ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ
WorkVector center; // ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡ
float radius; // ΡΠ°Π΄ΠΈΡΡ ΡΡΠ΅ΡΡ
public Sphere (Surface s, WorkVector c, float r) {
surface = s;
center = c;
radius = r;
}
public boolean intersection (Ray ray)
public Color Shade (Ray ray, Vector lights, Vector objects, Color bgnd) {
// Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, Π΅ΡΠ»ΠΈ Π±ΡΠ»Π° Π½Π°ΠΉΠ΄Π΅Π½Π° ΡΠΎΡΠΊΠ° ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ Π»ΡΡΠ°
// Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π»ΡΡΠ° ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ Π½Π° ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ Π΄ΠΎ ΡΠΎΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡ
float px = ray.initRay.x + ray. currentDistance*ray.finalRay.x;
float py = ray.initRay.y + ray. currentDistance*ray.finalRay.y;
float pz = ray.initRay.z + ray. currentDistance*ray.finalRay.z;
WorkVector p = new WorkVector (px, py, pz); // Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠΎΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡ Π»ΡΡΠ° ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
WorkVector v = new WorkVector (-ray.finalRay.x, — ray.finalRay.y, — ray.finalRay.z); // Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π²Π΅ΠΊΡΠΎΡΠ° — ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π»ΡΡΠ°
WorkVector n = new WorkVector ((px — center. x), (py — center. y), (pz — center. z)); // Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π²Π΅ΠΊΡΠΎΡ, ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ Π½ΠΎΡΠΌΠ°Π»Ρ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠ΅ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ
n.normalize (); // ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π½ΠΎΡΠΌΠ°Π»Ρ
return surface. Shade (p, n, v, lights, objects, bgnd); // Π²ΠΎΠ·Π²ΡΠ°ΡΡΠ΅ΡΡΡ ΡΠ²Π΅Ρ Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΠΎΡΠΊΠ΅
}
}
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 5
ΠΠΈΡΡΠΈΠ½Π³ Surface. java
package objects;
import java.awt. Color;
import java.util. Vector;
/**
*
* @author ΠΠ»Π΅ΠΊΡΠ΅ΠΉ
*/
public class Surface {
public float ir, ig, ib; // ΡΠ²Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
public float kRasseivania, kOtragenia, ns; // ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ Π΄Π»Ρ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
public float kt, kr; // ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°
private float TINY = 0.001f;
private float I255 = 0.39 2156f;
private WorkVector luch;
public Surface (float rval, float gval, float bval, float d,
float s, float n, float r, float t) {
ir = rval; ig = gval; ib = bval; // Π·Π°Π΄Π°Π½ΠΈΠ΅ ΡΠ²Π΅ΡΠ° ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ
kRasseivania = d; // ΡΠ°ΡΡΠ΅ΠΈΠ²Π°ΡΡΠ°Ρ ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠ°Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ
kOtragenia = s; // ΠΎΡΡΠ°ΠΆΠ°ΡΡΠ°Ρ ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠ°Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ
ns = n;
kr = r*I255;
kt = t*I255;
}
public Color Shade (WorkVector p, WorkVector n, WorkVector v, Vector lights, Vector objects, Color bgnd) // Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ²Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² ΡΠΎΡΠΊΠ΅
// ΡΠΎΡΠΊΠ° ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡ (p)
// Π½ΠΎΡΠΌΠ°Π»Ρ Π² ΡΠΎΡΠΊΠ΅ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡ (n)
// Π²Π΅ΠΊΡΠΎΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ Π² ΡΠΎΡΠΊΡ ΠΈΠ· ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΈΡΠ΅Π» Π»ΡΡΡ (v)
{
float r = 0; // ΠΎΠ±Π½ΡΠ»ΡΠ΅ΠΌ
float g = 0;
float b = 0;
for (int i = 0; i < lights. size (); i++) { // ΡΠΈΠΊΠ», Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ°ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΎΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΡ
Light light = (Light) lights. elementAt (i); // Π²Π·ΡΡΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΈΡΡΡΠΎΠ½ΠΈΠΊΠ° ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΡ
luch = new WorkVector (light.lightvec.sub (p)); // Π·Π°Π΄Π°Π΅ΠΌ Π²Π΅ΠΊΡΠΎΡ luch ΠΊΠ°ΠΊ Π²Π΅ΠΊΡΠΎΡ ΠΎΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΡ Π΄ΠΎ ΡΠΎΡΠΊΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
luch.normalize (); // Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π²Π΅ΠΊΡΠΎΡ luch ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π²Π΅ΠΊΡΠΎΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΡ ΠΊ ΡΠΎΡΠΊΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
// ΠΠΠ’ΠΠΠΠΠΠΠ‘Π’Π¬
WorkVector poffset = p. add (luch.mul (TINY)); // ΠΊ ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π»ΡΡΠ° Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΌΠ°Π»ΡΠ΅Π½ΡΠΊΠΈΠΉ Π²Π΅ΠΊΡΠΎΡ luch ΡΡΠΎΠ±Ρ ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΡ ΡΠ°ΠΌ ΡΠ΅Π±Ρ
Ray shadowRay = new Ray (poffset, luch); // ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π»ΡΡΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° Π·Π°ΡΠ΅Π½Π΅Π½Π½ΠΎΡΡΡ
if (shadowRay.trace (objects)) // Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΠ΅ΠΎΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
continue; // ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΡ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΡ
float lambert = WorkVector. dot (n, luch); // Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠ° ΠΎΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΠΈ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π½ΠΎΡΠΌΠ°Π»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΠΎΡΠΊΠ΅ ΠΈ Π½Π°ΠΏΡΠ°Π»Π΅Π½ΠΈΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΡΠ²Π΅ΡΠ°
if (lambert > 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)? 1f: r;
r = (r < 0f)? 0f: r;
g = (g > 1f)? 1f: g;
g = (g < 0f)? 0f: g;
b = (b > 1f)? 1f: b;
b = (b < 0f)? 0f: b;
return new Color (r, g, b); // Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΡΠ²Π΅ΡΠ° ΡΠΎΡΠΊΠΈ
}
}
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 6
ΠΠΈΡΡΠΈΠ½Π³ WorkVector. java
package objects;
/**
*
* @author ΠΠ»Π΅ΠΊΡΠ΅ΠΉ
*/
public class WorkVector {
public float x, y, z; // ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ Π²Π΅ΠΊΡΠΎΡΠ°
public WorkVector () {}
public WorkVector (float X, float Y, float Z) {
x = X;
y = Y;
z = Z;
}
public WorkVector (WorkVector v) {
x = v. x;
y = v. y;
z = v. z;
}
// ΠΌΠ΅ΡΠΎΠ΄Ρ
public float dot (WorkVector v) { // ΡΠΊΠ°Π»ΡΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅
return (x*v.x + y*v.y + z*v.z);
}
public float dot (float Bx, float By, float Bz) {
return (x*Bx + y*By + z*Bz);
}
public static float dot (WorkVector A, WorkVector B) {
return (A.x*B.x + A. y*B.y + A. z*B.z);
}
public WorkVector add (WorkVector A) { // ΠΠ΅ΠΊΡΠΎΡ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
return new WorkVector (x+A.x, y+A.y, z+A.z);
}
public WorkVector sub (WorkVector A) { // ΠΠ΅ΠΊΡΠΎΡ ΡΠ°Π·Π½ΠΎΡΡΠΈ
return new WorkVector (x-A.x, y-A.y, z-A.z);
}
public WorkVector mul (float A) { // ΠΠ΅ΠΊΡΠΎΡ, ΡΠΌΠ½ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π½Π° ΡΠΈΡΠ»ΠΎ
return new WorkVector (x*A, y*A, z*A);
}
public WorkVector set (WorkVector A) { // ΠΠ°Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ
return new WorkVector (A.x, A. y, A. z);
}
public WorkVector set (float Ax, float Ay, float Az) {
return new WorkVector (Ax, Ay, Az);
}
public WorkVector cross (WorkVector B) {
return new WorkVector (y*B.z — z*B.y, z*B.x — x*B.z, x*B.y — y*B.x);
}
public WorkVector cross (float Bx, float By, float Bz) {
return new WorkVector (y*Bz — z*By, z*Bx — x*Bz, x*By — y*Bx);
}
public WorkVector cross (WorkVector A, WorkVector B) {
return new WorkVector (A.y*B.z — A. z*B.y, A. z*B.x — A. x*B.z, A. x*B.y — A. y*B.x);
}
public float length () { // ΠΠ°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ Π²Π΅ΠΊΡΠΎΡΠ°
return (float) Math. sqrt (x*x + y*y + z*z);
}
public float length (WorkVector A) {
return (float) Math. sqrt (A.x*A.x + A. y*A.y + A. z*A.z);
}
public void normalize () { // Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π²Π΅ΠΊΡΠΎΡΠ°
float t = x*x + y*y + z*z;
if (t≠ 0 && t≠ 1) t = (float) (1 / Math. sqrt (t));
x *= t;
y *= t;
z *= t;
}
public static WorkVector normalize (WorkVector A) {
float t = A. x*A.x + A. y*A.y + A. z*A.z;
if (t≠ 0 && t≠ 1) t = (float) (1 / Math. sqrt (t));
return new WorkVector (A.x*t, A. y*t, A. z*t);
}
}
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 7
ΠΠΈΡΡΠΈΠ½Π³ Main. java
package ray_tracing;
import objects.*;
import java.awt. Color;
import java.awt. Frame;
import java.awt. Graphics;
import java.awt. Image;
import java.awt.event. WindowAdapter;
import java.awt.event. WindowEvent;
import java.util. Vector;
/**
*
* @author ΠΠ»Π΅ΠΊΡΠ΅ΠΉ
*/
public class Main {
final static int kol_vo = 600;
static Image screen;
static Graphics gc;
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); // ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° Π²ΡΠ΅Π³ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π½Π° ΡΠΊΡΠ°Π½Π΅
}
}