3

我有一个模拟,其中数千个代理(多像素精灵)移动到不同的方向。在模拟空间中有假想的(未在空间中绘制)检测线,由它们的坐标指定。

检测和计数通过每条线的代理的有效方法是什么?(只计算代理第一次通过线路)。

我想到了两个简单的方法:

1- 在每个模拟步骤中(在所有代理移动一个像素之后)绘制假想线并查看线切割哪些代理,增加线的计数器并将代理标记为通过特定线。

2-对于每个“代理移动”,检查它是否在线(如何?每次都画线?),然后再次将线保存为通过并增加线的计数器。

在此处输入图像描述

4

2 回答 2

1

我认为一个有很多对象和几行的好方法如下:

首先,在您的对象移动后,您计算一条线与其中心的方程,如果它偏离了(有效距离大于其半径),您检查对象是否靠近之前的线(通过附加的列表到一行),如果是,则从该列表中删除引用。如果它足够接近,则对该对象的形状和线进行彻底测试,如果它们相交,则将其记录为“刚刚相交”,并将其引用添加到线的附近对象列表中。

如果你的对象是数学点,你的线是无限的,你给你的对象一组布尔值,每个对应一条线,真值表示等式的正结果,假表示负,并检查每一步如果标志刚刚翻转。每次翻转都表示越线。

此方法允许正确检测交叉点,如果对象的形状复杂,则排除不必要的计算(对于圆,如果到线的距离小于半径,则它们相交)并跟踪持续超过一次迭代的交叉点移动。

于 2013-05-14T05:50:11.890 回答
1

这个怎么样...

  1. 对于每个代理,找到所有线的直线距离并存储最短距离值。

  2. 每次代理移动时,将距离减少 1。

  3. 当距离变为零时,检查是否有任何线坐标与代理坐标相交。

  4. 如果是,请计数并将其标记为已计数。无需对此代理进行进一步检查。转至步骤 2 处理其他代理。

  5. 如果否,请转到步骤 1

在该算法中,无需为每个代理移动将代理坐标与线坐标进行比较。这样,它是有效的。

每个代理的第一步需要 O(N) 时间,其中 N 是行数。

于 2013-05-14T08:37:06.473 回答