• JAVA中绘制多边形的算法


     
      1 package lzy.di9zhang;
      2 
      3 import java.awt.BorderLayout;
      4 import java.awt.Graphics;
      5 import java.awt.Point;
      6 import java.awt.event.ActionEvent;
      7 import java.awt.event.ActionListener;
      8 import java.awt.event.FocusEvent;
      9 import java.awt.event.FocusListener;
     10 
     11 import javax.swing.JButton;
     12 import javax.swing.JFrame;
     13 import javax.swing.JLabel;
     14 import javax.swing.JPanel;
     15 import javax.swing.JTextField;
     16 
     17 public class Shiyan4 extends JFrame implements ActionListener, FocusListener {
     18     private JLabel jl;
     19     private JTextField jtf;
     20     private JButton jb;
     21     private JPanel jp2;
     22     private MyPanel mp;
     23 
     24     public Shiyan4() {
     25         jl = new JLabel("请输入正多边形的边数:");
     26         jtf = new JTextField(10);
     27         jtf.addFocusListener(this);
     28         jb = new JButton("确定");
     29         jb.addActionListener(this);
     30         mp = new MyPanel();
     31         jp2 = new JPanel();
     32         jp2.add(jl);
     33         jp2.add(jtf);
     34         jp2.add(jb);
     35         this.add(mp);
     36         this.add(jp2, BorderLayout.SOUTH);
    
     37         this.setSize(500, 500);
     38         this.setVisible(true);
     39         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
     40     }
     41 
     42     public static void main(String[] args) {
     43         Shiyan4 shiyan4 = new Shiyan4();
     44     }
     45 
     46     @Override
     47     public void actionPerformed(ActionEvent e) {
     48         if (e.getSource() == jb) {
     49             String bianshu = jtf.getText();
     50             mp.bianshu = Integer.parseInt(bianshu);
     51             mp.repaint();
     52         }
     53     }
     54 
     55     @Override
     56     public void focusGained(FocusEvent e) {
     57         if (e.getSource() == jtf) {
     58             jtf.setText("");
     59         }
     60     }
     61 
     62     public void focusLost(FocusEvent e) {
     63     }
     64 }
     65 
     66 class MyPanel extends JPanel {
     67     int bianshu;
     68     private int bianshuMax = 20;
     69     private int[] x = new int[bianshuMax];
     70     private int[] y = new int[bianshuMax];
     71     MyPolygon mplg = new MyPolygon(x, y);
     72 
     73     public void paint(Graphics g) {
     74         g.clearRect(0, 0, this.getWidth(), this.getHeight());//因为repaint不调用update,所以自己清空面板
     75         if (bianshu <= bianshuMax) {
     76             mplg.posOfPoint(bianshu);
     77             g.drawPolygon(x, y, bianshu);
     78         } else {
     79             bianshuMax += 20;
     80             x = new int[bianshuMax];
     81             y = new int[bianshuMax];
     82             mplg = new MyPolygon(x, y);
     83             paint(g);
     84         }
     85     }
     86 }
     87 
     88 class MyPolygon {// 求正多边形的顶点坐标
     89     private int[] x;
     90     private int[] y;
     91     private int startX;// 顶点的X坐标
     92     private int startY;// 顶点的Y坐标
     93     private int r;// 外接圆的半径
     94 
     95     public MyPolygon(int[] x, int[] y) {
     96         this.x = x;
     97         this.y = y;
     98         startX = 200;
     99         startY = 10;
    100         r = 200;
    101     }
    102 
    103     public void posOfPoint(int bianshu) {
    104         x[0] = startX;
    105         y[0] = startY;
    106         Point p = new Point();
    107         for (int i = 1; i < bianshu; i++) {
    108             p = nextPoint(((2 * Math.PI) / bianshu) * i);
    109             x[i] = p.x;
    110             y[i] = p.y;
    111         }
    112     }
    113 
    114     public Point nextPoint(double arc) {// arc为弧度,在顶点处建立直角坐标系,用r和arc确定下一个点的坐标
    115         Point p = new Point();
    116         p.x = (int) (x[0] - r * Math.sin(arc));
    117         p.y = (int) (y[0] + r - r * Math.cos(arc));
    118         return p;
    119     }
    120 }

    核心代码:
     public  Point   nextPoint(double arc) {// arc为弧度,在顶点(x[0],y[0])处建立直角坐标系,

                          //用 r 和 arc 确定下一个点的坐标。
                Point p = new Point();
                p.x = (int) (x[0] - r * Math.sin(arc));
                p.y = (int) (y[0] + r - r * Math.cos(arc));
                return p;
               }

    运行界面:

  • 相关阅读:
    转:使用vs2013打开VS2015的工程文件的解决方案(适用于大多数vs低版本打开高版本)
    linq 动态组合条件
    转:Web应用程序项目XX已配置为使用IIS
    转:centos彻底删除文件夹、文件命令
    转:WebClient类(温习一下)
    解决 ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
    转:装完Centos7提示Initial setup of CentOS Linux 7 (core)
    PL/SQL Developer 登录 Oracle 12c和Win10下安装Oracle 11g
    centos7-linux安装docker(离线方式)
    windows7安装gitblit
  • 原文地址:https://www.cnblogs.com/luzhiyuan/p/2752937.html
Copyright © 2020-2023  润新知