This is an automated email from the ASF dual-hosted git repository.

ovilia pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/echarts.git


The following commit(s) were added to refs/heads/master by this push:
     new 4ce776ccf feat(pie): add padAngle for pie
     new b37d67cbd Merge pull request #19076 from linghaoSu/feat/pie_pad-angle
4ce776ccf is described below

commit 4ce776ccfe0cd0b89bc1c2434367fd448d2f4288
Author: linghao.su <slh...@live.cn>
AuthorDate: Sun Sep 3 19:37:12 2023 +0800

    feat(pie): add padAngle for pie
---
 src/chart/pie/PieSeries.ts |   3 +
 src/chart/pie/pieLayout.ts |  72 +++++++++++++++++++-----
 test/pie-pad-angle.html    | 133 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 195 insertions(+), 13 deletions(-)

diff --git a/src/chart/pie/PieSeries.ts b/src/chart/pie/PieSeries.ts
index 5d0fd4ade..13e220dc5 100644
--- a/src/chart/pie/PieSeries.ts
+++ b/src/chart/pie/PieSeries.ts
@@ -113,6 +113,8 @@ export interface PieSeriesOption extends
     clockwise?: boolean
     startAngle?: number
     endAngle?: number | 'auto'
+    padAngle?: number;
+
     minAngle?: number
     minShowLabelAngle?: number
 
