summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulie Lala <jules@okfoc.us>2014-11-01 20:59:43 -0400
committerJulie Lala <jules@okfoc.us>2014-11-01 20:59:43 -0400
commit17ed9ecb646ea063b1484c484877e11c42ebabb6 (patch)
tree80d36b3ba59112bef022fab11e51d39524e9089b
parent4aeefb7b2ba7065f98702eaebe317a19d764d22d (diff)
handle pushing against wall
-rw-r--r--public/assets/test/intersect3.html60
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 = "&nbsp;" + (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)