如何用swing画一个圆,平均分成N份,在这些扇形里面分别画上内切圆。

解决方案 »

  1.   


    import java.awt.*; 
    import java.awt.event.*; 
    public class DrawOval extends JFramwe{ 
        public DrawOval() 
       { 
            super("画圆"); 
            setBounds(0,0,100,100); 
            setVisible(true); 
        } 
         public void paint(Graphics g) 
         { 
             g.setColor(Color.red);//画红圆 
               g.drawOval(0,0,100,100);//在50,50处画一个半径为50的圆 
           } 
          public static void main(String[] args) 
          { 
             DrawOval do=new DrawOval(); 
           } 
      }//如果能理解画圆的话,那么我绝对相信楼主有能力解决后续问题。 
      

  2.   

    import java.awt.Color;
    import java.awt.Graphics;
    public class ArcPanel extends javax.swing.JPanel {    boolean filled;    int slice = 8;
        int n = 360 / slice;
        double counts = 4;
        int[] row;    /** Creates new form ArcPanel */
        public ArcPanel() {
            initComponents();
        }    public ArcPanel(boolean filled) {
            this.filled = filled;
        }
        @Override
        public void paint(Graphics g) {        g.setColor(Color.yellow);
            if (filled) {
                g.drawArc(0, 0, diameter, diameter, 0, n);        } else {
                g.drawArc(0, 0, diameter, diameter, 45, 45);
            }        //      在第一个扇形内画矩形(三点钟时刻开始)
            int R = diameter / 2;
            int r = (int) ((int) R * Math.tan(Math.PI / slice) * Math.tan((Math.PI / 2 - Math.PI / slice) / 2));
            //圆心1坐标(R+r/(Math.tan(Math.PI/slice)),R-r)
            //正方形1交点 (R+r/Math.tan(Math.PI/slice)-r/Math.sqrt(2),(R-r-r/Math.sqrt(2)))
            int b1 = (int) ((int) r / Math.sqrt(2));
            int ox = (int) (R + r / (Math.tan(Math.PI / slice)));
            int oy = R - r;
            int x1 = (int) ((int) R + r / Math.tan(Math.PI / slice) - r / Math.sqrt(2));
            int y1 = (int) (R - r - r / Math.sqrt(2));        g.drawOval(x1, y1, 2 * b1, 2 * b1);
            g.drawRect(x1, y1, 2 * b1, 2 * b1);        g.setColor(Color.green);
            if (filled) {
                g.fillArc(0, 0, diameter, diameter, 360 / slice, n);
            } else {
                g.drawArc(0, 0, diameter, diameter, 135, -45);
            }        //圆心2坐标(R+r,R-r/(Math.tan(Math.PI/slice))
            //正方形2交点 (R+r-r/Math.sqrt(2),R-r/(Math.tan(Math.PI/slice)-r/Math.sqrt(2))
            int x2 = (int) (R + r - r / Math.sqrt(2));
            int y2 = (int) (R - r/(Math.tan(Math.PI / slice) - r / Math.sqrt(2)));
            int b2 = (int) ((int) r / Math.sqrt(2));
            System.out.println("x2:" + x2);
            g.drawRect(x2, y2, 2 * b2, 2 * b2);
            g.setColor(Color.orange);
            if (filled) {
                g.fillArc(0, 0, diameter, diameter, 2 * 360 / slice, n);
            } else {
                g.drawArc(0, 0, diameter, diameter, 135, -45);
            }
    //
            g.setColor(Color.magenta);        if (filled) {
                g.fillArc(0, 0, diameter, diameter, 3 * 360 / slice, n);
            } else {
                g.drawArc(0, 0, diameter, diameter, -225, 45);
            }        g.setColor(Color.yellow);
            if (filled) {
                g.fillArc(0, 0, diameter, diameter, 4 * 360 / slice, n);
            } else {
                g.drawArc(0, 0, diameter, diameter, 225, -45);
            }
    ////
            g.setColor(Color.green);
            if (filled) {
                g.fillArc(0, 0, diameter, diameter, 5 * 360 / slice, n);
            } else {
                g.drawArc(0, 0, diameter, diameter, -135, 45);
            }        g.setColor(Color.orange);
            if (filled) {
                g.fillArc(0, 0, diameter, diameter, 6 * 360 / slice, n);
            } else {
                g.drawArc(0, 0, diameter, diameter, -45, -45);
            }
    //
            g.setColor(Color.magenta);
            if (filled) {
                g.fillArc(0, 0, diameter, diameter, 7 * 360 / slice, 45);
            } else {
                g.drawArc(0, 0, diameter, diameter, 315, 45);
            }
        }  // end paint()    /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
            this.setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 371, Short.MAX_VALUE)
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 276, Short.MAX_VALUE)
            );
        }// </editor-fold>                        
        // Variables declaration - do not modify                     
        // End of variables declaration                   
        }
      

  3.   

    gentalguo 帮忙解决下,我解决不了,懂的早就可以解决,不懂,始终做不出来啊,
    解决了全部分都给啊。呵呵
      

  4.   

    好了好了,开玩笑的~~
    package test.arc;import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.Box;
    import javax.swing.BoxLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JTextField;public class MultiArc extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; JTextField ftf; MultiArcPanel p; public MultiArc() {
    super();
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    p = new MultiArcPanel();
    Container c = getContentPane();
    c.add(p, BorderLayout.CENTER); ftf = new JTextField("1", 10); JButton okButton = new JButton("OK");
    okButton.addActionListener(this); Box ctrlBox = new Box(BoxLayout.X_AXIS);
    ctrlBox.add(Box.createGlue());
    ctrlBox.add(ftf);
    ctrlBox.add(Box.createHorizontalStrut(2));
    ctrlBox.add(okButton);
    ctrlBox.add(Box.createGlue()); c.add(ctrlBox, BorderLayout.SOUTH); setSize(550, 450);
    setVisible(true);
    } public void actionPerformed(ActionEvent e) {
    String text = ftf.getText();
    int num = 1;
    try {
    num = Integer.parseInt(text);
    } catch (Exception ex) {
    num = 1;
    } if (360 % num != 0) {
    ftf.setText("1");
    return;
    } p.setN(num);
    p.repaint(); } public static void main(String args[]) {
    new MultiArc();
    }
    }package test.arc;import java.awt.Graphics;
    import java.awt.Point;import javax.swing.JPanel;public class MultiArcPanel extends JPanel { private static final long serialVersionUID = 1L; private int n = 2; int radius; int centerX; int centerY; double inc = (2 * PI / n) % (2 * PI); private static final double PI = Math.PI; public MultiArcPanel() {
    super();
    } public void paint(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); int width = getWidth() - 20;
    int height = getHeight() - 20;
    centerX = width / 2;
    centerY = height / 2;
    radius = Math.min(width, height) / 2;
    g.drawOval(centerX - radius, centerY - radius, 2 * radius, 2 * radius); if (n > 1) {
    double angle = 0.0;
    for (int i = 0; i < n; i++) {
    Point endPoint = getEndPoint(angle);
    g.drawLine(centerX, centerY, endPoint.x, endPoint.y); int innerRadius = (int) (radius * Math.sin(inc / 2) / (1 + Math
    .sin(inc / 2)));
    Point innerCenter = getInnerCircleCenter(angle, innerRadius);
    g.drawOval(innerCenter.x - innerRadius, innerCenter.y
    - innerRadius, 2 * innerRadius, 2 * innerRadius);
    angle += (2 * PI / n) % (2 * PI);
    }
    }
    } private Point getEndPoint(double startAngle) {
    Point rsPoint = new Point(); double endAngle = (startAngle + inc) % (2 * PI);
    rsPoint.x = (int) (centerX + radius * Math.cos(endAngle));
    rsPoint.y = (int) (centerY + radius * Math.sin(endAngle));
    return rsPoint;
    } public void setN(int n) {
    this.n = n;
    inc = (2 * PI / n) % (2 * PI);
    } private Point getInnerCircleCenter(double startAngle, int innerRadius) {
    Point rsPoint = new Point();
    rsPoint.x = (int) (centerX + (radius - innerRadius)
    * Math.cos(startAngle + inc / 2));
    rsPoint.y = (int) (centerY + (radius - innerRadius)
    * Math.sin(startAngle + inc / 2));
    return rsPoint;
    }
    }
    两个类~~^_^
    加油~~共同学习,共同进步。
      

  5.   

    gentalguo 好神速啊,非常感谢啊,我去试运行下。嘿嘿,多谢啊!
      

  6.   

    gentalguo,你运行没有报错?我运行报错了哦!
    Exception in thread "main" java.lang.ExceptionInInitializerError
            at test.arc.MultiArc.<init>(MultiArc.java:32)
            at test.arc.MultiArc.main(MultiArc.java:74)
    Caused by: java.lang.RuntimeException: Uncompilable source code - 类 MultiArcPanel 是公共的,应在名为 MultiArcPanel.java 的文件中声明
            at graphics1.MultiArcPanel.<clinit>(MultiArcPanel%20.java:8)
            ... 2 more
      

  7.   

    jdk1.6,eclipse3.2,我的环境啊
    奇怪~~
      

  8.   

    刚运行过了。完全可以。你把包去掉,然后直接用dos就可以编译了。