diff options
| -rw-r--r-- | assets/javascripts/rectangles/_env.js | 9 | ||||
| -rw-r--r-- | assets/javascripts/rectangles/clipper.js | 104 | ||||
| -rw-r--r-- | assets/javascripts/rectangles/rect.js | 26 | ||||
| -rw-r--r-- | assets/javascripts/rectangles/room.js | 35 | ||||
| -rw-r--r-- | assets/javascripts/rectangles/sort.js | 36 | ||||
| -rw-r--r-- | assets/javascripts/rectangles/tree.js | 7 | ||||
| -rw-r--r-- | rectangles-mx.html | 1 | ||||
| -rw-r--r-- | rectangles.html | 1 |
8 files changed, 122 insertions, 97 deletions
diff --git a/assets/javascripts/rectangles/_env.js b/assets/javascripts/rectangles/_env.js index b70b333..a190385 100644 --- a/assets/javascripts/rectangles/_env.js +++ b/assets/javascripts/rectangles/_env.js @@ -9,15 +9,16 @@ environment.init = function(){ "rotationY": 0 // PI }) - clipper.rects.push( new rect(100,100, 200,300) ) - clipper.rects.push( new rect(200,300, 300,500) ) + clipper.add_room( new rect(100,100, 200,300) ) + clipper.add_room( new rect(200,300, 300,500) ) - clipper.rects.push( new rect(300,100, 600,300) ) - clipper.rects.push( new rect(400,200, 700,400) ) + clipper.add_room( new rect(300,100, 600,300) ) + clipper.add_room( new rect(400,200, 700,400) ) builder.init() clipper.init() window.scene && scene.update() } environment.update = function(t){ + clipper.animate() } 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 diff --git a/assets/javascripts/rectangles/rect.js b/assets/javascripts/rectangles/rect.js index 1d402cd..50debbc 100644 --- a/assets/javascripts/rectangles/rect.js +++ b/assets/javascripts/rectangles/rect.js @@ -16,8 +16,6 @@ window.rect = (function(){ } this.translation = new vec2(0,0) this.sides = FRONT | BACK | LEFT | RIGHT - this.focused = false - this.id = 0 } rect.prototype.clone = function(){ return new rect( this.x.clone(), this.y.clone() ) @@ -48,35 +46,13 @@ window.rect = (function(){ if (this.sides & BACK) sides += "back " if (this.sides & LEFT) sides += "left " if (this.sides & RIGHT) sides += "right " - var s = this.id + " " + "[" + this.x.toString() + " " + this.y.toString() + "] " + sides - if (this.focused) return "<b>" + s + "</b>" + var s = "[" + this.x.toString() + " " + this.y.toString() + "] " + sides return s } rect.prototype.quantize = function(n){ this.x.quantize(n) this.y.quantize(n) } - rect.prototype.reset = function(){ - var copy = this.clone() - copy.sides = FRONT | BACK | LEFT | RIGHT - copy.focused = this.focused - copy.id = this.id - this.regions = [ copy ] - } - rect.prototype.clipTo = function(r){ - // for each of this rect's regions split the region if necessary - var regions = this.regions - var splits - - for (var i = 0, len = regions.length; i < len; i++) { - if (regions[i] && regions[i].intersects(r)) { - splits = regions[i].split(r) - regions = regions.concat(splits) - regions[i] = null - } - } - this.regions = regions - } rect.prototype.split = function(r){ var rz = this var splits = [] diff --git a/assets/javascripts/rectangles/room.js b/assets/javascripts/rectangles/room.js index cc7af8f..795ef29 100644 --- a/assets/javascripts/rectangles/room.js +++ b/assets/javascripts/rectangles/room.js @@ -1,9 +1,38 @@ window.room = (function(){ - var room = function (x0,y0,x1,y1){ + var room = function(opt){ + this.id = opt.id + this.rect = opt.rect + this.regions = [] + this.height = 500 + this.focused = false } - - + room.prototype.toString = function(){ + return this.rect.toString() + } + + room.prototype.reset = function(){ + var copy = this.rect.clone() + copy.sides = FRONT | BACK | LEFT | RIGHT + this.regions = [ copy ] + } + + room.prototype.clipTo = function(r){ + // for each of this rect's regions split the region if necessary + var regions = this.regions + var splits + + for (var i = 0, len = regions.length; i < len; i++) { + if (regions[i] && regions[i].intersects(r)) { + splits = regions[i].split(r) + regions = regions.concat(splits) + regions[i] = null + } + } + this.regions = regions + } + + return room })() diff --git a/assets/javascripts/rectangles/sort.js b/assets/javascripts/rectangles/sort.js index 0d79af8..8ece95f 100644 --- a/assets/javascripts/rectangles/sort.js +++ b/assets/javascripts/rectangles/sort.js @@ -1,21 +1,29 @@ -function sort_rects_by_position(list){ +function sort_rooms_by_position(list){ return list.sort(function(a,b){ - if (a.x.a < b.x.a) { - return -1 - } - if (a.x.a > b.x.a) { - return 1 - } - if (a.y.a < b.y.a) { - return -1 - } - if (a.y.a > b.y.a) { - return 1 - } - return 0 + return compare_rect_position(a.rect, b.rect) }) } +function sort_rects_by_position(list){ + return list.sort(compare_rect_position) +} + +function compare_rect_position(a,b){ + if (a.x.a < b.x.a) { + return -1 + } + if (a.x.a > b.x.a) { + return 1 + } + if (a.y.a < b.y.a) { + return -1 + } + if (a.y.a > b.y.a) { + return 1 + } + return 0 +} + function sort_rects_by_area(list){ return list.map(function(r){ return [r.area(), r] }).sort(function(a,b){ if (a[0] < b[0]) { diff --git a/assets/javascripts/rectangles/tree.js b/assets/javascripts/rectangles/tree.js index f5eb117..577c41a 100644 --- a/assets/javascripts/rectangles/tree.js +++ b/assets/javascripts/rectangles/tree.js @@ -15,6 +15,13 @@ tree.prototype.add = function(n, data){ if (n < closest.value) return closest.lo = new tree(n, data) if (n > closest.value) return closest.hi = new tree(n, data) } +tree.prototype.toArray = function(){ + var a = [] + if (this.lo) a = a.concat(this.lo.toArray()) + a.push(this.data) + if (this.hi) a = a.concat(this.hi.toArray()) + return a +} tree.prototype.toString = function(){ var s = ""; if (this.lo) s += this.lo.toString() diff --git a/rectangles-mx.html b/rectangles-mx.html index e06534b..1a81a61 100644 --- a/rectangles-mx.html +++ b/rectangles-mx.html @@ -58,6 +58,7 @@ body > div { <script type="text/javascript" src="assets/javascripts/rectangles/colors.js"></script> <script type="text/javascript" src="assets/javascripts/rectangles/debug.js"></script> <script type="text/javascript" src="assets/javascripts/rectangles/tree.js"></script> +<script type="text/javascript" src="assets/javascripts/rectangles/room.js"></script> <script type="text/javascript" src="assets/javascripts/rectangles/rect.js"></script> <script type="text/javascript" src="assets/javascripts/rectangles/vec2.js"></script> <script type="text/javascript" src="assets/javascripts/rectangles/draw.js"></script> diff --git a/rectangles.html b/rectangles.html index 7d17ad7..b0c2436 100644 --- a/rectangles.html +++ b/rectangles.html @@ -56,6 +56,7 @@ body > div { <script type="text/javascript" src="assets/javascripts/rectangles/colors.js"></script> <script type="text/javascript" src="assets/javascripts/rectangles/debug.js"></script> <script type="text/javascript" src="assets/javascripts/rectangles/tree.js"></script> +<script type="text/javascript" src="assets/javascripts/rectangles/room.js"></script> <script type="text/javascript" src="assets/javascripts/rectangles/rect.js"></script> <script type="text/javascript" src="assets/javascripts/rectangles/vec2.js"></script> <script type="text/javascript" src="assets/javascripts/rectangles/draw.js"></script> |
