PDA

Просмотр полной версии : Помогите высчитать координаты перемещения


Johnson
28.11.2009, 13:20
Здравствуйте, уважаемые!
Пытаюсь сделать автоматические преследование (как в валкере), столкнулся с проблеммой: не могу рассчитать координаты, куда должен бежать ведомый (совсем забыл геометрию)
Быть может есть у кого готовый кусок кода, отвечающий за это?

Насколько я понял, сначала нужно высчитать угол наклона гипотенузы (от лидера к ведомому), зная длины катетов (разность между координатами).
Потом нужно высчитать длины катетов (разность координат между лидером и необходимой точкой), зная длину и угол наклона катета...

Кто хорошо помнит матчасть - помоги пожалуйста)
Заранее благодарен!

Fer123
28.11.2009, 14:33
Если я не ошибаюсь в волкере ведомый получает координаты передвижения ведущего из пакета 01=MoveToLocation:d(ObjectID)d(DestX)d(DestY)d(Des tZ)d(CurX)d(CurY)d(CurZ) для t0

alexteam
28.11.2009, 15:25
вообщето вопрос был по расчету.. а не как словить координаты.

углы катeтов.. гм...достаточно "процентального" коофициента.
кусок с моего бота:

TL2SpawnObject = class(TL2Object)
x, y, z : real;
Procedure MoveTo(dist:real);
Function DistanceTo(dtox,dtoy,dtoz:integer):real;overload;
end;

function TL2SpawnObject.DistanceTo(dtox, dtoy, dtoz: integer): real;
begin
result := sqrt(sqr(dtox-x)+sqr(dtoy-y));
result := sqrt(sqr(result)+sqr(dtoz-z));
if result = 0 then result := 0.1; //anti div 0
end;

procedure TL2SpawnObject.MoveTo(dist: real);
var
coof : real;
runx, runy, runz : integer;
begin
coof := dist/DistanceTo(SelfData.x, SelfData.y, SelfData.z);
runx := round(X + coof*(SelfData.x - X));
runy := round(Y + coof*(SelfData.y - Y));
runz := round(z + coof*(SelfData.z - Z));
CallMoveBackwardToLocation(runx, runy, runz);
end;

где SelfData.x/y/z собственные координаты
L2SpawnObject.X/Y/Z координаты объекта к которому производиться движение
dist - требуемая дистанция до объекта. dist может принимать отрицательное значение если нужно забежать за объект

TAMBIK
28.11.2009, 16:12
от ведущего брать кординаты из пакета ValidatePosition
от ведомого брать кординаты из пакета ValidatePosition
и ведомый отправляет MoveBackwardToLocation
WriteD(X от ведущего);
WriteD(Y от ведущего);
WriteD(Z от ведущего);
WriteD(X от ведомого);
WriteD(Y от ведомого);
WriteD(Z от ведомого);

Johnson
29.11.2009, 20:08
TAMBIK, так можно ибез знания матчасти) до встречи с первым попавшимся ГМом... дело в том, что ведомый персонаж будет вставать ровно на позичию ведущего (как бы внутрь него)... даже для самого глупого и бухого ГМа будет налицо использование сторонних программ.

TAMBIK
29.11.2009, 20:12
Johnson,
x - 50
Y -50
разница

Johnson
29.11.2009, 23:09
TAMBIK, если я побегу "против шерсти" координат - ведомый будет забегать вперед. Тоже не вариант. Ответ уже дан, зачем поднимать тему?

Добавлено через 19 минут
Мм... Попробовал сейчас внедрить в свой скрипт... Бегает то он бегает, да вот как попало бегает :)
Использую вот так:

function DistanceTo(dtox, dtoy, dtoz: integer): real;
begin
result := sqrt((dtox-myX)*(dtox-myX)+(dtoy-myY)*(dtoy-myY));
result := sqrt(result*result+(dtoz-myZ)*(dtoz-myZ));
if result = 0 then result := 0.1; //anti div 0
end;

procedure MoveTo(locX,locY,locZ:integer);
var
coof : real;
runx, runy, runz : integer;
begin
coof := 100/DistanceTo(locX, locY, locZ);
runx := round(myX + coof*(locX - myX));
runy := round(myY + coof*(locY - myY));
runz := round(myZ + coof*(locZ - myZ));
MBTL(runx, runy, runz);
end;

где myX,myY,myZ - координаты ведомого.
MBTL - процедура, остылающая MoveBackwardToLocation

Добавлено через 1 минуту
Вобщем в любом случае нужен алгоритм поиска координат, которые лягут по вектору чуть позади заданой точки...

TAMBIK
29.11.2009, 23:20
http://coderx.ru/showpost.php?p=31848&postcount=22

Johnson
30.11.2009, 00:12
я думал конечно над условиями такими... но посчитал просчет вектора более правильным и реалистичным... если ни чего не получится - придётся делать условия...
PS: вопрос остаётся в силе )

alexteam
30.11.2009, 11:53
ну.. да.. при переписывании чужого кода нужно быть внимательней...


//Так правильней.
runx := round(LocX + coof*(myX - locX));
runy := round(LocY + coof*(myY - locY));
runz := round(LocZ + coof*(myZ - locZ));

TAMBIK
30.11.2009, 14:42
function rastoyanie(xpos1, ypos1, xpos2, ypos2:extended):integer; //возвращ rezu растояние
begin
result:= Round(Sqrt(((xpos1-xpos2)*(xpos1-xpos2))+((ypos1-ypos2)*(ypos1-ypos2))));
end;

Johnson
01.12.2009, 09:42
TAMBIK, это просто просчет расстояния от точки до точки... его я и сам догадался как посчитать =)

TAMBIK
22.12.2009, 15:06
// min - растояние от куда идем до где нам быть
// startX - кординаты куда идем
// startY - кординаты куда идем
// myXpos - кординаты чара
// myYpos - кординаты чара
// xxx - кординаты на растояние min от кординат куда идем
// yyy - кординаты на растояние min от кординат куда идем
// rast - растояние от чара до куда идем
// count - скоко отрезков длиной min будит на отрезке от чара до куда идем
rast:=dist(startX,startY,MyXpos,MyYpos);
count:=Round(rast/min);
xxx:=Round((MyXpos+startX*count)/(1+count));
yyy:=Round((MyYpos+startY*count)/(1+count));