Monte Carlo法结合JFrame实现Pi近似的Java程序点着色问题求助
问题排查与修复方案
你的代码存在3个核心错误,逐一修复即可实现预期效果:
- 绘图逻辑顺序颠倒:你当前是先调用
g.fillOval()绘制点,再调用g.setColor()设置颜色,这会导致当前点的颜色始终是上一个点的设置,完全不生效。正确顺序是先设置颜色,再绘制图形。 - 采样坐标范围错误:如果你的圆是圆心在(250,250)、半径250的正圆,采样区域应该是x和y都在0500的正方形范围,你当前x仅取250500、y仅取0~250,只覆盖了1/4的采样区域,会导致Pi计算结果也出现偏差。
- 圆内点判断逻辑完全错误:点在圆内的判定标准是「点到圆心的距离平方 ≤ 半径平方」,你写的
applyformula == y || (y*y) - 500 * y < applyformula没有任何数学依据,直接替换为正确的判定条件即可。
修正后核心代码
// 采样范围覆盖0~500的完整正方形 for(int i = 0; i<1000; i++) { double x = Math.random() * 500; double y = Math.random() * 500; double disSquare = (x - 250)*(x - 250) + (y - 250) * (y - 250); // 半径250的平方为62500,小于等于则在圆内 if(disSquare <= 62500) { g.setColor(Color.GREEN); } else { g.setColor(Color.RED); } // 先设颜色再绘制 g.fillOval((int) x,(int) y, 5, 5); }
如果不需要完整正方形采样,只需要采样右上四分之一区域计算Pi,可以把x和y范围都设为250~500,判定条件保持不变即可,最终计算Pi的时候对应调整系数就行。
内容的提问来源于stack exchange,提问作者Clever
相关产品推荐
相关产品推荐

