| 
/* 
 | 
* 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. 
 | 
*/ 
 | 
  
 | 
  
 | 
/** 
 | 
 * AUTO-GENERATED FILE. DO NOT MODIFY. 
 | 
 */ 
 | 
  
 | 
/* 
 | 
* 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. 
 | 
*/ 
 | 
import { calculateTextPosition } from 'zrender/lib/contain/text.js'; 
 | 
import { isArray, isNumber } from 'zrender/lib/core/util.js'; 
 | 
export function createSectorCalculateTextPosition(positionMapping, opts) { 
 | 
  opts = opts || {}; 
 | 
  var isRoundCap = opts.isRoundCap; 
 | 
  return function (out, opts, boundingRect) { 
 | 
    var textPosition = opts.position; 
 | 
    if (!textPosition || textPosition instanceof Array) { 
 | 
      return calculateTextPosition(out, opts, boundingRect); 
 | 
    } 
 | 
    var mappedSectorPosition = positionMapping(textPosition); 
 | 
    var distance = opts.distance != null ? opts.distance : 5; 
 | 
    var sector = this.shape; 
 | 
    var cx = sector.cx; 
 | 
    var cy = sector.cy; 
 | 
    var r = sector.r; 
 | 
    var r0 = sector.r0; 
 | 
    var middleR = (r + r0) / 2; 
 | 
    var startAngle = sector.startAngle; 
 | 
    var endAngle = sector.endAngle; 
 | 
    var middleAngle = (startAngle + endAngle) / 2; 
 | 
    var extraDist = isRoundCap ? Math.abs(r - r0) / 2 : 0; 
 | 
    var mathCos = Math.cos; 
 | 
    var mathSin = Math.sin; 
 | 
    // base position: top-left 
 | 
    var x = cx + r * mathCos(startAngle); 
 | 
    var y = cy + r * mathSin(startAngle); 
 | 
    var textAlign = 'left'; 
 | 
    var textVerticalAlign = 'top'; 
 | 
    switch (mappedSectorPosition) { 
 | 
      case 'startArc': 
 | 
        x = cx + (r0 - distance) * mathCos(middleAngle); 
 | 
        y = cy + (r0 - distance) * mathSin(middleAngle); 
 | 
        textAlign = 'center'; 
 | 
        textVerticalAlign = 'top'; 
 | 
        break; 
 | 
      case 'insideStartArc': 
 | 
        x = cx + (r0 + distance) * mathCos(middleAngle); 
 | 
        y = cy + (r0 + distance) * mathSin(middleAngle); 
 | 
        textAlign = 'center'; 
 | 
        textVerticalAlign = 'bottom'; 
 | 
        break; 
 | 
      case 'startAngle': 
 | 
        x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, distance + extraDist, false); 
 | 
        y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, distance + extraDist, false); 
 | 
        textAlign = 'right'; 
 | 
        textVerticalAlign = 'middle'; 
 | 
        break; 
 | 
      case 'insideStartAngle': 
 | 
        x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, -distance + extraDist, false); 
 | 
        y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, -distance + extraDist, false); 
 | 
        textAlign = 'left'; 
 | 
        textVerticalAlign = 'middle'; 
 | 
        break; 
 | 
      case 'middle': 
 | 
        x = cx + middleR * mathCos(middleAngle); 
 | 
        y = cy + middleR * mathSin(middleAngle); 
 | 
        textAlign = 'center'; 
 | 
        textVerticalAlign = 'middle'; 
 | 
        break; 
 | 
      case 'endArc': 
 | 
        x = cx + (r + distance) * mathCos(middleAngle); 
 | 
        y = cy + (r + distance) * mathSin(middleAngle); 
 | 
        textAlign = 'center'; 
 | 
        textVerticalAlign = 'bottom'; 
 | 
        break; 
 | 
      case 'insideEndArc': 
 | 
        x = cx + (r - distance) * mathCos(middleAngle); 
 | 
        y = cy + (r - distance) * mathSin(middleAngle); 
 | 
        textAlign = 'center'; 
 | 
        textVerticalAlign = 'top'; 
 | 
        break; 
 | 
      case 'endAngle': 
 | 
        x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, distance + extraDist, true); 
 | 
        y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, distance + extraDist, true); 
 | 
        textAlign = 'left'; 
 | 
        textVerticalAlign = 'middle'; 
 | 
        break; 
 | 
      case 'insideEndAngle': 
 | 
        x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, -distance + extraDist, true); 
 | 
        y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, -distance + extraDist, true); 
 | 
        textAlign = 'right'; 
 | 
        textVerticalAlign = 'middle'; 
 | 
        break; 
 | 
      default: 
 | 
        return calculateTextPosition(out, opts, boundingRect); 
 | 
    } 
 | 
    out = out || {}; 
 | 
    out.x = x; 
 | 
    out.y = y; 
 | 
    out.align = textAlign; 
 | 
    out.verticalAlign = textVerticalAlign; 
 | 
    return out; 
 | 
  }; 
 | 
} 
 | 
