Originally Posted by Stepashka
Разбиваешь на 4 треугольника, считаешь площадь исходной фигуры и поучившихся треугольников, и сравниваешь, если равны значит внутри.
Вот нашел, когда-то давно написали совместно с [RD]Chez:
pawn Код:
//определение площали треугольника по координатам, по формуле Герона stock Float:SqrGeron(Float:ax, Float:ay, Float:bx, Float:by, Float:cx, Float:cy) { new Float:pSG,Float:aSG,Float:bSG,Float:cSG; aSG=floatsqroot(((cx-bx)*(cx-bx)+(cy-by)*(cy-by))); bSG=floatsqroot(((ax-cx)*(ax-cx)+(ay-cy)*(ay-cy))); cSG=floatsqroot(((ax-bx)*(ax-bx)+(ay-by)*(ay-by))); pSG=(aSG+bSG+cSG)/2; return floatsqroot((pSG*(pSG-aSG)*(pSG-bSG)*(pSG-cSG))); }
Meat(ID) { new Float:x1,Float:y1,Float:z1,Float:amg; new Float:distance = 9999999.9,Target=INVALID_PLAYER_ID; new Float:x2,Float:y2,Float:z2; GetVehiclePos(ID,x1,y1,z1); GetVehicleZAngle(ID,amg); //определение 4 точек у фигуры(плевать какая) new Float:a1 = x1 + 7.0*floatcos(amg-305, degrees);new Float:a2 = y1 + 7.0*floatsin(amg-305, degrees);//1 new Float:b1 = x1 + 8.5*floatcos(amg-305, degrees);new Float:b2 = y1 + 8.5*floatsin(amg-305, degrees);//2 new Float:c1 = x1 + 7.0*floatcos(amg-235, degrees);new Float:c2 = y1 + 7.0*floatsin(amg-235, degrees);//3 new Float:d1 = x1 + 8.5*floatcos(amg-235, degrees);new Float:d2 = y1 + 8.5*floatsin(amg-235, degrees);//4 for(new playerid;playerid < MAX_PLAYERS;playerid++) { if(IsPlayerConnected(playerid) && GetPlayerState(playerid) == 1 && !IsPlayerInVehicle(playerid,ID)) { GetPlayerPos(playerid,x2,y2,z2); if( distance > floatsqroot(floatpower(floatabs(floatsub(x1,x2)),2)+floatpower(floatabs(floatsub(y1,y2)),2)+floatpower(floatabs(floatsub(z1,z2)),2)) ) { distance = floatsqroot(floatpower(floatabs(floatsub(x1,x2)),2)+floatpower(floatabs(floatsub(y1,y2)),2)+floatpower(floatabs(floatsub(z1,z2)),2)); //собственно сама проверка, 0.05 погрешность if( -0.05 < SqrGeron(a1,a2,b1,b2,d1,d2)+SqrGeron(a1,a2,c1,c2,d1,d2) - (SqrGeron(a1,a2,b1,b2,x2,y2)+SqrGeron(a1,a2,c1,c2,x2,y2)+SqrGeron(x2,y2,b1,b2,d1,d2)+SqrGeron(x2,y2,d1,d2,c1,c2)) < 0.05 ) { Target = playerid; } } } } return Target; }
Данный код перебирает всех игроков, находит тех кто ближе всего к машине и попадает в определенную трапецивидную зону.
Вообще это кусок моего кода где комбайн может убить человека перемолов его в мясо, где-то тут вроде выложен. Зона - его жернова.
|