黃易群俠傳M脫機外掛應用程式黃易神行
2236
3

[發問] 問一下最近座標的寫法

agerchen 發表於 2009-11-16 03:41:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |
本帖最後由 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;
收藏收藏 分享分享 讚 幹 分享分享 FB分享
先為不可勝
以待敵之可勝
回覆

使用道具 舉報


agerchen 當前離線
UID
1307155
熱心
66 值
嘉獎
0 次
違規
0 次
在線時間
50 小時
經驗
66 點
積分
66
精華
0
最後登錄
2011-3-25
閱讀權限
20
註冊時間
2009-9-7
論壇幣
2176 幣
聯合幣
1 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
agerchen 2009-11-17 13:56:48
恩恩…我已經解決了,分享給大家參考一下,如果有更好的方式,請先進不吝指教。

procedure getbestpoint(target_x, target_y, target_z:single; var _x, _y, _z: single; _dist: 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));
  t_sin:=abs(arcsin(b/c));

  a:=cos(t_cos)*_dist;
  b:=sin(t_sin)*_dist;

  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;
先為不可勝
以待敵之可勝
回覆

使用道具 舉報

zsnoopy 當前離線
UID
427958
熱心
190 值
嘉獎
0 次
違規
0 次
在線時間
245 小時
經驗
193 點
積分
193
精華
0
最後登錄
2014-1-9
閱讀權限
20
註冊時間
2007-7-5
論壇幣
6393 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
12000 點
查看詳細資料
Rank: 2Rank: 2
zsnoopy 2009-11-21 13:27:20
起先看到cos、sin值,我就想,我都忘光光了 = =
後來畫一下小圖,就大概知道了。
不錯,用這樣的觀念很好唷。
回覆

使用道具 舉報

upupto 當前離線
UID
1404348
熱心
25 值
嘉獎
0 次
違規
0 次
在線時間
2 小時
經驗
29 點
積分
29
精華
0
最後登錄
2011-9-28
閱讀權限
20
註冊時間
2010-2-5
論壇幣
53 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
upupto 2011-9-11 01:56:18
感谢分享,先收藏,
回头来看
YCT49B
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊


手機版 | Archiver | 外掛聯合國

GMT+8, 2024-11-24 12:37 , Processed in 0.049884 second(s), 17 queries , Memcache On.

版權說明:
  本站不會製作、經銷、代理外掛程式。僅免費提供外掛程式下載前之掃毒及掃木馬等安全檢測驗證,協助會員遠離盜號危險程式。本站所有資料均來自網際網路收集整理,說明文字暨下載連結轉載自原程 式開發站。站上出現之公司名稱、遊戲名稱、程式等,商標及著作權,均歸各公司及程式原創所有,本站程式所有權歸外掛聯合國所有。本程式所有權歸外掛聯合國所有.......

回頂部
第二步?
第三步?