Processing系列 光与镜子迷宫
http://yuanren.cc/wp-content/uploads/2015/03/TwoDimensionalRayTracing.png代码如下:
改变setup中polygon生成函数变成你想要的迷宫,话说可以用这玩意来击败海军大将黄猿么?
void setup() {
size(300, 300);
background(55);
stroke(255);
strokeWeight(1);
Polygon[] polygons = new Polygon;
polygons = new Polygon(new Point[] {
new Point(50, 30),
new Point(20, 120),
new Point(30, 270),
new Point(230, 280),
new Point(280, 170),
new Point(250, 20)
});
polygons = new Polygon(new Point[] {
new Point(70, 80),
new Point(120, 75),
new Point(140, 120),
new Point(90, 160),
new Point(50, 130)
});
polygons = new Polygon(new Point[] {
new Point(60, 210),
new Point(120, 190),
new Point(110, 240),
new Point(80, 230),
});
polygons = new Polygon(new Point[] {
new Point(200, 160),
new Point(230, 180),
new Point(180, 200),
});
for (int i=0; i<polygons.length; i++) {
polygons.display();
}
Point point = new Point(200, 100);
Light light = new Light(point, PVector.random2D());
strokeWeight(4);
point(point.x, point.y);
for (int j=0; j<10; j++) {
for (int i=0; i<polygons.length; i++) {
check(light, polygons);
}
strokeWeight(2.0/(j+1));
light.display();
float x = light.p.x+light.v.x*light.t;
float y = light.p.y+light.v.y*light.t;
PVector v = PVector.sub(light.v, PVector.mult(light.ln, 2*PVector.dot(light.v, light.ln)));
light = new Light(new Point(x, y), v);
}
}
void check(Light light, Polygon polygon) {
for (int i=0; i<polygon.lines.length; i++) {
Line line = polygon.lines;
PVector v = new PVector(line.p.x-light.p.x, line.p.y-light.p.y);
float location = PVector.dot(v, line.n);
float direction = PVector.dot(light.v, line.n);
if (direction<0) {
float t = location/direction;
float u = -PVector.dot(v, light.n)/PVector.dot(line.v, light.n);
if (location<=0 && t<light.t && u>=0 && u<=1) {
light.t = t;
light.ln = line.n;
}
}
}
}
class Polygon {
Line[] lines;
Polygon(Point[] points) {
lines = new Line;
for (int i=1; i<lines.length; i++) {
lines = new Line(points.x, points.y, points.x, points.y);
}
lines = new Line(points.x, points.y, points.x, points.y);
}
void display() {
for (int i=0; i<lines.length; i++) {
lines.display();
}
}
}
class Light {
float t=1000;
Point p;
PVector v, n, ln;
Light(Point p, PVector v) {
this.p = p;
this.v = v;
this.v.normalize();
n = new PVector(v.y, -v.x);
n.normalize();
}
void display() {
line(p.x, p.y, p.x+v.x*t, p.y+v.y*t);
}
}
class Line {
Point p;
PVector v, n;
Line(float x0, float y0, float x1, float y1) {
p = new Point(x0, y0);
v = new PVector(x1-x0, y1-y0);
n = new PVector(y1-y0, x0-x1);
n.normalize();
}
void display() {
line(p.x, p.y, p.x+v.x, p.y+v.y);
}
}
class Point {
float x, y;
Point(float x, float y) {
this.x = x;
this.y = y;
}
}
授权转载自 任远媒体实验室
页:
[1]