SA-MP Forums Archive
get closest point? - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: SA-MP Scripting and Plugins (https://sampforum.blast.hk/forumdisplay.php?fid=8)
+--- Forum: Scripting Help (https://sampforum.blast.hk/forumdisplay.php?fid=12)
+---- Forum: Help Archive (https://sampforum.blast.hk/forumdisplay.php?fid=89)
+---- Thread: get closest point? (/showthread.php?tid=198250)



get closest point? - The_Gangstas - 11.12.2010

e,g i have 4 points, i want to get the one closest to the player


Re: get closest point? - Mauzen - 11.12.2010

You can use a for loop for that

Pseudo:
pawn Код:
new Float:min = 9999.9;
new minindex;
new Float:distance;
new Float:px, Float:py, Float:pz;
GetPlayerPos(playerid, px, py, pz);
// pointx/y/z[] is an array, that contains all the points you want to get the nearest from
for(new i = 0; i < sizeof(pointx); i ++)
{
    distance = PointToPoint(px, py, pz, pointx[i], pointy[i], pointz[i]);
    //Change this to your function to get the distance
    if(distance < min)
    {
        minindex = i;
        min = distance;
    }
}



Re: get closest point? - The_Gangstas - 11.12.2010

whats pointtopoint? this?

pawn Код:
stock Float:GetDistanceBetweenPoints(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2)
{
    x1 -= x2;
    y1 -= y2;
    z1 -= z2;
    return floatsqroot((x1 * x1) + (y1 * y1) + (z1 * z1));
}
btw i want to return the x and y of the closest point


Re: get closest point? - Mauzen - 11.12.2010

Yes, you can use that function, it does the same.


Re: get closest point? - The_Gangstas - 11.12.2010

did you make a mistake?

pawn Код:
distance = PointToPoint(px, py, pz, ClosestBurgerShots[i], ClosestBurgerShots[i], ClosestBurgerShots[z]);
u put 2 i's and one z. im just wondering where did the z come from, and

pawn Код:
if(distance < min)
                    {
                        minindex = i;
                        min = distance;
                        new Loc[MAX_ZONE_NAME];
                        Get2DZone(Loc,ClosestBurgerShots[i], ClosestBurgerShots[i], ClosestBurgerShots[z]);
                        SetPlayerRouting(playerid, 1559.5081, -1290.5549,"Burger Shot In %s",Loc);
                    }
how do i set the routing to the closest one?
//edit also
pawn Код:
new Float:ClosestBurgerShots[][3] = {
{2366.3240,2071.0330,10.8203},
{2472.1331,2034.2130,11.0625},
{1873.4980,2071.7546,11.0625}
};



Re: get closest point? - Mauzen - 11.12.2010

Oops, yep, the z is wrong, corrected it.

In your case, the x/y/z are part of the array too, so you have to do it like this:

distance = PointToPoint(px, py, pz, ClosestBurgerShots[i][0], ClosestBurgerShots[i][1], ClosestBurgerShots[i][2]);

so that the x/y/z values of every point are used.
After using the code, ClosestBurgerShots[minindex] will be the closest point, so use your code after the for loop:

pawn Код:
//the whole code above here

new Loc[MAX_ZONE_NAME];
Get2DZone(Loc,ClosestBurgerShots[minindex][0], ClosestBurgerShots[minindex][1], ClosestBurgerShots[minindex][2]);
SetPlayerRouting(playerid, 1559.5081, -1290.5549,"Burger Shot In %s",Loc);