class Ray { constructor(xorigin, yorigin, angle, sight) { this.origin = createVector(xorigin, yorigin); this.direction = p5.Vector.fromAngle(angle); //createVector(xdirection, ydirection); this.length = sight; this.hit = 0; this.intersections = []; this.closestIntersection; } show() { if (this.hit >= 1) { //stroke(150, 20, 20);s stroke(200); line(this.origin.x, this.origin.y, this.closestIntersection.x, this.closestIntersection.y); } else { stroke(200); line(this.origin.x, this.origin.y, this.origin.x + this.direction.x * this.length, this.origin.y + this.direction.y * this.length); //line(this.origin.x, this.origin.y, mouseX, mouseY); }/* if (this.hit >= 1 && this.closestIntersection) { fill(51); noStroke(); ellipse(this.closestIntersection.x, this.closestIntersection.y, 5, 5); }*/ } cast(wall) { if (wall) { const x1 = this.origin.x; const y1 = this.origin.y; const x2 = this.origin.x + this.direction.x * this.length; const y2 = this.origin.y + this.direction.y * this.length; //const x2 = mouseX; //const y2 = mouseY; const x3 = wall.a.x; const y3 = wall.a.y; const x4 = wall.b.x; const y4 = wall.b.y; const den = ((x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)); if (den == 0) { return; } const t = ((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)) / den; const u = -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3)) / den; if (t >= 0 && t <= 1 && u >= 0 && u <= 1) { this.hit++; this.intersections.push(createVector(x1 + t * (x2 - x1), y1 + t * (y2 - y1))); } this.distance = Infinity; if (this.intersections && this.intersections.length) { if (this.hit) { for (let i = 0; i < this.intersections.length; i++) { if (p5.Vector.dist(createVector(x1, y1), this.intersections[i]) < this.distance) { this.closestIntersection = this.intersections[i]; this.distance = p5.Vector.dist(createVector(x1, y1), this.intersections[i]) } } } } } else { if (this.hit >= 1) return this.distance; else return null; } } } function distanceFromVectors(v1, v2) { //var distance = abs(v1.x - v2.x) + abs(v1.y - v2.y) var distance = sqrt(sq(v1.x - v2.x) + sq(v1.y - v2.y)); return distance; }