summaryrefslogtreecommitdiff
path: root/public/assets/test/intersect3.html
diff options
context:
space:
mode:
Diffstat (limited to 'public/assets/test/intersect3.html')
-rw-r--r--public/assets/test/intersect3.html164
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 += "__&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)
+
+ 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()