1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
var clipper = new function(){
var base = this
var rooms = base.rooms = []
var regions = base.regions = []
var modified = true
base.init = function(){
base.bind()
base.update()
}
base.bind = function(){
map.ui.mouse.tube.on("up", function(){ base.update() })
}
base.update = function(){
clipper.solve_rects()
builder.tube("clip")
}
base.add_room = function(r){
rooms.push( new room({
id: base.rooms.length,
rect: r,
height: quantize(randrange(200,500), 50),
}) )
}
base.solve_rects = function(){
if (base.rooms.length == 0) return;
for (var i = 0; i < base.rooms.length; i++) {
base.rooms[i].reset()
}
var rooms = sort_rooms_by_position( base.rooms )
var regions = []
var left, right
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)
left.intersects.push(right)
right.intersects.push(left)
}
if (left.rect.x.b < right.rect.x.a) {
break
}
}
}
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 )
var ty = new tree (regions[0].y.a, [regions[0]])
var tx = new tree (regions[0].x.a, ty)
var ttx, tty
for (var i = 1; i < regions.length; i++) {
ttx = tx.add (regions[i].x.a, null)
if (ttx.data) {
tty = ttx.data.add (regions[i].y.a, null)
// duplicate polygon?
if (tty.data) {
tty.data.forEach(function(yy, ii){
if (yy.intersects(regions[i])) {
if (yy.area() > regions[i].area()) {
regions[i].dupe = true
}
else {
yy.dupe = true
tty.data[ii] = regions[i]
}
}
})
}
else {
tty.data = [regions[i]]
}
}
else {
ttx.data = new tree (regions[i].y.a, [regions[i]])
}
}
base.regions = sort_rects_by_position(regions)
}
// generate floor and ceiling for some regions
// generate walls from surviving regions
// generate ceiling-walls where ceiling has discontinuity
return base
}
|