@@ -219,6 +221,7 @@ class PieSeriesModel extends SeriesModel<PieSeriesOption> {
         clockwise: true,
         startAngle: 90,
         endAngle: 'auto',
+        padAngle: 0,
         // 最小角度改为0
         minAngle: 0,
 
diff --git a/src/chart/pie/pieLayout.ts b/src/chart/pie/pieLayout.ts
index e81afae43..2acdcda39 100644
--- a/src/chart/pie/pieLayout.ts
+++ b/src/chart/pie/pieLayout.ts
@@ -94,10 +94,14 @@ export default function pieLayout(
 
         let startAngle = -seriesModel.get('startAngle') * RADIAN;
         let endAngle = seriesModel.get('endAngle');
+        const padAngle = seriesModel.get('padAngle') * RADIAN;
+
         endAngle = endAngle === 'auto' ? startAngle - PI2 : -endAngle * RADIAN;
 
         const minAngle = seriesModel.get('minAngle') * RADIAN;
 
+        const minAndPadAngle = minAngle + padAngle;
+
         let validDataCount = 0;
         data.each(valueDim, function (value: number) {
             !isNaN(value) && validDataCount++;
@@ -118,6 +122,7 @@ export default function pieLayout(
 
         const dir = clockwise ? 1 : -1;
         const angles = [startAngle, endAngle];
+        const halfPadAngle = dir * padAngle / 2;
         normalizeArcAngles(angles, !clockwise);
 
         [startAngle, endAngle] = angles;
@@ -159,19 +164,34 @@ export default function pieLayout(
                 angle = angleRange / validDataCount;
             }
 
-            if (angle < minAngle) {
-                angle = minAngle;
-                restAngle -= minAngle;
+
+            if (angle < minAndPadAngle) {
+                angle = minAndPadAngle;
+                restAngle -= minAndPadAngle;
             }
             else {
                 valueSumLargerThanMinAngle += value;
             }
 
             const endAngle = currentAngle + dir * angle;
+
+            // calculate display angle
+            let actualStartAngle = 0;
+            let actualEndAngle = 0;
+
+            if (padAngle > angle) {
+                actualStartAngle = currentAngle + dir * angle / 2;
+                actualEndAngle = actualStartAngle;
+            }
+            else {
+                actualStartAngle = currentAngle + halfPadAngle;
+                actualEndAngle = endAngle - halfPadAngle;
+            }
+
             data.setItemLayout(idx, {
                 angle: angle,
-                startAngle: currentAngle,
-                endAngle: endAngle,
+                startAngle: actualStartAngle,
+                endAngle: actualEndAngle,
                 clockwise: clockwise,
                 cx: cx,
                 cy: cy,
@@ -184,19 +204,32 @@ export default function pieLayout(
             currentAngle = endAngle;
         });
 
-        // Some sector is constrained by minAngle
+        // Some sector is constrained by minAngle and padAngle
         // 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
+            // Constrained by minAngle and padAngle
             if (restAngle <= 1e-3) {
                 const angle = angleRange / validDataCount;
                 data.each(valueDim, function (value: number, idx: number) {
                     if (!isNaN(value)) {
                         const layout = data.getItemLayout(idx);
                         layout.angle = angle;
-                        layout.startAngle = startAngle + dir * idx * angle;
-                        layout.endAngle = startAngle + dir * (idx + 1) * angle;
+
+                        let actualStartAngle = 0;
+                        let actualEndAngle = 0;
+
+                        if (angle < padAngle) {
+                            actualStartAngle = startAngle + dir * (idx + 1 / 
2) * angle;
+                            actualEndAngle = actualStartAngle;
+                        }
+                        else {
+                             actualStartAngle = startAngle + dir * idx * angle 
+ halfPadAngle;
+                             actualEndAngle = startAngle + dir * (idx + 1) * 
angle - halfPadAngle;
+                        }
+
+                        layout.startAngle = actualStartAngle;
+                        layout.endAngle = actualEndAngle;
                     }
                 });
             }
@@ -206,10 +239,23 @@ export default function pieLayout(
                 data.each(valueDim, function (value: number, idx: number) {
                     if (!isNaN(value)) {
                         const layout = data.getItemLayout(idx);
-                        const angle = layout.angle === minAngle
-                            ? minAngle : value * unitRadian;
-                        layout.startAngle = currentAngle;
-                        layout.endAngle = currentAngle + dir * angle;
+                        const angle = layout.angle === minAndPadAngle
+                            ? minAndPadAngle : value * unitRadian;
+
+                        let actualStartAngle = 0;
+                        let actualEndAngle = 0;
+
+                        if (angle < padAngle) {
+                            actualStartAngle = currentAngle + dir * angle / 2;
+                            actualEndAngle = actualStartAngle;
+                        }
+                        else {
+                            actualStartAngle = currentAngle + halfPadAngle;
+                            actualEndAngle = currentAngle + dir * angle - 
halfPadAngle;
+                        }
+
+                        layout.startAngle = actualStartAngle;
+                        layout.endAngle = actualEndAngle;
                         currentAngle += dir * angle;
                     }
                 });
diff --git a/test/pie-pad-angle.html b/test/pie-pad-angle.html
new file mode 100644
index 000000000..a458e6f6b
--- /dev/null
+++ b/test/pie-pad-angle.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<!--
+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.
+-->
+
+
+<html>
+
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+    <script src="lib/simpleRequire.js"></script>
+    <script src="lib/config.js"></script>
+    <script src="lib/jquery.min.js"></script>
+    <script src="lib/facePrint.js"></script>
+    <script src="lib/testHelper.js"></script>
+    <!-- <script src="ut/lib/canteen.js"></script> -->
+    <link rel="stylesheet" href="lib/reset.css" />
+</head>
+
+<body>
+    <style>
+    </style>
+
+
+
+
+
+    <script>
+        require([
+            'echarts',
+            // 'map/js/china',
+            // './data/nutrients.json'
+        ], function (echarts) {
+            var option;
+
+
+            const step = 5;
+            const interval = 20;
+
+            let padAngle = 0;
+            let minAngle = 0;
+
+            const seriesList = [];
+
+            let index = 0;
+
+            for (let i = 0; i < step; i++) {
+                for (let j = 0; j < step; j++) {
+                    const canvas = document.createElement('div');
+
+                    seriesList.push({
+                        type: 'pie',
+                        radius: ['40%', '70%'],
+                        avoidLabelOverlap: false,
+                        padAngle: j * interval,
+                        minAngle: i * interval,
+                        itemStyle: {
+                            borderRadius: 10,
+                            borderColor: '#fff',
+                            borderWidth: 2
+                        },
+                        data: [
+                            { value: 1048, name: 'Search Engine' },
+                            { value: 735, name: 'Direct' },
+                            { value: 580, name: 'Email' },
+                            { value: 484, name: 'Union Ads' },
+                            { value: 300, name: 'Video Ads' }
+                        ]
+                    })
+
+                    canvas.setAttribute('id', `main${index}`);
+
+                    document.body.append(canvas);
+                    index++;
+                }
+            }
+
+
+
+            option = {
+                tooltip: {
+                    trigger: 'item'
+                },
+                series: [
+                ]
+            };
+
+            for (let i = 0; i < seriesList.length; i++) {
+                var chart = testHelper.create(echarts, `main${i}`, {
+                    title: [
+                        `Pie with pad angle of main${i}`,
+                        `padAngle is ${seriesList[i].padAngle}`,
+                        `minAngle is ${seriesList[i].minAngle}`,
+                    ],
+                    option: {
+                        tooltip: {
+                            trigger: 'item'
+                        },
+                        series: [
+                            seriesList[i],
+                        ]
+                    },
+                    // height: 300,
+                    // buttons: [{text: 'btn-txt', onclick: function () {}}],
+                    // recordCanvas: true,
+                });
+
+
+            }
+
+        });
+    </script>
+
+
+</body>
+
+</html>
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@echarts.apache.org
For additional commands, e-mail: commits-h...@echarts.apache.org

Reply via email to