SA-MP Forums Archive
[Ajuda] Como obter a posiзгo mais prуxima? - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Português/Portuguese (https://sampforum.blast.hk/forumdisplay.php?fid=34)
+---- Thread: [Ajuda] Como obter a posiзгo mais prуxima? (/showthread.php?tid=375351)



Como obter a posiзгo mais prуxima? - arakuta - 06.09.2012

Comeo faзo pra obter a posiзгo mais proxima, por exemplo:

pawn Код:
GetPlayerPos(playerid,x,y,z); // Obtenho a posiзгo a ser comparada
Entгo eu comparo com todas

pawn Код:
new Float:positions[2][3] = {
{2297.1064,2452.0115,10.8203},
{2297.0452,2468.6743,10.8203}
};
E seto a posiзгo do player nessa posiзгo que й a mais prуxima.

Alguйm sabe?


Re: Como obter a posiзгo mais prуxima? - paulor - 06.09.2012

pawn Код:
ReturnPosProx(playerid) {
    new Dist[3] = { 0xFFFF, ... };
    for(new i = (sizeof(positions) - 1); i > -1 --i) {
        if((Dist[1] = GetPlayerDistanceFromPoint(playerid, positions[i][0], positions[i][1], positions[i][2])) < Dist[0]) {
            Dist[0] = Dist[1];
            Dist[2] = i;
        }
    }
    return Dist[2];
}

//Utilizando
new Prox = ReturnPosProx(playerid);
SetPlayerPos(playerid, positions[Prox][0], positions[Prox][1], positions[Prox][2]);
Nгo testei, mas й para funcionar!


Re: Como obter a posiзгo mais prуxima? - leonardo1434 - 06.09.2012

Paulor nгo deveria ser uma float? axo que seria assim..

pawn Код:
stock ReturnPosProx(playerid)
{
    static Float:result[2], i = 0,part;
    for(; i < sizeof positions; ++i)
    {
        result[0] = GetPlayerDistanceFromPoint(playerid, positions[i][0], positions[i][1], positions[i][2]);
        if(result[0] > result[1])
        {
           result[1] = result[0];
           part = i;
        }
    }
    return part;
}



Re: Como obter a posiзгo mais prуxima? - paulor - 06.09.2012

Esqueci desse detalhe, Corrigido! E o seu vai pegar a distancia maior e nгo a menor!

pawn Код:
ReturnPosProx(playerid) {
    new Float: Dist[2] = {65535.0, ...}, ReturnId;
    for(new i = (sizeof(positions) - 1); i > -1; --i) {
        if(Dist[0] > (Dist[1] = GetPlayerDistanceFromPoint(playerid, positions[i][0], positions[i][1], positions[i][2]))) {
            Dist[0] = Dist[1];
            ReturnId = i;
        }
    }
    return ReturnId;
}

//Utilizando
new Prox = ReturnPosProx(playerid);
SetPlayerPos(playerid, positions[Prox][0], positions[Prox][1], positions[Prox][2]);



Re: Como obter a posiзгo mais prуxima? - leonardo1434 - 06.09.2012

Nгo po, vai pegar a maior, pensa comigo.
pawn Код:
digamos que o resultado 1 й  = 50m ( no caso result[0])
ele irб comparar com o segundo resultado que estб nulo se for maior, ele definirб como maior. (result[1])
entгo sempre que o result[0] for maior que o resulte anterior, ele serб substiuido.
cada vez que for maior, ele vai substituir, e assim por diante.


a mesma lуgica que vocк usou nesta sua nova versгo.


Re: Como obter a posiзгo mais prуxima? - paulor - 06.09.2012

Quote:
Originally Posted by leonardo1434
Посмотреть сообщение
Nгo po, vai pegar a maior, pensa comigo.
pawn Код:
digamos que o resultado 1 й  = 50m ( no caso result[0])
ele irб comparar com o segundo resultado que estб nulo se for maior, ele definirб como maior. (result[1])
entгo sempre que o result[0] for maior que o resulte anterior, ele serб substiuido.
cada vez que for maior, ele vai substituir, e assim por diante.


a mesma lуgica que vocк usou nesta sua nova versгo.
Nгo, ele deseja que retorne a Posiзгo mais prуxima do Player, a sua funзгo vai retornar a mais distante do Player.


Re: Como obter a posiзгo mais prуxima? - leonardo1434 - 06.09.2012

minha falha, pensava que era o mais distante. lol.


Re: Como obter a posiзгo mais prуxima? - Jason` - 06.09.2012

Quote:
Originally Posted by leonardo1434
Посмотреть сообщение
Paulor nгo deveria ser uma float? axo que seria assim..

pawn Код:
stock ReturnPosProx(playerid)
{
    static Float:result[2], i = 0,part;
    for(; i < sizeof positions; ++i)
    {
        result[0] = GetPlayerDistanceFromPoint(playerid, positions[i][0], positions[i][1], positions[i][2]);
        if(result[0] > result[1])
        {
           result[1] = result[0];
           part = i;
        }
    }
    return part;
}
Prevejo problemas com o static...