Hallar la coordenada mбs cerca
#1

Buenas, pues me gustarнa saber como hago para que en un bucle (por ejemplo), que albergue 10 diferentes coordenadas x,y,z, se pueda saber cual es la coordenada mбs cerca del jugador.. No sй si me explique

Bueno jaja espero me hallan entendido y me puedan ayudar, un saludo.
Reply
#2

Si puedes dйjanos la matriz con las coordenadas y te desarrollarй el cуdigo.

Bбsicamente tienes que hacer una comparaciуn entre todos los valores, para ver cuбl estб mбs cerca.
Reply
#3

Pues lo usarй para un sistema dinбmico, no sй mira como...

Te dejo todo lo que se usarнa mбs o menos :P

pawn Код:
#define MAX_NEGOCIOS            80

// el enum incompleto, solo los necesarios para esta funcion...
enum NegociosData
{
        Float:nExteriorX,
    Float:nExteriorY,
    Float:nExteriorZ,
        nTipo
};
new Negocio[MAX_NEGOCIOS][NegociosData];
Osea, son 80 negocios, mi idea es que en el /gps den click en la opciуn de 'Encontrar 24/7 mбs cercano' (El 24/7 serнa el nTipo = 1), me entiendes? Espero que si :P

Osea, no te puedo pasar las coordenadas exactas, lo que necesito es algo que compruebe cual de todos los 24/7 estб mбs cerca
Reply
#4

Comprendo, en breve modificarй el mensaje para aсadir el cуdigo.
Reply
#5

pawn Код:
new b = -1, Float:tmpDist = 9999.0;

for (new i = 0; i < MAX_NEGOCIOS; i++) {
    if (Negocio[i][nTipo] == <tipo de negocio>) {
        new Float:dist = GetPlayerDistanceFromPoint(playerid, Negocio[i][nExteriorX], Negocio[i][nExteriorY],  Negocio[i][nExteriorZ]);

        if (dist < tmpDist) {
            tmpDist = dist;
            b = i;
        }
    }
}

// ahora b vale el negocio mбs cercano, y -1 si no encontrу
Reply
#6

Quote:
Originally Posted by spell
Посмотреть сообщение
pawn Код:
new b = -1, Float:tmpDist = 9999.0;

for (new i = 0; i < MAX_NEGOCIOS; i++) {
    if (Negocio[i][nTipo] == <tipo de negocio>) {
        new Float:dist = GetPlayerDistanceFromPoint(playerid, Negocio[i][nExteriorX], Negocio[i][nExteriorY],  Negocio[i][nExteriorZ]);

        if (dist < tmpDist) {
            tmpDist = dist;
            b = i;
        }
    }
}

// ahora b vale el negocio mбs cercano, y -1 si no encontrу
Gracias, te amo

Edit: Probando algo a veces me salen hasta 3 negocios, pero normalmente sуlo 1 que es el mбs cerca, їa que se debe esto? Gracias!
Reply
#7

spell se me ha adelantado, pero aсadirй una pequeсa explicaciуn. El principio aplicado es el mismo que el de la soluciуn anterior ya que es el mбs rбpido.

Teniendo en cuenta que el mapa del GTA San Andreas es bбsicamente un cuadrado y las coordenadas en el eje X/Y van del -3000 hasta 3000, deducimos que de una esquina a otra habrб una distancia de 6000. La distancia mбxima que podrнa haber estarнa en la diagonal de dicho cuadrado (aproximadamente 8485,28 metros), se calcula aplicando el Teorema de Pitбgoras.

Redondeamos la distancia mбxima a 8600 y aplicamos bбsicamente lo que spell puso mбs arriba.

PHP код:
stock GetNearestBusiness(playeridtipo) {
    
    new 
ID_cercana = -1,
        
Float:Pos 0.0,
        
Float:maxPos 8600.0;
    for (new 
0MAX_NEGOCIOSi++)
    {
        if (
Negocio[i][nTipo] == tipo)
        {
            
Pos GetPlayerDistanceFromPoint(playeridNegocio[i][nExteriorX], Negocio[i][nExteriorY], Negocio[i][nExteriorZ]);
            
            if (
Pos <= maxPos) {
                
maxPos Pos;
                
ID_cercana i;
            }
        }
    }
    
    return 
ID_cercana;

Se hace un bucle a travйs de todos los negocios que tienen nTipo = tipo, se saca la distancia desde el jugador hasta tal negocio y se compara a la distancia mбxima posible. Si la distancia obtenida (Pos) es menor a la mбxima distancia, tomarб el lugar de "mбxima distancia" (maxPos). Luego, cualquier distancia que sea menor que la mбxima distancia, serб el negocio mбs cercano (ID_cercana).

EDIT: visto el cуdigo, solo es posible que devuelva un valor. Como mucho serнa posible que dos o mбs negocios se encuentren a la misma distancia. Ya he modificado el cуdigo.
Reply
#8

Ahora si! ЎЎMuchas gracias a los dos!!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)