@@ -8,16 +8,28 @@ export default function(circles) {
8
8
export function packEncloseRandom ( circles , random ) {
9
9
var i = 0 , n = ( circles = shuffle ( Array . from ( circles ) , random ) ) . length , B = [ ] , p , e ;
10
10
11
+ var minX = Number . MAX_VALUE , minY = Number . MAX_VALUE ;
12
+ var maxX = Number . MIN_VALUE , maxY = Number . MIN_VALUE ;
13
+ for ( var k = 0 ; k < n ; ++ k ) {
14
+ var c = circles [ k ] ;
15
+ minX = Math . min ( minX , c . x - c . r ) ;
16
+ minY = Math . min ( minY , c . y - c . r ) ;
17
+ maxX = Math . max ( maxX , c . x + c . r ) ;
18
+ maxY = Math . max ( maxY , c . y + c . r ) ;
19
+ }
20
+
21
+ var cx = ( minX + maxX ) / 2 , cy = ( minY + maxY ) / 2 ;
22
+
11
23
while ( i < n ) {
12
24
p = circles [ i ] ;
13
25
if ( e && enclosesWeak ( e , p ) ) ++ i ;
14
- else e = encloseBasis ( B = extendBasis ( B , p ) ) , i = 0 ;
26
+ else e = encloseBasis ( B = extendBasis ( B , p , cx , cy ) , cx , cy ) , i = 0 ;
15
27
}
16
28
17
29
return e ;
18
30
}
19
31
20
- function extendBasis ( B , p ) {
32
+ function extendBasis ( B , p , cx , cy ) {
21
33
var i , j ;
22
34
23
35
if ( enclosesWeakAll ( p , B ) ) return [ p ] ;
@@ -36,7 +48,7 @@ function extendBasis(B, p) {
36
48
if ( enclosesNot ( encloseBasis2 ( B [ i ] , B [ j ] ) , p )
37
49
&& enclosesNot ( encloseBasis2 ( B [ i ] , p ) , B [ j ] )
38
50
&& enclosesNot ( encloseBasis2 ( B [ j ] , p ) , B [ i ] )
39
- && enclosesWeakAll ( encloseBasis3 ( B [ i ] , B [ j ] , p ) , B ) ) {
51
+ && enclosesWeakAll ( encloseBasis3 ( B [ i ] , B [ j ] , p , cx , cy ) , B ) ) {
40
52
return [ B [ i ] , B [ j ] , p ] ;
41
53
}
42
54
}
@@ -65,11 +77,11 @@ function enclosesWeakAll(a, B) {
65
77
return true ;
66
78
}
67
79
68
- function encloseBasis ( B ) {
80
+ function encloseBasis ( B , cx , cy ) {
69
81
switch ( B . length ) {
70
82
case 1 : return encloseBasis1 ( B [ 0 ] ) ;
71
83
case 2 : return encloseBasis2 ( B [ 0 ] , B [ 1 ] ) ;
72
- case 3 : return encloseBasis3 ( B [ 0 ] , B [ 1 ] , B [ 2 ] ) ;
84
+ case 3 : return encloseBasis3 ( B [ 0 ] , B [ 1 ] , B [ 2 ] , cx , cy ) ;
73
85
}
74
86
}
75
87
@@ -93,10 +105,10 @@ function encloseBasis2(a, b) {
93
105
} ;
94
106
}
95
107
96
- function encloseBasis3 ( a , b , c ) {
97
- var x1 = a . x , y1 = a . y , r1 = a . r ,
98
- x2 = b . x , y2 = b . y , r2 = b . r ,
99
- x3 = c . x , y3 = c . y , r3 = c . r ,
108
+ function encloseBasis3 ( a , b , c , cx , cy ) {
109
+ var x1 = a . x - cx , y1 = a . y - cy , r1 = a . r ,
110
+ x2 = b . x - cx , y2 = b . y - cy , r2 = b . r ,
111
+ x3 = c . x - cx , y3 = c . y - cy , r3 = c . r ,
100
112
a2 = x1 - x2 ,
101
113
a3 = x1 - x3 ,
102
114
b2 = y1 - y2 ,
@@ -116,8 +128,8 @@ function encloseBasis3(a, b, c) {
116
128
C = xa * xa + ya * ya - r1 * r1 ,
117
129
r = - ( Math . abs ( A ) > 1e-6 ? ( B + Math . sqrt ( B * B - 4 * A * C ) ) / ( 2 * A ) : C / B ) ;
118
130
return {
119
- x : x1 + xa + xb * r ,
120
- y : y1 + ya + yb * r ,
131
+ x : cx + x1 + xa + xb * r ,
132
+ y : cy + y1 + ya + yb * r ,
121
133
r : r
122
134
} ;
123
135
}
0 commit comments