苦海 发表于 2015-8-8 14:17:56

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]
查看完整版本: Processing系列 光与镜子迷宫