Java 分割饼图的各个部分

Java 分割饼图的各个部分,java,awt,pie-chart,Java,Awt,Pie Chart,我有代码来画一个等截面的饼图。但我不希望每个饼片彼此相连,而是希望每个饼片之间有一个距离(空间)。我该怎么做 import javax.swing.JApplet; import java.awt.*; public class PieChart extends JApplet { public void paint(Graphics page) { setBackground(Color.lightGray); page.setColor(Color

我有代码来画一个等截面的饼图。但我不希望每个饼片彼此相连,而是希望每个饼片之间有一个距离(空间)。我该怎么做

import javax.swing.JApplet;
import java.awt.*;

public class PieChart extends JApplet {
    public void paint(Graphics page) {
        setBackground(Color.lightGray);

        page.setColor(Color.blue);
        page.fillArc(70, 25, 100, 100, 0, 45);

        page.setColor(Color.yellow);
        page.fillArc(70, 25, 100, 100, 45, 45);

        page.setColor(Color.black);
        page.fillArc(70, 25, 100, 100, 90, 45);

        page.setColor(Color.green);
        page.fillArc(70, 25, 100, 100, 135, 45);

        page.setColor(Color.red);
        page.fillArc(70, 25, 100, 100, 180, 45);

        page.setColor(Color.magenta);
        page.fillArc(70, 25, 100, 100, 225, 45);

        page.setColor(Color.cyan);
        page.fillArc(70, 25, 100, 100, 270, 45);

        page.setColor(Color.orange);
        page.fillArc(70, 25, 100, 100, 315, 45);
    }
}

正如hagello所建议的,你可能会想通过从中间移出碎片来“爆炸”馅饼。为此,您需要计算每个楔块(中心)的方向。然后将楔子的原点沿此方向移动一段距离。以下是重新映射的x&y坐标的可能计算:

public class pie {
    public static void main(String[] args) {
            int x;
            int y;
            int d = 5;             /* our distance of "explosion" */

//          thing.fillArc(70, 25, 100, 100, 0, 45);   /* we had (70,25) */
            x = offsetX(70, d, 0, 45);
            y = offsetY(25, d, 0, 45);
//          thing.fillArc(x, y, 100, 100, 0, 45);     /* with new x & y */
            System.out.println("x = " + x + ", y = " + y);  /* showing */
    }

    public static int offsetX ( int x, int d, int sa, int aa ) {
            double  ca  = Math.toRadians((sa + aa) / 2.0);

            return x + (int)(Math.cos(ca) * d);
    }

    public static int offsetY ( int y, int d, int sa, int aa ) {
            double  ca  = Math.toRadians((sa + aa) / 2.0);

            return y + (int)(Math.sin(ca) * d);
    }
}

正如hagello所建议的,你可能会想通过从中间移出碎片来“爆炸”馅饼。为此,您需要计算每个楔块(中心)的方向。然后将楔子的原点沿此方向移动一段距离。以下是重新映射的x&y坐标的可能计算:

public class pie {
    public static void main(String[] args) {
            int x;
            int y;
            int d = 5;             /* our distance of "explosion" */

//          thing.fillArc(70, 25, 100, 100, 0, 45);   /* we had (70,25) */
            x = offsetX(70, d, 0, 45);
            y = offsetY(25, d, 0, 45);
//          thing.fillArc(x, y, 100, 100, 0, 45);     /* with new x & y */
            System.out.println("x = " + x + ", y = " + y);  /* showing */
    }

    public static int offsetX ( int x, int d, int sa, int aa ) {
            double  ca  = Math.toRadians((sa + aa) / 2.0);

            return x + (int)(Math.cos(ca) * d);
    }

    public static int offsetY ( int y, int d, int sa, int aa ) {
            double  ca  = Math.toRadians((sa + aa) / 2.0);

            return y + (int)(Math.sin(ca) * d);
    }
}

首先,不要直接在JApplet的绘制方法中绘制,因为在顶级窗口中绘制,可能会对子组件和边框产生不良的副作用。取而代之的是在JPanel的paintComponent方法中绘制,然后显示在JApplet中。接下来,您需要在覆盖中调用super的绘制方法,否则您的GUI将不会执行必要的内务绘制,包括清除“脏”像素。下一步,避免在执行过程中硬编码数字,因为这会导致代码难以调试和增强。对实际程序的合理建议,但尽量减少问题中的非问题内容是有好处的……首先,不要像在顶级窗口中绘制一样,直接在JApplet的绘制方法中绘制,子组件和边框可能会产生不良副作用。取而代之的是在JPanel的paintComponent方法中绘制,然后显示在JApplet中。接下来,您需要在覆盖中调用super的绘制方法,否则您的GUI将不会执行必要的内务绘制,包括清除“脏”像素。下一步,避免在你做的时候硬编码你的数字,因为这会导致不灵活的、难以调试和增强的代码。对于一个真实的程序来说,合理的建议,但是最小化问题中的非问题内容是有好处的。。。