summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--assets/javascripts/rectangles/_env.js9
-rw-r--r--assets/javascripts/rectangles/clipper.js104
-rw-r--r--assets/javascripts/rectangles/rect.js26
-rw-r--r--assets/javascripts/rectangles/room.js35
-rw-r--r--assets/javascripts/rectangles/sort.js36
-rw-r--r--assets/javascripts/rectangles/tree.js7
-rw-r--r--rectangles-mx.html1
-rw-r--r--rectangles.html1
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>