在两个圆的交叉区域中搜索常见对象

Search for common objects in a two circle intersection area

我正在解决一个可以用一系列要点来描述的任务:

  1. 两种用户类型:FighterArena

  2. 每个 Fighter 都可以在注册过程中自由设置他们的地理位置和首选搜索半径(稍后他们可以在他们的设置中更改这些值)。搜索半径,顾名思义,就是用户可以搜索到潜在对手的半径。

  3. 每个 Arena 对象都有其地理位置和可用性时间段。

  4. 如果两个战士匹配:他们的搜索圈相交并且相交区域包含至少一个 Arena.

  5. 如果
  6. Arena 位于 Fighter 的搜索范围内,则 Arena 可用。

我正在执行匹配逻辑。因此需要实现匹配算法。我正在努力找出正确的方法。

据我所知,一切都可以简化为寻找共同的 Arena。换句话说,可能有许多表会提供有关每个 Fighter 可用的 Arena 的信息。也就是说,例如 Fighterid 98 有 Arenas 和 ids 34, 57, 22,另一个 id 17 的用户有 Arenas ids 156, 57.

userId = 98; available_arenas = [34, 57, 22];
userId = 17; available_arenas = [156, 57];

通过比较可用Arenaids我们可以看到他们有一个Arena是共同的,它的id是57。所以我假设基于这一事实,可以肯定地说,他们的搜索圈相交,并且有一个 Arena 可能会发生战斗事件。

我认为这种方法可以用来判断 Fighter 是否匹配。我想,但我不能说基于这个想法的搜索是否有效,我看到它有以下困难:每个 Fighter/ 都应该支持所有这些 Arena 列表Arena。所以,如果,比方说,一些新的 Arena 被添加到数据库中,形象地说,所有那些 Fighteravailable_arenas 列表必须立即更新......这也可能是一个非常耗时的操作。如果注册了新的 Fighter,则必须计算他们可用的 Arena 的个人列表。如果一个已经存在的 Fighter 改变了它的地理位置,他们的 Arena 也必须重新计算等等。

另一种方法可能是做同样的事情,但不将那些 Arena ids 存储在数据库中。给定 Fighter(long, lat, r) 参数和 Arena.

(long, lat) 参数,即时进行所有计算

我相信还有一些更好的方法。我想听听您对我的看法,如果您知道更好的方法,我也想知道。

我正在使用 PostgreSQL 13 作为 DBMS。

我认为没有太多的解决方案,提供这种战斗机竞技场结构。您可以尝试将您的竞技场位置分组(按地区、锚点位置或类似位置),看看是否可以减少搜索的权重。 另一个想法可能是为每个竞技场也存储一个 available-fighters 列表。每次战斗机旅行时,它都会检查新的竞技场,对于那些不再可用的竞技场,它可以向他们发送一条消息,将其从列表中删除。那么这个竞技场所有可能的战斗都是其available-fighters

中所有可能的组合