summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rect.js65
-rw-r--r--rectangles.html43
-rw-r--r--vec2.js2
3 files changed, 87 insertions, 23 deletions
diff --git a/rect.js b/rect.js
index f643b6f..19e69b7 100644
--- a/rect.js
+++ b/rect.js
@@ -23,8 +23,8 @@ rect.prototype.area = function(){
return this.x.length() * this.y.length()
}
rect.prototype.normalize = function(){
- this.x.normalize().add(this.translation.a)
- this.y.normalize().add(this.translation.b)
+ this.x.abs().add(this.translation.a)
+ this.y.abs().add(this.translation.b)
this.translation.a = this.translation.b = 0
return this
}
@@ -65,26 +65,69 @@ rect.prototype.reset = function(){
}
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)) {
- var splits = regions[i].split(r)
- regions.concat(splits)
+ splits = regions[i].split(r)
+ regions = regions.concat(splits)
regions[i] = null
}
}
+ this.regions = regions
}
rect.prototype.split = function(r){
var splits = []
+ var x_intervals = [], y_intervals = []
+ // Split vertically
+ if (this.x.contains(r.x.a) && r.x.contains(this.x.b)) {
+ x_intervals.push( new vec2( this.x.a, r.x.a ))
+ x_intervals.push( new vec2( r.x.a, this.x.b ))
+ }
+
+ else if (r.x.contains(this.x.a) && this.x.contains(r.x.b)) {
+ x_intervals.push( new vec2( this.x.a, r.x.b ))
+ x_intervals.push( new vec2( r.x.b, this.x.b ))
+ }
+ else if (this.x.contains(r.x.a) && this.x.contains(r.x.b)) {
+ x_intervals.push( new vec2( this.x.a, r.x.a ))
+ x_intervals.push( new vec2( r.x.a, r.x.b ))
+ x_intervals.push( new vec2( r.x.b, this.x.b ))
+ }
+
+ else if (r.x.contains(this.x.a) && r.x.contains(r.x.b)) {
+ x_intervals.push( new vec2( this.x.a, this.x.b ))
+ }
+
+
+ // Split horizontally
+ if (this.y.contains(r.y.a) && r.y.contains(this.y.b)) {
+ y_intervals.push( new vec2( this.y.a, r.y.a ))
+ y_intervals.push( new vec2( r.y.a, this.y.b ))
+ }
+
+ else if (r.y.contains(this.y.a) && this.y.contains(r.y.b)) {
+ y_intervals.push( new vec2( this.y.a, r.y.b ))
+ y_intervals.push( new vec2( r.y.b, this.y.b ))
+ }
+
+ else if (this.y.contains(r.y.a) && this.y.contains(r.y.b)) {
+ y_intervals.push( new vec2( this.y.a, r.y.a ))
+ y_intervals.push( new vec2( r.y.a, r.y.b ))
+ y_intervals.push( new vec2( r.y.b, this.y.b ))
+ }
+
+ else if (r.y.contains(this.y.a) && this.y.contains(r.y.b)) {
+ y_intervals.push( new vec2( this.y.a, this.y.b ))
+ }
- // 1 split (horizontal)
- // 1 split (vertical)
- // 2 splits (top left)
- // 2 splits (top right)
- // 2 splits (bottom left)
- // 2 splits (bottom right)
- // 3 splits (center)
+ x_intervals.forEach(function(x){
+ y_intervals.forEach(function(y){
+ splits.push(new rect(x,y))
+ })
+ })
return splits
}
diff --git a/rectangles.html b/rectangles.html
index 882b862..0c054d5 100644
--- a/rectangles.html
+++ b/rectangles.html
@@ -134,32 +134,53 @@ function line (x,y,a,b,translation){
function solve_rects(){
rects = sort_rects()
+
+ for (var i = 0; i < rects.length; i++) {
+ rects[i].reset()
+ }
regions = []
- var x_intervals = []
- var y_intervals = []
+
var left, right
for (var i = 0; i < rects.length; i++) {
left = rects[i]
- for (var j = 0; j < rects.length; j++) {
+ for (var j = i+1; j < rects.length; j++) {
right = rects[j]
if (left.intersects(right)) {
-// left.clipTo(right)
-// right.clipTo(left)
+ left.clipTo(right)
+ right.clipTo(left)
}
if (left.x.b < right.x.a) {
break
}
}
}
-// for (var i = 0; i < rects.length; i++) {
-// regions.concat(rect[i].regions)
-// }
+ for (var i = 0; i < rects.length; i++) {
+ regions = regions.concat(rects[i].regions)
+ }
// handle when two walls are coplanar
// generate floor and ceiling for some regions
// generate walls from surviving regions
// generate ceiling-walls where ceiling has discontinuity
-
- document.getElementById("intersects").innerHTML = rects.join("<br>")
+
+ document.getElementById("intersects").innerHTML = regions.join("<br>")
+
+ var colors = [
+ "rgba(255,0,0,0.5)",
+ "rgba(255,128,0,0.5)",
+ "rgba(128,255,0,0.5)",
+ "rgba(0,255,0,0.5)",
+ "rgba(0,255,128,0.5)",
+ "rgba(0,128,255,0.5)",
+ "rgba(0,0,255,0.5)",
+ "rgba(128,0,255,0.5)",
+ "rgba(255,0,255,0.5)",
+ "rgba(255,0,128,0.5)",
+ ]
+ regions = regions.filter(function(r){ return !!r })
+ for (var i = 0; i < regions.length; i++) {
+ ctx.fillStyle = colors[i % colors.length]
+ regions[i] && regions[i].fill()
+ }
}
function sort_rects(){
return rects.sort(function(a,b){
@@ -188,7 +209,7 @@ function draw_rects(){
for (var i = 0; i < rects.length; i++) {
ctx.fillStyle = "rgba(0,200,220,0.2)"
- rects[i].fill()
+// rects[i].fill()
// line(rect.x, 0, rect.x, rect.y)
// line(0, rect.y, rect.x, rect.y)
}
diff --git a/vec2.js b/vec2.js
index 8bc8410..973613f 100644
--- a/vec2.js
+++ b/vec2.js
@@ -43,7 +43,7 @@ vec2.prototype.contains = function(n){
}
// assumes (vec2)v falls to the right of (vec2)this
vec2.prototype.intersects = function(v){
- return (this.b > v.a) || (v.b > this.a)
+ return (this.b > v.a && this.b < v.b) || (v.b > this.a && v.b < this.b)
}
vec2.prototype.union = function(v){
if (this.intersects(v)) {