我有以下Python代码来生成随机圆圈以模拟布朗运动。我需要找到小红圈的总面积,以便我可以将它与更大的蓝圈的总面积进行比较。由于圆是随机生成的,因此它们中的许多重叠使得难以找到该区域。我已经阅读了许多关于像素绘画等问题的其他回答。找到这些圆圈区域的最佳方法是什么?我不想修改圆圈的生成,我只需要在图上找到红色圆圈的总面积。
生成我需要的圆圈的代码如下(Python v.2.7.6):
import matplotlib.pyplot as plt
import numpy as np
new_line = []
new_angle = []
x_c = [0]
y_c = [0]
x_real = []
y_real = []
xy_dist = []
circ = []
range_value = 101
for x in range(0,range_value):
mu, sigma = 0, 1
new_line = np.random.normal(mu, sigma, 1)
new_angle = np.random.uniform(0, 360)*np.pi/180
x_c.append(new_line*np.cos(new_angle))
y_c.append(new_line*np.sin(new_angle))
x_real = np.cumsum(x_c)
y_real = np.cumsum(y_c)
a = np.mean(x_real)
b = np.mean(y_real)
i = 0
while i<=range_value:
xy_dist.append(np.sqrt((x_real[i]-a)**2+(y_real[i]-b)**2))
i += 1
circ_rad = max(xy_dist)
small_rad = 0.2
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
circ1 = plt.Circle((a,b), radius=circ_rad+small_rad, color='b')
ax.add_patch(circ1)
j = 0
while j<=range_value:
circ = plt.Circle((x_real[j], y_real[j]), radius=small_rad, color='r', fill=True)
ax.add_patch(circ)
j += 1
plt.axis('auto')
plt.show()
答案 0 :(得分:1)
包装Shapely可能有用:
https://gis.stackexchange.com/questions/11987/polygon-overlay-with-shapely http://toblerity.org/shapely/manual.html#geometric-objects
答案 1 :(得分:0)
我可以想到一个简单的方法,认为结果会有不准确之处:
使用Python在白色图像上绘制所有圆圈,在绘制圆圈时填充圆圈。最后,图像的每个“像素”将具有两种颜色中的一种:白色是背景,另一种颜色(假设是红色)表示像素被圆圈占据。
然后,您需要将红色像素的数量相加,然后将它们乘以绘制它们的比例。那时你将拥有该区域。
这是不准确的,因为无法使用方形像素绘制圆形,因此在映射中会失去准确性。请记住,绘制圆圈越大,不准确度就越小。