export function setSectorTextRotation(sector, textPosition, positionMapping, rotateType) { 
 | 
  if (isNumber(rotateType)) { 
 | 
    // user-set rotation 
 | 
    sector.setTextConfig({ 
 | 
      rotation: rotateType 
 | 
    }); 
 | 
    return; 
 | 
  } else if (isArray(textPosition)) { 
 | 
    // user-set position, use 0 as auto rotation 
 | 
    sector.setTextConfig({ 
 | 
      rotation: 0 
 | 
    }); 
 | 
    return; 
 | 
  } 
 | 
  var shape = sector.shape; 
 | 
  var startAngle = shape.clockwise ? shape.startAngle : shape.endAngle; 
 | 
  var endAngle = shape.clockwise ? shape.endAngle : shape.startAngle; 
 | 
  var middleAngle = (startAngle + endAngle) / 2; 
 | 
  var anchorAngle; 
 | 
  var mappedSectorPosition = positionMapping(textPosition); 
 | 
  switch (mappedSectorPosition) { 
 | 
    case 'startArc': 
 | 
    case 'insideStartArc': 
 | 
    case 'middle': 
 | 
    case 'insideEndArc': 
 | 
    case 'endArc': 
 | 
      anchorAngle = middleAngle; 
 | 
      break; 
 | 
    case 'startAngle': 
 | 
    case 'insideStartAngle': 
 | 
      anchorAngle = startAngle; 
 | 
      break; 
 | 
    case 'endAngle': 
 | 
    case 'insideEndAngle': 
 | 
      anchorAngle = endAngle; 
 | 
      break; 
 | 
    default: 
 | 
      sector.setTextConfig({ 
 | 
        rotation: 0 
 | 
      }); 
 | 
      return; 
 | 
  } 
 | 
  var rotate = Math.PI * 1.5 - anchorAngle; 
 | 
  /** 
 | 
   * TODO: labels with rotate > Math.PI / 2 should be rotate another 
 | 
   * half round flipped to increase readability. However, only middle 
 | 
   * position supports this for now, because in other positions, the 
 | 
   * anchor point is not at the center of the text, so the positions 
 | 
   * after rotating is not as expected. 
 | 
   */ 
 | 
  if (mappedSectorPosition === 'middle' && rotate > Math.PI / 2 && rotate < Math.PI * 1.5) { 
 | 
    rotate -= Math.PI; 
 | 
  } 
 | 
  sector.setTextConfig({ 
 | 
    rotation: rotate 
 | 
  }); 
 | 
} 
 | 
function adjustAngleDistanceX(angle, distance, isEnd) { 
 | 
  return distance * Math.sin(angle) * (isEnd ? -1 : 1); 
 | 
} 
 | 
function adjustAngleDistanceY(angle, distance, isEnd) { 
 | 
  return distance * Math.cos(angle) * (isEnd ? 1 : -1); 
 | 
} 
 |