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将不会执行必要的内务绘制,包括清除“脏”像素。下一步,避免在你做的时候硬编码你的数字,因为这会导致不灵活的、难以调试和增强的代码。对于一个真实的程序来说,合理的建议,但是最小化问题中的非问题内容是有好处的。。。