我有一个模拟,其中数千个代理(多像素精灵)移动到不同的方向。在模拟空间中存在假想的(未在空间中绘制)检测线,由它们的坐标指定。
检测和计算通过每条线的药剂的有效方法是什么? (只有当代理人第一次通过该线时才会被计算在内。)
我想到了两种简单的方法:
1-在每个模拟步骤中(在所有代理移动一个像素之后)绘制虚线并查看线条切割的代理,增加线条的计数器并将代理标记为通过特定线条。
2-对于每个“代理人移动”,检查它是否在线上(如何?每次画线?),然后再次将该行保存为通过并增加该行的计数器。
答案 0 :(得分:1)
我认为有很多对象和几行的好方法如下:
首先,在你的物体移动之后,你计算出一条线与它的中心的方程,如果它是偏离的(有效距离是它的半径以上),你检查物体是否接近线之前(通过附加到行的列表),如果是,则从该列表中删除引用。如果它足够接近,则对该对象的形状和线进行全面测试,如果它们相交,则将对象记录为“刚刚相交”,并将其引用添加到该行的附近对象列表中。
如果您的对象是数学点,并且您的线是无限的,则为对象提供一组布尔值,每个布尔值对应一条线,而真值表示方程式的正结果,而false表示负值,并检查如果标志刚刚翻转,则每次移动。每次翻转都表示该线的交叉点。
此方法允许正确检测交叉点,如果对象的形状很复杂,则排除不必要的计算(对于圆形,如果到线的距离小于半径,则它们相交)并跟踪持续超过的交叉点一次运动迭代。
答案 1 :(得分:1)
这个怎么样......
对于每个座席,找到所有线路的直线距离并存储最短距离值。
每次代理人移动时,请将距离减少1。
当距离变为零时,检查是否有任何线坐标与代理坐标相交。
如果是,请计算并将其标记为已计算。此代理无需进一步检查。转到步骤2以处理其他代理。
如果不是,请转到步骤1
在此算法中,无需将代理坐标与每个代理移动的线坐标进行比较。这样,效率很高。
第一步为每个代理花费O(N)时间,其中N是行数。