var RegionList = (function(){ var RegionList = {} var regions = RegionList.regions RegionList.build = function(){ var segments = RegionList.getSortedSegments() // loop over them from left to right // console.log(segments.map(function(s){ return s.toString() }).join("\n")) var rooms = [] var open_segments = [] var segment, open_segment, vertical, other_side for (var i = 0; i < segments.length; i++) { segment = segments[i] if (! isVertical(segment)) { continue } for (var j = 0; j < open_segments.length; j++) { open_segment = open_segments[j] if (overlaps(segment, open_segment)) { // if we have overlap, it means we have made a full room other_side = clone_segment(open_segment) other_side[0].a = segment[0].a other_side[1].a = segment[1].a rooms.push([open_segment, other_side]) open_segments.splice(j, 1) j-- } } open_segments.push(segment) } // console.log(rooms.map(function(s){ return s[0][0].toString() + " " + s[0][1].toString() + " " + s[1][0].toString() + " " + s[1][1].toString() }).join("\n")) return rooms } RegionList.getSortedSegments = function(){ // get a list of all segments from these polylines var segments = shapes.getAllSegments() // re-orientate them so they're either facing up or right segments.forEach(function(segment){ // vertical if (segment[0].a == segment[1].a) { if (segment[0].b > segment[1].b) { segment.push(segment.shift()) } } // horizontal else if (segment[0].b == segment[1].b) { if (segment[0].a > segment[1].a) { segment.push(segment.shift()) } } }) // sort them from top to bottom, left to right segments = segments.sort(function(a,b){ if (a[0].a < b[0].a) { return -1 } else if (a[0].a == b[0].a) { if (a[0].b < b[0].b) { return -1 } else if (a[0].b == b[0].b) { return 0 } else { return 1 } } else { return 1 } }) return segments } function isVertical (segment) { return segment[0].a == segment[1].a } function isHorizontal (segment) { return segment[0].b == segment[1].b } function overlaps (a,b) { return (a[0].b > b[0].b || a[1].b < b[1].b) } function clone_segment(a){ return [a[0].clone(), a[1].clone()] } return RegionList })()