从密度图中删除旧的重叠圆(陨石坑)

2024-04-25 11:40:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个代码来绘制陨石坑密度图。基本上,每一个新的陨石坑都被绘制成一个圆圈,圆圈可以相互重叠(因为新的陨石坑可以抹去旧的陨石坑)。我想知道是否有任何方法可以删除已经覆盖的圆,或者创建一个计数器来只计算有多少个不间断的圆?我的目标是计算有多少“新鲜”的陨石坑(圆圈)没有被其他陨石坑抹去。第一个代码是我创建和绘制这些圆的代码(xx+1,yy+1是为了添加“阴影”效果)

fig, ax = pl.subplots()

#this is going to create a random list to pull center coordinates from
xcenter = np.random.randint(501, size = 500)
ycenter = np.random.randint(501, size = 500)
#start a counter at 0 so we can see the progression of time
time = 0
#now to zip the x and y center coordinates and make circles
for xx, yy in zip(xcenter, ycenter): 
    cratershadow = Circle((xx, yy),5, color = 'b')
    ax.add_patch(cratershadow)
    crater = Circle((xx+1, yy+1), 5, color = 'c')
    ax.add_patch(crater)
    time += 1
#setting the axiis(?) to be up to 500 km
ax.set_xlim((0,500))
ax.set_ylim((0,500))
pl.xlabel("X side, 500 km Field")
pl.ylabel("Y side, 500 km Field")
pl.title("Crater Density Plot - 500,000 years")
pl.show()

Tags: theto代码time绘制randomaxpl
1条回答
网友
1楼 · 发布于 2024-04-25 11:40:24

你需要记住所有以某种形式出现的陨石坑list,并在任何新添加的一个检查点上检查交点/重叠。如果任何弹坑完全在内部,则将其从list上移除。仅打印list的最终结果

您还可以创建一个时间线结构,其中每个陨石坑都有开始和结束时间,因此不必从列表中删除,只需将其结束时间从无穷大设置为添加新陨石坑的时间。这样,可以随时间设置密度的动画

对不起,我不是Python编码器,但在C++中,它会是这样的:

struct _crater
 {
 int x,y,r; // center and radius
 int t0,t1; // start and end time
 };

List<_crater> crater;

要检查两个陨石坑是否相交/重叠,您可以测试它们的距离

int d=sqrt(((crater[i].x-crater[j].x)*(crater[i].x-crater[j].x))+((crater[i].y-crater[j].y)*(crater[i].y-crater[j].y)));
if (d>=crater[i].r+crater[j].r); // too far away or just touching
if (d< crater[i].r+crater[j].r); // intersect or overlap
if (crater[i].r>=crater[j].r)
 if (d<=crater[i].r-crater[j].r); // i fully covers j

如果你实施了时间线,你需要只考虑当前的陨石坑。。。忽略其他的

为了加快速度,您可以使用排序和二进制搜索

相关问题 更多 >