Quote:
Originally Posted by ZiGGi
Прошу помощи, у самого с геометрией туго. Нужна функция, которая бы определяла находится ли точка внутри плоскости, которая задана четырьмя точками.
|
Разбиваешь на 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;
}
Данный код перебирает всех игроков, находит тех кто ближе всего к машине и попадает в определенную трапецивидную зону.
Вообще это кусок моего кода где комбайн может убить человека перемолов его в мясо, где-то тут вроде выложен. Зона - его жернова.