寻找xyz之间的最小距离

时间:2014-01-23 21:29:05

标签: c++ position distance

嗨,好吧就这么说吧。 我们有12名球员,我想做的就是找到最接近的球员。

我在下面写了一些代码;我尝试的两个版本(相信我他们的更多,现在可以写圣经)

/*int client::closestEnemy()
{
    for(u32 i = 0; i<12; i++)
    {
        DbgPrint("i: %i\n", i);
        u32 index = 0;
        if(!p[i].exist() || !p[i].alive() || p[i].team() == 3 || i == s.index) 
                 continue;

        for(u32 o = 0; o<12; o++) 
                 if(vec.distance(*pos(), *p[i].pos()) <= vec.distance(*pos(), *p[o].pos()) || vec.distance(*pos(), *p[i].pos()) == vec.distance(*pos(), *p[o].pos()))
                       index++;
        DbgPrint("PLAYER %s INDEX = %i\n", p[i].readName(), index);

        if(index>10)  
            return i;

        index = 0;
    }
    return -1;
}*/


int client::closestEnemy()
{
    float distacnes[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    u32 index = 0;
    for(u32 i = 0; i<12; i++)
        if(p[i].exist() || p[i].alive() || p[i].team() != 3 || i != s.index) 
             distacnes[i] = vec.distance(*pos(), *p[i].pos()); 
        else 
             continue;

    for(u32 i = 0; i<12; i++) 
         if(distacnes[i]<distacnes[i+1]) 
             index++;

    DbgPrint("Score = %i\n", index);

    if(index>11) 
        return index;

    return -1;
}

我正在做的只是当另一个客户距离大于我的时候,将指数增加1。

现在第一个是最好的选择,但有时候没有创建一个足够高的索引,这是没有意义的,因为至少有一个客户必须有一个比其他人更小的距离。

1 个答案:

答案 0 :(得分:3)

首先,我猜一些缩进会有所帮助。 然后,没有必要存储所有距离。您可以跟踪到目前为止遇到的最小距离,如下所示:

int client::closestEnemy()
{
    int index = -1;
    float minDistance;
    for(u32 i = 0; i<12; i++) {
        if(p[i].exist() || p[i].alive() || p[i].team() != 3 || i != s.index) {
            float distance = vec.distance(*pos(), *p[i].pos());
            if (index == -1 || distance < minDistance) {
                index = i;
                minDistance = distance;
            }
        }
    }

    return index;
}