一個用於 UBOAT 潛艇戰術遊戲的 AOB(Angle on Bow,目標艦首角)計算器。
本程式根據潛望鏡觀測資料與目標艦資料計算:
- 目標艦相對於潛艇的基本角度
θ - 根據目標艦所在位置,計算完整的
AOB
本程式提供兩種操作模式:
- GUI 模式:預設啟動,使用 GTK 圖形介面
- CLI 模式:使用
-k參數啟動命令列介面
程式使用:
其中:
| 變數 | 含義 |
|---|---|
N |
潛望鏡整圓包含的總刻度數,例如 1.5× 一般為 4800,6× 一般為 1200 |
M |
目標艦在潛望鏡視野內占據的橫向刻度 |
D |
目標艦距離 |
Z |
潛望鏡放大倍率 |
L |
目標艦實際長度 |
注意:目前公式中的 D 與 L 必須使用與公式推導一致的單位。
程式首先計算:
然後計算:
由於 C 語言的 asin() 返回值為弧度,因此程式會將結果轉換為角度。
程式將目標相對於我船的位置分為四個象限。
| 象限 | 位置 | AOB |
|---|---|---|
| I | 右舷前方 | θ |
| II | 右舷後方 | 180° - θ |
| III | 左舷後方 | 180° + θ |
| IV | 左舷前方 | 360° - θ |
因此:
其中 θ 的有效範圍為:
本程式使用 C 語言實現,並使用:
- GCC / MinGW-w64
- GTK 3
- GLib
- 標準 C Library
- 數學函式庫
libm
如果只需要 CLI 功能,核心計算本身只依賴標準 C 與數學函式庫;但目前程式預設啟動 GUI,因此完整編譯需要 GTK 3 開發環境。
專案提供 Makefile,推薦使用 Make 進行編譯。
安裝 GCC、Make 與 GTK 3:
sudo pacman -S gcc make gtk3確認:
gcc --version
make --version
pkg-config --modversion gtk+-3.0進入專案目錄:
cd TorpedoCalculator編譯:
make成功後會生成:
aob
執行:
./aob預設進入 GUI 模式。
安裝依賴:
sudo apt install gcc make libgtk-3-dev pkg-config確認:
gcc --version
make --version
pkg-config --modversion gtk+-3.0編譯:
make執行:
./aob如果需要手動使用 GCC 編譯,目前的源文件可以按照專案實際結構進行編譯。
例如:
gcc src/main.c src/cli.c src/gui.c src/AOB.c \
-Iinclude \
$(pkg-config --cflags gtk+-3.0) \
-o aob \
$(pkg-config --libs gtk+-3.0) \
-lm推薦使用:
makeWindows 使用者可以使用 MSYS2 + MinGW-w64 編譯本程式。
首先安裝 MSYS2。
安裝完成後,開啟 MSYS2 UCRT64 終端機。
在 MSYS2 UCRT64 終端機中安裝 GCC、Make、GTK3:
pacman -S mingw-w64-ucrt-x86_64-gcc \
mingw-w64-ucrt-x86_64-make \
mingw-w64-ucrt-x86_64-gtk3 \
mingw-w64-ucrt-x86_64-pkgconf
pacman是 MSYS2 自帶的套件管理器,並不是 Windows 本身的命令。
確認 GCC:
gcc --version確認 GTK3:
pkg-config --modversion gtk+-3.0進入專案目錄:
cd TorpedoCalculator使用 Makefile 編譯:
make成功後會生成:
aob.exe
執行:
./aob.exe或者:
aob.exe預設啟動 GUI:
./aob.exe也可以明確指定 GUI:
./aob.exe -g使用命令列模式:
./aob.exe -k查看幫助:
./aob.exe -h如果你使用其他 MinGW-w64 發行版,只要確保環境中具有:
- GCC
- Make(可選,也可以手動執行 GCC)
- GTK3 development files
pkg-config
即可編譯本程式。
不同 MinGW-w64 發行版的 GTK3 安裝方式不同,因此本 README 不指定特定套件管理器。
在 MinGW-w64 環境中,數學函式庫通常由工具鏈直接處理,因此通常不需要像 Linux 一樣特別處理 -lm。
如果工具鏈要求,也可以在 Makefile 中加入:
-lm
直接執行:
./aobWindows:
.\aob.exe或者明確指定:
./aob -gGUI 模式會提供與 CLI 模式相同的輸入資料:
N:整圓總刻度數Z:潛望鏡倍率M:目標艦占據的橫向刻度D:目標艦距離L:目標艦實際長度- 我船位於目標船前方或後方
- 目標船首位於視野左側或右側
使用:
./aob -kWindows:
.\aob.exe -kCLI 模式下首先輸入:
N(整圓總刻度數):
Z(倍率):
這兩項屬於前置設定,在後續計算中可以重複使用。
然後輸入每一個目標的資料:
M(目標占據橫向刻度):
D(目標距離m):
L(目標真實船長m):
接著輸入目標位置:
我船位於目標船
0 = 前方 / 敵方船頭較近
1 = 後方 / 敵方船尾較近
以及:
目標船首位於視野
0 = 左邊
1 = 右邊
程式會輸出:
========== 結果 ==========
theta = xx.xx°
AOB = xxx.xx°
==========================
計算完成後可以選擇:
Y / Enter
繼續計算下一個目標。
N
結束程式。
R
重新輸入 N 與 Z。
目前支援:
| 參數 | 功能 |
|---|---|
| 無參數 | 啟動 GUI |
-g |
啟動 GUI |
-k |
啟動 CLI |
-h |
顯示幫助 |
例如:
./aob啟動 GUI。
./aob -g明確啟動 GUI。
./aob -k啟動 CLI。
./aob -h顯示幫助。
假設:
N = 1200
Z = 6
M = 5
D = 1000
L = 62
則:
計算得到約:
θ = 4.04°
如果目標位於第二象限,即:
右舷後方
則:
得到:
AOB = 175.96°
目前專案使用模組化結構:
TorpedoCalculator/
├── include/
│ ├── AOB.h
│ ├── cli.h
│ └── gui.h
│
├── src/
│ ├── AOB.c
│ ├── cli.c
│ ├── gui.c
│ └── main.c
│
├── ui/
│ └── aob.ui
│
├── Makefile
├── README.md
└── LICENSE
各文件的主要作用:
程序入口。
負責:
- 解析命令列參數
- 決定啟動 GUI 或 CLI
- 處理
-g、-k、-h
核心數學計算。
負責:
θ計算AOB計算
提供 AOB 計算函數與相關 enum 的聲明。
命令列介面。
負責:
- 讀取使用者輸入
- 顯示計算結果
- CLI 模式流程控制
GTK 圖形介面邏輯。
負責:
- 建立 GTK Application
- 讀取 GUI
- 處理使用者輸入
- 調用 AOB 計算函數
- 顯示計算結果
GUI 模組的函數聲明。
GTK GUI 的介面模板。
UI 的外觀與元件配置使用 GTK Builder .ui 文件描述,因此可以在不修改主要 C 邏輯的情況下調整 GUI 介面。
負責:
- 編譯整個專案
- 自動處理編譯參數
- 建立可執行文件
- 清理編譯結果
程式使用 C 語言實現。
核心計算使用:
#include <math.h>其中:
asin()用於計算反正弦函數。
由於 asin() 返回弧度,因此程式使用:
degree = radian * 180.0 / PI;將結果轉換為角度。
AOB 的位置使用 enum 表示:
typedef enum {
STARBOARD = 0,
PORT = 1
} ShipSide;
typedef enum {
FRONT = 0,
REAR = 1
} ShipPosition;這使程式可以使用具有語義的名稱:
STARBOARD
PORT
FRONT
REAR而不是直接在核心計算函數中使用沒有語義的:
0
1本專案採用 GNU Lesser General Public License v3.0(LGPL-3.0)。
詳細授權條款請參閱專案中的:
LICENSE
文件。
本程式為第三方工具,可用於 UBOAT 遊戲中的計算輔助。
公式與遊戲中的實際測量結果可能存在誤差。使用者應根據實際遊戲版本、潛望鏡倍率、刻度以及遊戲內測量結果自行確認參數是否適用。