diff options
Diffstat (limited to 'public/assets/test/intersect3.html')
| -rw-r--r-- | public/assets/test/intersect3.html | 164 |
1 files changed, 126 insertions, 38 deletions
diff --git a/public/assets/test/intersect3.html b/public/assets/test/intersect3.html index 4fec891..5440a76 100644 --- a/public/assets/test/intersect3.html +++ b/public/assets/test/intersect3.html @@ -35,7 +35,7 @@ var scene = new MX.Scene() var w = canvas.width = window.innerWidth var h = canvas.height = window.innerHeight -var cursor = new Rect( 150, 250, 150, 250 ) +var cursor = new Rect( new vec2(400, 200), new vec2(800, 500) ) var wall_vec = new Rect ( 0, 0, 0, 0 ) var points = [ cursor.x, cursor.y ] @@ -67,10 +67,9 @@ Rooms.clipper.update() Rooms.builder.build() Rooms.grouper.build() -var r = 4 +var r = 6 var intersect = new vec2 () -var intersects = [] var dragging = false, dragging_a, dragging_b var delta = new vec2( 0, 0 ) @@ -102,7 +101,7 @@ var mymouse = new mouse({ }, }) -function draw () { +function draw (time) { ctx.fillStyle = "#fff" ctx.fillRect(0,0,w,h) @@ -115,28 +114,23 @@ function draw () { points.forEach(drawPoint) drawLine(cursor.x, cursor.y, "#f00") - hud.innerHTML = "" - intersects.length = 0 - +// hud.innerHTML = "" + var closest_intersect, t, min_t = 1 + var cursor_copy = cursor.extend_ends(scene.camera.radius) + + hud.innerHTML = cursor_copy.x + drawPoint(cursor_copy.x, "#ff0") + Walls.list.forEach(function(wall, i){ - if (wall.side & LEFT_RIGHT) { - wall_vec.x.a = wall.edge - wall_vec.x.b = wall.vec.a - wall_vec.y.a = wall.edge - wall_vec.y.b = wall.vec.b - } - else { - wall_vec.x.a = wall.vec.a - wall_vec.x.b = wall.edge - wall_vec.y.a = wall.vec.b - wall_vec.y.b = wall.edge - } - drawLine(wall_vec.x, wall_vec.y, "#888", true) - drawLine(origins.x, origins.y, "rgba(0,0,0,0.1)") + wall.get_points(wall_vec) + drawLine(wall_vec.x, wall_vec.y, "#088") - var t = perp(origins, wall_vec) / ( perp(cursor, wall_vec) || 0.0000001 ) - intersect.a = cursor.x.a + ( cursor.y.a - cursor.x.a ) * t - intersect.b = cursor.x.b + ( cursor.y.b - cursor.x.b ) * t + origins.x = cursor_copy.x + origins.y = wall_vec.x + + t = perp(origins, wall_vec) / ( perp(cursor_copy, wall_vec) || 0.0000001 ) + intersect.a = cursor_copy.x.a + ( cursor_copy.y.a - cursor_copy.x.a ) * t + intersect.b = cursor_copy.x.b + ( cursor_copy.y.b - cursor_copy.x.b ) * t var collinear = is_collinear( intersect, wall_vec ) var long_enough_to_intersect = 0 <= t && t <= 1 @@ -168,20 +162,72 @@ function draw () { } drawPoint(intersect) - if (intersecting_face) { - hud.innerHTML += intersecting_face.y.a + "<br>" - var clone = intersect.clone() - clone.t = t - intersects.push( clone ) + if (actually_intersects && t < min_t) { + min_t = t + closest_intersect = intersect.clone() + closest_wall = wall_vec.clone() } }) - if (intersects.length) { - // get the intersect with smallest T value - // get the angle of the cam/pos vector - // move the desired position to pos - 20px - // display this point + if (closest_intersect) { + var a = angle(closest_wall) + wall_vec.assign(closest_wall) + wall_vec.x.a -= scene.camera.radius * sin(a) + wall_vec.x.b += scene.camera.radius * cos(a) + wall_vec.y.a -= scene.camera.radius * sin(a) + wall_vec.y.b += scene.camera.radius * cos(a) + + drawLine(wall_vec.x, wall_vec.y, "rgba(0,255,255,1.0)") + + origins.x = cursor.x + origins.y = wall_vec.x + + var new_t = perp(origins, wall_vec) / ( perp(cursor, wall_vec) || 0.0000001 ) + var wall_t = perp(origins, cursor) / ( perp(wall_vec, cursor) || 0.0000001 ) + + var closest_intersect2 = new vec2 () + closest_intersect2.a = cursor.x.a + ( cursor.y.a - cursor.x.a ) * new_t + closest_intersect2.b = cursor.x.b + ( cursor.y.b - cursor.x.b ) * new_t + + ctx.fillStyle = "#0ff" + drawPoint(closest_intersect2) + drawLine(cursor.x, closest_intersect2, "#00f") + + var len = sqrt(dot(wall_vec, wall_vec)) + + // here compare len to the length of the wall in the direction we are travelling + var aw = angle(closest_wall) + var dd = dot2(diff(closest_wall), diff(cursor)) + +// hud.innerHTML += " " + dd + " " + round(deg(aw)) + if (dd > 0) { + len *= 1-abs(wall_t) + } + else { + len *= abs(wall_t) + aw += PI + } + + len = clamp(len, 0, (1-min_t) * sqrt(dot(cursor, cursor))) + +// hud.innerHTML = [ aw ].map(function(n){ return round(deg(n)) }) +// hud.innerHTML += "__ " + (dd > 0 ? "gt": "lt") + " " + round(len) + " " + (1-min_t) + " " + round((1-min_t)*sqrt(dot2(diff(cursor), diff(cursor)))) + + var end_of_ray = closest_intersect2.clone() + end_of_ray.a += len * cos(aw) + end_of_ray.b += len * sin(aw) + + wall_vec.normalize() + end_of_ray.a = clamp(end_of_ray.a, wall_vec.x.a, wall_vec.y.a) + end_of_ray.b = clamp(end_of_ray.b, wall_vec.x.b, wall_vec.y.b) + + drawPoint(end_of_ray) + drawLine(closest_intersect2, end_of_ray, "#00f") } + else { +// hud.innerHTML = [ (angle(cursor) + TWO_PI) % TWO_PI ].map(function(n){ return round(deg(n)) }) + } + } function drawLine (pa, pb, color, headless) { ctx.fillStyle = color @@ -192,11 +238,32 @@ function drawLine (pa, pb, color, headless) { var y2 = pb.b drawArrow(ctx, x1, y1, x2, y2, 3, headless ? 0 : 1) } -function drawPoint (p) { +function drawPoint (p, color) { + if (color) { + ctx.fillStyle = color + } var x = p.a - r var y = p.b - r ctx.fillRect(x, y, r*2, r*2) } +function angle (va) { + return atan2(va.y.b - va.x.b, va.y.a - va.x.a) +} +function angle2 (pa, pb) { + return atan2(pb.b - pa.b, pb.a - pa.a) +} +function normal (va) { + return atan2(va.x.a - va.y.a, va.y.b - va.x.b) +} +function dot (va, vb) { + return (va.y.a - va.x.a) * (vb.y.a - vb.x.a) + (va.y.b - va.x.b) * (vb.y.b - vb.x.b) +} +function diff (v) { + return new vec2(v.y.a - v.x.a, v.y.b - v.x.b) +} +function dot2 (pa, pb) { + return pa.a * pb.a + pa.b * pb.b +} function perp (va, vb) { return (va.y.a - va.x.a) * (vb.y.b - vb.x.b) - (va.y.b - va.x.b) * (vb.y.a - vb.x.a) } @@ -220,10 +287,31 @@ function is_collinear (p, vec) { return !! (on_x && on_y) } - -function animate(){ +cursor.extend_ends = function(n){ + var a = angle(this) + var clone = this.clone() + clone.x.a -= n*cos(a) + clone.x.b -= n*sin(a) + clone.y.a += n*cos(a) + clone.y.b += n*sin(a) + return clone +} +wall_vec.normalize = function(){ + var carry + if (this.x.a > this.y.a) { + carry = this.x.a + this.x.a = this.y.a + this.y.a = carry + } + if (this.x.b > this.y.b) { + carry = this.x.b + this.x.b = this.y.b + this.y.b = carry + } +} +function animate(time){ requestAnimationFrame(animate) - draw() + draw(time) } animate() |
