@@ -98,7 +98,7 @@ function d3_geo_circleClip(degrees, rotate) {
9898 // handle degeneracies
9999 if ( v !== v0 ) {
100100 point2 = intersect ( point0 , point1 ) ;
101- if ( d3_geo_circlePointsEqual ( point0 , point2 ) || d3_geo_circlePointsEqual ( point1 , point2 ) ) {
101+ if ( d3_geo_sphericalEqual ( point0 , point2 ) || d3_geo_sphericalEqual ( point1 , point2 ) ) {
102102 point1 [ 0 ] += ε ;
103103 point1 [ 1 ] += ε ;
104104 v = visible ( point1 ) ;
@@ -125,7 +125,7 @@ function d3_geo_circleClip(degrees, rotate) {
125125 x0 = x ;
126126 y0 = y ;
127127 }
128- if ( v && ! d3_geo_circlePointsEqual ( point0 , point1 ) ) context . lineTo ( point1 [ 0 ] , point1 [ 1 ] ) ;
128+ if ( v && ! d3_geo_sphericalEqual ( point0 , point1 ) ) context . lineTo ( point1 [ 0 ] , point1 [ 1 ] ) ;
129129 point0 = point1 ;
130130 }
131131 return [
@@ -137,32 +137,32 @@ function d3_geo_circleClip(degrees, rotate) {
137137 // Intersects the great circle between a and b with the clip circle.
138138 // TODO special case: clipAngle(90°); avoid conversion ↔ Cartesian 3-space.
139139 function intersect ( a , b ) {
140- var pa = d3_geo_circleCartesian ( a , [ 0 , 0 , 0 ] ) ,
141- pb = d3_geo_circleCartesian ( b , [ 0 , 0 , 0 ] ) ;
140+ var pa = d3_geo_cartesian ( a , 0 ) ,
141+ pb = d3_geo_cartesian ( b , 0 ) ;
142142 // We have two planes, n1.p = d1 and n2.p = d2.
143143 // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 x n2).
144144 var n1 = [ 1 , 0 , 0 ] , // normal
145- n2 = d3_geo_circleCross ( pa , pb ) ,
146- n2n2 = d3_geo_circleDot ( n2 , n2 ) ,
147- n1n2 = n2 [ 0 ] , // d3_geo_circleDot (n1, n2),
145+ n2 = d3_geo_cartesianCross ( pa , pb ) ,
146+ n2n2 = d3_geo_cartesianDot ( n2 , n2 ) ,
147+ n1n2 = n2 [ 0 ] , // d3_geo_cartesianDot (n1, n2),
148148 determinant = n2n2 - n1n2 * n1n2 ;
149149 // Two polar points.
150150 if ( ! determinant ) return a ;
151151
152152 var c1 = cr * n2n2 / determinant ,
153153 c2 = - cr * n1n2 / determinant ,
154- n1xn2 = d3_geo_circleCross ( n1 , n2 ) ,
155- A = d3_geo_circleScale ( n1 , c1 ) ,
156- B = d3_geo_circleScale ( n2 , c2 ) ;
157- d3_geo_circleAdd ( A , B ) ;
154+ n1xn2 = d3_geo_cartesianCross ( n1 , n2 ) ,
155+ A = d3_geo_cartesianScale ( n1 , c1 ) ,
156+ B = d3_geo_cartesianScale ( n2 , c2 ) ;
157+ d3_geo_cartesianAdd ( A , B ) ;
158158 // Now solve |p(t)|^2 = 1.
159159 var u = n1xn2 ,
160- w = d3_geo_circleDot ( A , u ) ,
161- uu = d3_geo_circleDot ( u , u ) ,
162- t = Math . sqrt ( w * w - uu * ( d3_geo_circleDot ( A , A ) - 1 ) ) ,
163- q = d3_geo_circleScale ( u , ( - w - t ) / uu ) ;
164- d3_geo_circleAdd ( q , A ) ;
165- return d3_geo_circleSpherical ( q ) ;
160+ w = d3_geo_cartesianDot ( A , u ) ,
161+ uu = d3_geo_cartesianDot ( u , u ) ,
162+ t = Math . sqrt ( w * w - uu * ( d3_geo_cartesianDot ( A , A ) - 1 ) ) ,
163+ q = d3_geo_cartesianScale ( u , ( - w - t ) / uu ) ;
164+ d3_geo_cartesianAdd ( q , A ) ;
165+ return d3_geo_spherical ( q ) ;
166166 }
167167}
168168
@@ -181,7 +181,7 @@ function d3_geo_circleInterpolate(radians, precision) {
181181 for ( var step = direction * precision , t = from ; direction > 0 ? t > to : t < to ; t -= step ) {
182182 var c = Math . cos ( t ) ,
183183 s = Math . sin ( t ) ,
184- point = d3_geo_circleSpherical ( [
184+ point = d3_geo_spherical ( [
185185 cr ,
186186 - sr * c ,
187187 - sr * s
@@ -309,59 +309,12 @@ function d3_geo_circleClipSort(a, b) {
309309
310310// Signed angle of a cartesian point relative to [0, 0, 0].
311311function d3_geo_circleAngle ( cr , point ) {
312- var a = d3_geo_circleCartesian ( point , [ cr , 0 , 0 ] ) ;
313- d3_geo_circleNormalize ( a ) ;
312+ var a = d3_geo_cartesian ( point , cr ) ;
313+ d3_geo_cartesianNormalize ( a ) ;
314314 var angle = Math . acos ( Math . max ( - 1 , Math . min ( 1 , - a [ 1 ] ) ) ) ;
315315 return ( ( - a [ 2 ] < 0 ? - angle : angle ) + 2 * Math . PI - ε ) % ( 2 * Math . PI ) ;
316316}
317317
318- // Convert spherical to normalized Cartesian coordinates, relative to a
319- // Cartesian origin.
320- function d3_geo_circleCartesian ( point , origin ) {
321- var p0 = point [ 0 ] ,
322- p1 = point [ 1 ] ,
323- c1 = Math . cos ( p1 ) ;
324- return [ c1 * Math . cos ( p0 ) - origin [ 0 ] ,
325- c1 * Math . sin ( p0 ) - origin [ 1 ] ,
326- Math . sin ( p1 ) - origin [ 2 ] ] ;
327- }
328-
329- // Convert from Cartesian to spherical coordinates.
330- function d3_geo_circleSpherical ( point ) {
331- return [
332- Math . atan2 ( point [ 1 ] , point [ 0 ] ) ,
333- Math . asin ( Math . max ( - 1 , Math . min ( 1 , point [ 2 ] ) ) )
334- ] ;
335- }
336-
337- function d3_geo_circleDot ( a , b ) {
338- return a [ 0 ] * b [ 0 ] + a [ 1 ] * b [ 1 ] + a [ 2 ] * b [ 2 ] ;
339- }
340-
341- function d3_geo_circleCross ( a , b ) {
342- return [
343- a [ 1 ] * b [ 2 ] - a [ 2 ] * b [ 1 ] ,
344- a [ 2 ] * b [ 0 ] - a [ 0 ] * b [ 2 ] ,
345- a [ 0 ] * b [ 1 ] - a [ 1 ] * b [ 0 ] ] ;
346- }
347-
348- function d3_geo_circleAdd ( a , b ) {
349- a [ 0 ] += b [ 0 ] ;
350- a [ 1 ] += b [ 1 ] ;
351- a [ 2 ] += b [ 2 ] ;
352- }
353-
354- function d3_geo_circleScale ( vector , s ) {
355- return [ vector [ 0 ] * s , vector [ 1 ] * s , vector [ 2 ] * s ] ;
356- }
357-
358- function d3_geo_circleNormalize ( d ) {
359- var l = Math . sqrt ( d [ 0 ] * d [ 0 ] + d [ 1 ] * d [ 1 ] + d [ 2 ] * d [ 2 ] ) ;
360- d [ 0 ] /= l ;
361- d [ 1 ] /= l ;
362- d [ 2 ] /= l ;
363- }
364-
365318function d3_geo_circleBufferSegments ( f ) {
366319 return function ( coordinates ) {
367320 var segments = [ ] ,
@@ -376,8 +329,6 @@ function d3_geo_circleBufferSegments(f) {
376329 } ;
377330}
378331
379- function d3_geo_circlePointsEqual ( a , b ) {
380- return Math . abs ( a [ 0 ] - b [ 0 ] ) < ε && Math . abs ( a [ 1 ] - b [ 1 ] ) < ε ;
332+ function d3_geo_circleSegmentLength1 ( segment ) {
333+ return segment . length > 1 ;
381334}
382-
383- function d3_geo_circleSegmentLength1 ( segment ) { return segment . length > 1 ; }
0 commit comments