diff options
Diffstat (limited to 'assets/javascripts/rectangles/clipper.js')
| -rw-r--r-- | assets/javascripts/rectangles/clipper.js | 104 |
1 files changed, 53 insertions, 51 deletions
diff --git a/assets/javascripts/rectangles/clipper.js b/assets/javascripts/rectangles/clipper.js index 6e5b93c..c606c8e 100644 --- a/assets/javascripts/rectangles/clipper.js +++ b/assets/javascripts/rectangles/clipper.js @@ -9,12 +9,18 @@ var clipper = new function(){ var regions = [] document.querySelector("#map").appendChild(canvas) + var rooms = base.rooms = [] + + base.creating = false + base.dragging = false + + var modified = true + base.mouse = new rect(0,0,0,0) + base.init = function (){ - bind() - animate() + base.bind() } - function animate(){ - requestAnimationFrame(animate) + base.animate = function(){ clear_canvas() if (modified) { @@ -23,29 +29,27 @@ var clipper = new function(){ } draw_ruler() draw_regions(base.regions) - draw_mouse(mouse) - z = false + draw_mouse(base.mouse) + modified = z = false } - - var rects = base.rects = [] - - this.creating = false - this.dragging = false - - var modified = true - var mouse = new rect(0,0,0,0) - - function bind(){ + base.add_room = function(r){ + rooms.push( new room({ + id: rooms.length, + rect: r, + }) ) + } + base.bind = function(){ canvas.addEventListener("mousedown", function(e){ e.stopPropagation() var x = e.pageX, y = e.pageY - mouse = new rect (x,y) + base.mouse = new rect (x,y) if (e.shiftKey) { - mouse.quantize(10) + base.mouse.quantize(10) } - var intersects = rects.filter(function(r){ return r.focused = r.contains(x,y) }) - // console.log(intersects) + var intersects = rooms.filter(function(r){ + return r.focused = r.rect.contains(x,y) + }) if (intersects.length){ clipper.dragging = intersects[0] @@ -54,7 +58,7 @@ var clipper = new function(){ clipper.creating = true } if (e.shiftKey && clipper.dragging) { - clipper.dragging.quantize(10) + clipper.dragging.rect.quantize(10) } }) canvas.addEventListener("mousemove", function(e){ @@ -69,66 +73,67 @@ var clipper = new function(){ y = e.pageY } - mouse.x.b = x - mouse.y.b = y + base.mouse.x.b = x + base.mouse.y.b = y if (clipper.dragging) { - clipper.dragging.translation.a = mouse.x.magnitude() - clipper.dragging.translation.b = mouse.y.magnitude() + clipper.dragging.rect.translation.a = base.mouse.x.magnitude() + clipper.dragging.rect.translation.b = base.mouse.y.magnitude() } else if (clipper.creating) { - mouse.x.b = x - mouse.y.b = y + base.mouse.x.b = x + base.mouse.y.b = y } else { - mouse.x.a = mouse.x.b - mouse.y.a = mouse.y.b + base.mouse.x.a = base.mouse.x.b + base.mouse.y.a = base.mouse.y.b } }) document.addEventListener("mouseup", function(e){ e.stopPropagation() if (clipper.creating) { - if (mouse.height() != 0 && mouse.width() != 0) { - rects.push(mouse.translate()) + if (base.mouse.height() != 0 && base.mouse.width() != 0) { + base.add_room( base.mouse.translate() ) } } if (clipper.dragging) { - clipper.dragging.translate() + clipper.dragging.rect.translate() } - mouse = new rect(e.pageX, e.pageY) + base.mouse = new rect(e.pageX, e.pageY) clipper.creating = clipper.dragging = false modified = true }) } function solve_rects(){ - var rects = sort_rects_by_position(base.rects) + var rooms = sort_rooms_by_position( base.rooms ) - for (var i = 0; i < rects.length; i++) { - rects[i].id = i - rects[i].reset() + for (var i = 0; i < rooms.length; i++) { + rooms[i].id = i + rooms[i].reset() } var regions = [] var left, right - for (var i = 0; i < rects.length; i++) { - left = rects[i] - for (var j = i+1; j < rects.length; j++) { - right = rects[j] - if (left.intersects(right)) { - left.clipTo(right) - right.clipTo(left) + for (var i = 0; i < rooms.length; i++) { + left = rooms[i] + for (var j = i+1; j < rooms.length; j++) { + right = rooms[j] + if (left.rect.intersects(right.rect)) { + left.clipTo(right.rect) + right.clipTo(left.rect) } - if (left.x.b < right.x.a) { + if (left.rect.x.b < right.rect.x.a) { break } } } - for (var i = 0; i < rects.length; i++) { - regions = regions.concat(rects[i].regions) + for (var i = 0; i < rooms.length; i++) { + rooms[i].regions = rooms[i].regions.filter(function(r){ return !!r }) + regions = regions.concat(rooms[i].regions) } - regions = sort_rects_by_area( regions.filter(function(r){ return !!r }) ) + regions = sort_rects_by_area( regions ) var ty = new tree (regions[0].y.a, [regions[0]]) var tx = new tree (regions[0].x.a, ty) @@ -162,9 +167,6 @@ var clipper = new function(){ } base.regions = sort_rects_by_position(regions) - - modified = false - // document.getElementById("intersects").innerHTML = sort_rects_by_position(regions).join("<br>") } // generate floor and ceiling for some regions |
