Skip to content

Commit ba9a72b

Browse files
committed
Chapter 03 Monte Carlo Experiment codes updated.
1 parent 48564fb commit ba9a72b

File tree

12 files changed

+496
-107
lines changed

12 files changed

+496
-107
lines changed

03-Probability-Simulation/03-Get-PI-with-Monte-Carlo/src/AlgoFrame.java

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,5 @@
1-
import java.awt.Graphics2D;
2-
import java.awt.Graphics;
3-
import java.awt.Dimension;
4-
import java.awt.Color;
5-
import java.awt.RenderingHints;
6-
import java.awt.geom.Point2D;
7-
import java.util.ArrayList;
8-
import java.util.Map;
9-
import java.util.HashMap;
10-
1+
import java.awt.*;
2+
import java.util.LinkedList;
113
import javax.swing.*;
124

135
public class AlgoFrame extends JFrame{
@@ -41,9 +33,11 @@ public AlgoFrame(String title){
4133
public int getCanvasHeight(){return canvasHeight;}
4234

4335
// data
44-
MonteCarloData data;
45-
public void setData(MonteCarloData data){
46-
this.data = data;
36+
Circle circle;
37+
LinkedList<Point> points;
38+
public void render(Circle circle, LinkedList<Point> points){
39+
this.circle = circle;
40+
this.points = points;
4741
repaint();
4842
}
4943

@@ -70,20 +64,19 @@ public void paintComponent(Graphics g) {
7064
// 具体绘制
7165
AlgoVisHelper.setStrokeWidth(g2d, 3);
7266
AlgoVisHelper.setColor(g2d, AlgoVisHelper.Blue);
73-
AlgoVisHelper.strokeCircle(g2d, data.getX(), data.getY(), data.getR());
67+
AlgoVisHelper.strokeCircle(g2d, circle.getX(), circle.getY(), circle.getR());
7468

75-
for(int i = 0 ; i < data.N() ; i ++){
76-
Point2D point = data.getPoint(i);
77-
if(data.inCircle(point))
69+
for(int i = 0 ; i < points.size() ; i ++){
70+
Point p = points.get(i);
71+
if(circle.contain(p))
7872
AlgoVisHelper.setColor(g2d, AlgoVisHelper.Red);
7973
else
8074
AlgoVisHelper.setColor(g2d, AlgoVisHelper.Green);
8175

82-
AlgoVisHelper.fillCircle(g2d, (int)point.getX(), (int)point.getY(), 3);
76+
AlgoVisHelper.fillCircle(g2d, p.x, p.y, 3);
8377
}
8478
}
8579

86-
8780
@Override
8881
public Dimension getPreferredSize(){
8982
return new Dimension(canvasWidth, canvasHeight);
Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,71 @@
1-
import javafx.scene.input.MouseButton;
2-
31
import java.awt.*;
4-
import java.awt.event.*;
2+
import java.util.LinkedList;
53
import javax.swing.*;
6-
import java.awt.geom.Point2D;
7-
import java.util.PriorityQueue;
8-
import java.util.Arrays;
94

105
public class AlgoVisualizer {
116

127
private static int DELAY = 40;
138

14-
private MonteCarloData data;
9+
private Circle circle;
10+
private int insideCircle = 0;
11+
private LinkedList<Point> points;
1512
private AlgoFrame frame;
16-
boolean running = true;
13+
private int N;
14+
15+
public AlgoVisualizer(int sceneWidth, int sceneHeight, int N){
16+
17+
if(sceneWidth != sceneHeight)
18+
throw new IllegalArgumentException("This demo must be run in a square window!");
1719

18-
public AlgoVisualizer(AlgoFrame frame, MonteCarloData data){
20+
this.N = N;
1921

20-
this.frame = frame;
21-
this.data = data;
22+
circle = new Circle(sceneWidth/2, sceneHeight/2, sceneWidth/2);
23+
points = new LinkedList<Point>();
2224

23-
this.setData();
25+
// 初始化视图
26+
EventQueue.invokeLater(() -> {
27+
frame = new AlgoFrame("Monte Carlo", sceneWidth, sceneHeight);
28+
29+
new Thread(() -> {
30+
run();
31+
}).start();
32+
});
2433
}
2534

2635
public void run(){
2736

28-
int N = 50000;
2937
for(int i = 0 ; i < N ; i ++){
30-
int x = (int)(Math.random() * frame.getCanvasWidth());
31-
int y = (int)(Math.random() * frame.getCanvasHeight());
32-
data.addPoint(x, y);
3338

34-
if( data.N() % 10 == 0) {
35-
this.setData();
39+
//if( i % 10 == 0) {
40+
if( i % 100 == 0) {
41+
frame.render(circle, points);
3642
AlgoVisHelper.pause(DELAY);
3743

38-
double area = (double)data.getInsideCircleNum() / data.N() * (frame.getCanvasHeight() * frame.getCanvasWidth());
39-
System.out.println("PI: " + area / (data.getR() * data.getR()) );
44+
if(points.size() != 0) {
45+
int circleArea = insideCircle;
46+
int squareArea = points.size();
47+
double pi_estimation = (double)circleArea * 4 / squareArea;
48+
System.out.println("PI estimation: " + pi_estimation);
49+
}
4050
}
4151

42-
}
52+
int x = (int)(Math.random() * frame.getCanvasWidth());
53+
int y = (int)(Math.random() * frame.getCanvasHeight());
4354

44-
// double area = (double)data.getInsideCircleNum() / data.N() * (frame.getCanvasHeight() * frame.getCanvasWidth());
45-
// System.out.println("PI: " + area / (data.getR() * data.getR()) );
46-
// setData();
47-
}
55+
Point p = new Point(x, y);
56+
points.add(p);
57+
if(circle.contain(p))
58+
insideCircle ++;
59+
}
4860

49-
private void setData(){
50-
frame.setData(data);
5161
}
5262

5363
public static void main(String[] args) {
5464

5565
int sceneWidth = 800;
5666
int sceneHeight = 800;
67+
int N = 10000;
5768

58-
EventQueue.invokeLater(() -> {
59-
AlgoFrame frame = new AlgoFrame("Monte Carlo Visualizer", sceneWidth,sceneHeight);
60-
61-
MonteCarloData data = new MonteCarloData(sceneWidth/2, sceneHeight/2, 300);
62-
63-
AlgoVisualizer vis = new AlgoVisualizer(frame, data);
64-
new Thread(() -> {
65-
vis.run();
66-
}).start();
67-
});
69+
AlgoVisualizer vis = new AlgoVisualizer(sceneWidth, sceneHeight, N);
6870
}
6971
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import java.awt.*;
2+
import javax.swing.*;
3+
4+
public class Circle {
5+
6+
private int x, y, r;
7+
8+
public Circle(int x, int y, int r){
9+
this.x = x;
10+
this.y = y;
11+
this.r = r;
12+
}
13+
14+
public int getX(){ return x; }
15+
public int getY(){ return y; }
16+
public int getR(){ return r; }
17+
18+
public boolean contain(Point p){
19+
return Math.pow(p.getX() - x, 2) + Math.pow(p.getY() - y, 2) <= r*r;
20+
}
21+
}

03-Probability-Simulation/03-Get-PI-with-Monte-Carlo/src/MonteCarloData.java

Lines changed: 0 additions & 51 deletions
This file was deleted.
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import java.awt.*;
2+
import java.util.LinkedList;
3+
import javax.swing.*;
4+
5+
public class AlgoFrame extends JFrame{
6+
7+
private int canvasWidth;
8+
private int canvasHeight;
9+
10+
public AlgoFrame(String title, int canvasWidth, int canvasHeight){
11+
12+
super(title);
13+
14+
this.canvasWidth = canvasWidth;
15+
this.canvasHeight = canvasHeight;
16+
17+
AlgoCanvas canvas = new AlgoCanvas();
18+
setContentPane(canvas);
19+
pack();
20+
21+
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
22+
setResizable(false);
23+
24+
setVisible(true);
25+
}
26+
27+
public AlgoFrame(String title){
28+
29+
this(title, 1024, 768);
30+
}
31+
32+
public int getCanvasWidth(){return canvasWidth;}
33+
public int getCanvasHeight(){return canvasHeight;}
34+
35+
// data
36+
MonteCarloPiData data;
37+
public void render(MonteCarloPiData data){
38+
this.data = data;
39+
repaint();
40+
}
41+
42+
private class AlgoCanvas extends JPanel{
43+
44+
public AlgoCanvas(){
45+
// 双缓存
46+
super(true);
47+
}
48+
49+
@Override
50+
public void paintComponent(Graphics g) {
51+
super.paintComponent(g);
52+
53+
Graphics2D g2d = (Graphics2D)g;
54+
55+
// 抗锯齿
56+
RenderingHints hints = new RenderingHints(
57+
RenderingHints.KEY_ANTIALIASING,
58+
RenderingHints.VALUE_ANTIALIAS_ON);
59+
hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
60+
g2d.addRenderingHints(hints);
61+
62+
// 具体绘制
63+
AlgoVisHelper.setStrokeWidth(g2d, 3);
64+
AlgoVisHelper.setColor(g2d, AlgoVisHelper.Blue);
65+
Circle circle = data.getCircle();
66+
AlgoVisHelper.strokeCircle(g2d, circle.getX(), circle.getY(), circle.getR());
67+
68+
for(int i = 0 ; i < data.getPointsNumber() ; i ++){
69+
Point p = data.getPoint(i);
70+
if(circle.contain(p))
71+
AlgoVisHelper.setColor(g2d, AlgoVisHelper.Red);
72+
else
73+
AlgoVisHelper.setColor(g2d, AlgoVisHelper.Green);
74+
75+
AlgoVisHelper.fillCircle(g2d, p.x, p.y, 3);
76+
}
77+
}
78+
79+
@Override
80+
public Dimension getPreferredSize(){
81+
return new Dimension(canvasWidth, canvasHeight);
82+
}
83+
}
84+
}

0 commit comments

Comments
 (0)