diff options
| author | Julie Lala <jules@okfoc.us> | 2014-11-01 20:59:43 -0400 |
|---|---|---|
| committer | Julie Lala <jules@okfoc.us> | 2014-11-01 20:59:43 -0400 |
| commit | 17ed9ecb646ea063b1484c484877e11c42ebabb6 (patch) | |
| tree | 80d36b3ba59112bef022fab11e51d39524e9089b | |
| parent | 4aeefb7b2ba7065f98702eaebe317a19d764d22d (diff) | |
handle pushing against wall
| -rw-r--r-- | public/assets/test/intersect3.html | 60 |
1 files changed, 43 insertions, 17 deletions
diff --git a/public/assets/test/intersect3.html b/public/assets/test/intersect3.html index b916f5f..040dca4 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( new vec2(564, 203), new vec2(734, 372) ) +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 ] @@ -114,7 +114,7 @@ function draw () { points.forEach(drawPoint) drawLine(cursor.x, cursor.y, "#f00") - hud.innerHTML = "" +// hud.innerHTML = "" var closest_intersect, cursor_copy = new Rect(0,0,0,0), t, min_t = 1 var cursor_copy = cursor.plus(scene.camera.radius) @@ -188,7 +188,6 @@ function draw () { if (closest_intersect) { var a = angle(closest_wall) - var ac = angle(cursor_copy) wall_vec.assign(closest_wall) wall_vec.x.a -= scene.camera.radius * sin(a) wall_vec.x.b += scene.camera.radius * cos(a) @@ -197,27 +196,45 @@ function draw () { drawLine(wall_vec.x, wall_vec.y, "rgba(0,255,255,1.0)") - var new_t = perp(origins, wall_vec) / ( perp(cursor_copy, wall_vec) || 0.0000001 ) + 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_copy.x.a + ( cursor_copy.y.a - cursor_copy.x.a ) * new_t - closest_intersect2.b = cursor_copy.x.b + ( cursor_copy.y.b - cursor_copy.x.b ) * new_t + 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 = (1-min_t) * sqrt(dot(cursor, cursor)) - if (max(a,ac)-min(a,ac) > PI/2) { - a += PI - } - var end_of_ray = closest_intersect2.clone() + var len = sqrt(dot(wall_vec, wall_vec)) - end_of_ray.a += len * cos(a) - end_of_ray.b += len * sin(a) + // 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)) + 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) 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 @@ -228,7 +245,10 @@ 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) @@ -239,15 +259,21 @@ function angle (va) { 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) } -function norm(va) { - return c -} function is_collinear (p, vec) { var on_x, on_y var pa = round(p.a), pb = round(p.b) |
