本帖最後由 agerchen 於 2009-11-16 03:45 編輯
目前遇到一個小問題,不是很大但還是有點困擾...
那就是取得最近座標的問題,我稍微解釋一下大家就明白
比如說 金幣的座標在 x0 y0 z0 但是我們要移動去撿,我現在的做法是直接移動到 x0 y0 z0 的上面再撿…但是這樣有點誇張,一般都是移動到離自已距離為3的最近點再撿,我的問題就是怎麼算出那個最近點的座標。
我測試用的算法是…
先利用物品與自已的座標算出 cos 與 sin 的值
再利用 3(這是斜邊長, 實際是用2.91) * cos 算出 x 座標
3 * sin 算出 y 座標
但是這樣算出來的值還是有點出入…距離是正確,但是角度不正確
有大大能幫忙一下嗎?下面是我的程式碼
// target 是物品座標
// curr 是人物座標
// _x _y _z 是最近座標
procedure getbestpoint(target_x, target_y, target_z:single; var _x, _y, _z: single);
var
a, b, c, t_cos, t_sin: single;
begin
//先取cos
a:=max(target_x, din1.curr_x)-min(target_x, din1.curr_x);
b:=max(target_y, din1.curr_y)-min(target_y, din1.curr_y);
c:=getdist(target_x, target_y, target_z, din1.curr_x, din1.curr_y, din1.curr_z);
t_cos:=abs(arccos(a/c)*57.29578);
t_sin:=abs(arcsin(b/c)*57.29578);
//已知邊長為2.91
a:=cos(t_cos)*0.291;
b:=sin(t_sin)*0.291;
if (din1.curr_x>target_x) then
begin
_x:=target_x-a;
end
else
begin
_x:=target_x+a;
end;
if (din1.curr_y>target_y) then
begin
_y:=target_y-b;
end
else
begin
_y:=target_y+b;
end;
_z:=target_z;
end; |