用Java计算PI逼近

用Java计算PI逼近,java,pi,Java,Pi,我试图写一个近似PI值的代码。 我正在做的是: 在矩形内画圆 在矩形和圆形内绘制随机点 计算rect/cicle之间的比率 计算4/比率 那应该是圆周率 这是我的代码: import java.awt.Color; import java.awt.Frame; import java.awt.Graphics; import java.awt.Point; import java.awt.event.WindowAdapter; import java.awt.event.Wind

我试图写一个近似PI值的代码。 我正在做的是:

  • 在矩形内画圆

  • 在矩形和圆形内绘制随机点

  • 计算rect/cicle之间的比率

  • 计算4/比率

  • 那应该是圆周率

这是我的代码:

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Random;

public class Main extends Frame {

    int width = 800;
    ArrayList<Point> list = new ArrayList<Point>();


    public void points(Graphics g) {
        int numPoint = 10000000;

        for (int i = 0; i < numPoint; i++) {

            int min = 23;
            int max = 23 + width;
            Random rand = new Random();

            int x = rand.nextInt(width);
            int y = (int) (Math.random() * (max - min + 1) + min);
            Point temp = new Point(x, y);
            list.add(temp);
            if (inCircle(temp)) {
                g.setColor(Color.green);
            } else {
                g.setColor(Color.blue);
            }
            g.drawLine(x, y, x, y);
        }
    }


    public void paint(Graphics g) {
        g.fillRect(0, 0, 1000, 1000);
        int x = width / 2;
        int y = width / 2 + 23;
        int radius = width / 2;
        g.setColor(Color.WHITE);
        g.drawOval(x - radius, y - radius, radius * 2, radius * 2);
        g.drawRect(0, 23, width, width);
        points(g);
        calculatingPI();
    }


    public void calculatingPI() {
        double inCircle = 0;
        double inRect = list.size();
        for (Point p : list) {
            if (inCircle(p)) {
                inCircle++;
            }
        }
        double ratio = inRect / inCircle;
        System.out.print("PI is approximated to: " + 4 / ratio + "  ");
    }


    public boolean inCircle(Point p) {
        Point center = new Point(width / 2, width / 2 + 23);
        return center.distance(p) <= width / 2;
    }
    

    public static void main(String[] args) {
        Frame frame = new Main();
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });
        // circle coordinates.
        frame.setSize(800, 1000);
        frame.setVisible(true);
    }
} 
导入java.awt.Color;
导入java.awt.Frame;
导入java.awt.Graphics;
导入java.awt.Point;
导入java.awt.event.WindowAdapter;
导入java.awt.event.WindowEvent;
导入java.util.ArrayList;
导入java.util.Random;
公共类主框架{
整数宽度=800;
ArrayList=新建ArrayList();
公共空位点(图g){
int numPoint=10000000;
对于(int i=0;i返回中心。距离(p)您使用的是整数像素。这意味着您的“圆”越小,它与真实圆的近似程度就越差。例如,这是一个3x3像素正方形内的圆:它看起来根本不是圆形的

 █ 
███
 █ 
要获得更好的近似值,请使用
double
浮点数而不是整数。使用
Point2D.double
而不是
point
类:

ArrayList<Point2D.Double> list = new ArrayList<>();
请注意,如果您有
max-min+1
,则必须删除+1

要测试点是否在圆内,请执行以下操作:

public boolean inCircle(Point2D.Double p) {
    Point2D.Double center = new Point2D.Double(width / 2d, width / 2d + 23);
    return center.distance(p) <= width / 2d;
}
公共布尔内圆(Point2D.Double p){
Point2D.Double center=新的Point2D.Double(宽度/2d,宽度/2d+23);

返回中心。距离(p)当然,因为采样点的坐标是整数,所以面积越大,“圆”(仅由整数点组成)越接近真圆?
public boolean inCircle(Point2D.Double p) {
    Point2D.Double center = new Point2D.Double(width / 2d, width / 2d + 23);
    return center.distance(p) <= width / 2d;
}