diff options
| -rw-r--r-- | rect.js | 65 | ||||
| -rw-r--r-- | rectangles.html | 43 | ||||
| -rw-r--r-- | vec2.js | 2 |
3 files changed, 87 insertions, 23 deletions
@@ -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) } @@ -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)) { |
