var RegionList = (function(){ var RegionList = {} var regions = RegionList.regions RegionList.build = function(){ var segments = RegionList.getSortedSegments() var rooms = [] var seen_rooms = {} var open_segments = [] var closed_segments = [] var segment, open_segment, x_segment, y_segments, overlapped, seen_segments for (var i = 0; i < segments.length; i++) { segment = segments[i] if (! segment.isVertical()) { continue } overlapped = false for (var j = 0; j < open_segments.length; j++) { open_segment = open_segments[j] if (segment.y.overlaps(open_segment.y)) { overlapped = true closed_segments.push(open_segments[j]) open_segments.splice(j--, 1) x_segment = new vec2( open_segment.x.a, segment.x.b ) y_segments = open_segment.y.split(segment.y, 0, 0) seen_segments = {} y_segments.forEach(function(seg){ seen_segments[ seg[0]+"" ] = true var room = new Rect( x_segment, seg[0] ) if (seen_rooms[ room+"" ]) return seen_rooms[ room+"" ] = true room.sides = 0 rooms.push(room) var new_seg = new Rect( segment.x, seg[0] ) open_segments.unshift(new_seg) j++ }) y_segments = segment.y.split(open_segment.y, TOP, BOTTOM) y_segments.forEach(function(seg){ if (seen_segments[ seg[0]+"" ]) return; var new_seg = new Rect( segment.x, seg[0] ) open_segments.unshift(new_seg) j++ }) } } if (overlapped) { open_segments = open_segments.sort(function(a,b){ if (a.y.a < b.y.a) { return -1 } if (a.y.a == b.y.a) { return 0 } if (a.y.a > b.y.a) { return 1 } }) if (open_segments.length < 2) { continue } for (var k = 1; k < open_segments.length; k++) { if (open_segments[k-1].y.containsVec(open_segments[k].y)) { open_segments.splice(k--, 1) } else if (open_segments[k-1].y.overlaps(open_segments[k].y)) { open_segments[k].y = open_segments[k].y.clone() open_segments[k].y.a = open_segments[k-1].y.b } } } else { open_segments.push(segment) } } var splits, splitter for (var i = 0; i < segments.length; i++) { segment = segments[i] var horizontal = segment.isHorizontal(), vertical = segment.isVertical() for (var r = 0; r < rooms.length; r++){ room = rooms[r] if (vertical) { if (segment.y.containsVec(room.y)) { if (segment.x.a == room.x.a) { room.sides |= LEFT } if (segment.x.a == room.x.b) { room.sides |= RIGHT } } } if (horizontal) { if (segment.x.containsVec(room.x)) { if (segment.y.a == room.y.a) { room.sides |= FRONT } if (segment.y.a == room.y.b) { room.sides |= BACK } } else if (segment.y.a == room.y.a || segment.y.a == room.y.b) { if (room.x.overlaps(segment.x)) { splits = room.x.split(segment.x, room.sides & LEFT, room.sides & RIGHT) rooms.splice(r--, 1) console.log(splits) for (var k = 0; k < splits.length; k++) { splitter = splits[k] var new_room = new Rect( splitter[0], room.y ) new_room.sides = 0 new_room.sides |= splitter[1] | ( room.sides & FRONT_BACK ) if (segment.x.overlaps( splitter[0] )) { if (segment.y.a == new_room.y.a) { new_room.sides |= FRONT } if (segment.y.a == new_room.y.b) { new_room.sides |= BACK } } rooms.unshift(new_room) r++ } } } } } } return { rooms: rooms } } RegionList.getSortedSegments = function(){ // get a list of all segments from these polylines var segments = shapes.getAllSegments() // re-orient them so they're either facing up or right and make them into rects segments = segments.map(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()) } } return new Rect( segment[0].a, segment[0].b, segment[1].a, segment[1].b ) }) return sort.rects_by_position(segments) } return RegionList })()