兄弟对象的高效邻近度计算?

时间:2012-03-07 15:13:24

标签: objective-c oop

所以我有一个World对象中存在的Agent对象集合。

这些特工需要检查他们的兄弟姐妹,并根据他们的接近程度采取某些行动。

目前我做以下事情。

  1. 世界决定是时候更新状态,它会这样做然后循环并将此消息传递给每个代理,以便它也更新状态。

  2. 然后每个Agent依次向World询问代理数组并继续循环检查每个代理的接近程度,看看它是否需要作用于哪个。

  3. 有更好的方法吗?我可以看到一个明显的低效率,即每次接近计算两次,每次接近一次。

1 个答案:

答案 0 :(得分:3)

根据代理的数量,您可能会发现,只要每个代理通过NSNotificationCenter进行更改,就可以更好地广播其位置。然后,每个代理将订阅此通知,并且每个代理都将在 实时 中了解每个代理的每个位置更改并相应地执行操作。这种方法可以在以后为您开辟一些可能性,例如,如果您想检查是否有任何代理执行某些操作,例如:“Agent抛出球;代理接收通知并决定接球”

因此,您的代理实现可能如下所示:

-(id)init
{
   ...
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(agentLocationDidChange:) name:NOTIF_AGENT_LOCATION_DID_CHANGE object:nil];

   return self;
}
-(void)agentLocationDidChange:(NSNotification *)notif
{
   Agent *agent = [notif object];
   if ([agent isEqual:self])
       return; //We don't care about our own actions

   if ([self isAgentCloseProximity:agent])
   { 
      //Do something
   }
}
-(BOOL)isAgentCloseProximity:(Agent *)agent
{
    CGFloat xDistance = agent.location.x - self.location.x;
    CGFloat yDistance = agent.location.y - self.location.y;
    CGFloat distance = sqrt((xDistance*xDistance)+(yDistance*yDistance));
    CGFloat threshold = ...; //<- this could be some constant that you define
    BOOL isClose = distance < threshold;
    return isClose;
}
-(void)changeLocation:(CGPoint)location
{
     //some logic to change my location
     ...
     [[NSNotificationCenter defaultCenter] postNotificationName:NOTIF_AGENT_LOCATION_DID_CHANGE object:self];
}