1、pi的计算有好多方法,比较好算的一个是蒙特卡洛方法,它利用圆与其外接正方形面积之比为pi/4的关系,通过大量均匀分布点,计算落在单位圆和单位正方形的数量之比再乘以4便得到pi的近似值。也就是这个性质:正方形内部有一个相切的圆,它们的面积之比是π/4(初中数学学的)
2、方法:1)给出随机点,画圆2)通过距离判断点在圆内还是圆外,然后统计圆内点的数量import cv2 as cvimport numpy as npimport copyimport osfrom random import randomfrom random import randintfrom math import sqrtimage = np.zeros((500, 500, 3), dtype="uint8")red = (0, 0, 255) #8green = (0, 255, 0)cv.rectangle(image, (0, 0), (500, 500), red)cv.imshow("rectangle", image)这是一个500*500的正方形,500是为了看起来方便,毕竟取1太小了看不见。
3、给出样本值num = 1000 样本值drawpoint = 0 打点数量for i in range(1,num): x,y=randint(0,500),randint(0,500) 随机整数 point = (x,y) cv.circle(image, point, 1, green, 1) 打点 position = sqrt(x**2+y**2) if position <= 500: # 统计比较 drawpoint = drawpoint+1 累加 pi = 4*(drawpoint/num) 求PIprint(pi)cv.imshow("drawpoint", image)我们随机打出了num个点。
4、画内切圆,这样就好看了ptCenter = (0, 0) # 中心点位置axesSize = (500, 500) # 长轴半径为500,短轴半径为500rotateAngle = 0 # 旋转角度为 0startAngle = 0endAngle = 360point_color = (0, 0, 255)thickness = 1lineType = 1cv.ellipse(image, ptCenter, axesSize, rotateAngle, startAngle, endAngle, point_color, thickness, lineType)cv.imshow("pi", image)cv.waitKey(0)
5、再看PI的数值3.156 样本数 1000
6、我们再增加样本数 10000 观察PI是多少看到无数点点 密集恐惧症啊。。。PI = 3.1504
7、在增加100000PI =3.13428所以样本点越多,计算出的数据将会越接近真识的pi