| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 | 
							
- /*
 
- * Licensed to the Apache Software Foundation (ASF) under one
 
- * or more contributor license agreements.  See the NOTICE file
 
- * distributed with this work for additional information
 
- * regarding copyright ownership.  The ASF licenses this file
 
- * to you under the Apache License, Version 2.0 (the
 
- * "License"); you may not use this file except in compliance
 
- * with the License.  You may obtain a copy of the License at
 
- *
 
- *   http://www.apache.org/licenses/LICENSE-2.0
 
- *
 
- * Unless required by applicable law or agreed to in writing,
 
- * software distributed under the License is distributed on an
 
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 
- * KIND, either express or implied.  See the License for the
 
- * specific language governing permissions and limitations
 
- * under the License.
 
- */
 
- var _number = require("../../util/number");
 
- var parsePercent = _number.parsePercent;
 
- var linearMap = _number.linearMap;
 
- var layout = require("../../util/layout");
 
- var labelLayout = require("./labelLayout");
 
- var zrUtil = require("zrender/lib/core/util");
 
- /*
 
- * Licensed to the Apache Software Foundation (ASF) under one
 
- * or more contributor license agreements.  See the NOTICE file
 
- * distributed with this work for additional information
 
- * regarding copyright ownership.  The ASF licenses this file
 
- * to you under the Apache License, Version 2.0 (the
 
- * "License"); you may not use this file except in compliance
 
- * with the License.  You may obtain a copy of the License at
 
- *
 
- *   http://www.apache.org/licenses/LICENSE-2.0
 
- *
 
- * Unless required by applicable law or agreed to in writing,
 
- * software distributed under the License is distributed on an
 
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 
- * KIND, either express or implied.  See the License for the
 
- * specific language governing permissions and limitations
 
- * under the License.
 
- */
 
- var PI2 = Math.PI * 2;
 
- var RADIAN = Math.PI / 180;
 
- function getViewRect(seriesModel, api) {
 
-   return layout.getLayoutRect(seriesModel.getBoxLayoutParams(), {
 
-     width: api.getWidth(),
 
-     height: api.getHeight()
 
-   });
 
- }
 
- function _default(seriesType, ecModel, api, payload) {
 
-   ecModel.eachSeriesByType(seriesType, function (seriesModel) {
 
-     var data = seriesModel.getData();
 
-     var valueDim = data.mapDimension('value');
 
-     var viewRect = getViewRect(seriesModel, api);
 
-     var center = seriesModel.get('center');
 
-     var radius = seriesModel.get('radius');
 
-     if (!zrUtil.isArray(radius)) {
 
-       radius = [0, radius];
 
-     }
 
-     if (!zrUtil.isArray(center)) {
 
-       center = [center, center];
 
-     }
 
-     var width = parsePercent(viewRect.width, api.getWidth());
 
-     var height = parsePercent(viewRect.height, api.getHeight());
 
-     var size = Math.min(width, height);
 
-     var cx = parsePercent(center[0], width) + viewRect.x;
 
-     var cy = parsePercent(center[1], height) + viewRect.y;
 
-     var r0 = parsePercent(radius[0], size / 2);
 
-     var r = parsePercent(radius[1], size / 2);
 
-     var startAngle = -seriesModel.get('startAngle') * RADIAN;
 
-     var minAngle = seriesModel.get('minAngle') * RADIAN;
 
-     var validDataCount = 0;
 
-     data.each(valueDim, function (value) {
 
-       !isNaN(value) && validDataCount++;
 
-     });
 
-     var sum = data.getSum(valueDim); // Sum may be 0
 
-     var unitRadian = Math.PI / (sum || validDataCount) * 2;
 
-     var clockwise = seriesModel.get('clockwise');
 
-     var roseType = seriesModel.get('roseType');
 
-     var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); // [0...max]
 
-     var extent = data.getDataExtent(valueDim);
 
-     extent[0] = 0; // In the case some sector angle is smaller than minAngle
 
-     var restAngle = PI2;
 
-     var valueSumLargerThanMinAngle = 0;
 
-     var currentAngle = startAngle;
 
-     var dir = clockwise ? 1 : -1;
 
-     data.each(valueDim, function (value, idx) {
 
-       var angle;
 
-       if (isNaN(value)) {
 
-         data.setItemLayout(idx, {
 
-           angle: NaN,
 
-           startAngle: NaN,
 
-           endAngle: NaN,
 
-           clockwise: clockwise,
 
-           cx: cx,
 
-           cy: cy,
 
-           r0: r0,
 
-           r: roseType ? NaN : r,
 
-           viewRect: viewRect
 
-         });
 
-         return;
 
-       } // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样?
 
-       if (roseType !== 'area') {
 
-         angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian;
 
-       } else {
 
-         angle = PI2 / validDataCount;
 
-       }
 
-       if (angle < minAngle) {
 
-         angle = minAngle;
 
-         restAngle -= minAngle;
 
-       } else {
 
-         valueSumLargerThanMinAngle += value;
 
-       }
 
-       var endAngle = currentAngle + dir * angle;
 
-       data.setItemLayout(idx, {
 
-         angle: angle,
 
-         startAngle: currentAngle,
 
-         endAngle: endAngle,
 
-         clockwise: clockwise,
 
-         cx: cx,
 
-         cy: cy,
 
-         r0: r0,
 
-         r: roseType ? linearMap(value, extent, [r0, r]) : r,
 
-         viewRect: viewRect
 
-       });
 
-       currentAngle = endAngle;
 
-     }); // Some sector is constrained by minAngle
 
-     // Rest sectors needs recalculate angle
 
-     if (restAngle < PI2 && validDataCount) {
 
-       // Average the angle if rest angle is not enough after all angles is
 
-       // Constrained by minAngle
 
-       if (restAngle <= 1e-3) {
 
-         var angle = PI2 / validDataCount;
 
-         data.each(valueDim, function (value, idx) {
 
-           if (!isNaN(value)) {
 
-             var layout = data.getItemLayout(idx);
 
-             layout.angle = angle;
 
-             layout.startAngle = startAngle + dir * idx * angle;
 
-             layout.endAngle = startAngle + dir * (idx + 1) * angle;
 
-           }
 
-         });
 
-       } else {
 
-         unitRadian = restAngle / valueSumLargerThanMinAngle;
 
-         currentAngle = startAngle;
 
-         data.each(valueDim, function (value, idx) {
 
-           if (!isNaN(value)) {
 
-             var layout = data.getItemLayout(idx);
 
-             var angle = layout.angle === minAngle ? minAngle : value * unitRadian;
 
-             layout.startAngle = currentAngle;
 
-             layout.endAngle = currentAngle + dir * angle;
 
-             currentAngle += dir * angle;
 
-           }
 
-         });
 
-       }
 
-     }
 
-     labelLayout(seriesModel, r, viewRect.width, viewRect.height, viewRect.x, viewRect.y);
 
-   });
 
- }
 
- module.exports = _default;
 
 
  |