Skip to content

About

爲UBOAT開發

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TorpedoCalculator

一個用於 UBOAT 潛艇戰術遊戲的 AOB(Angle on Bow,目標艦首角)計算器。

本程式根據潛望鏡觀測資料與目標艦資料計算:

  1. 目標艦相對於潛艇的基本角度 θ
  2. 根據目標艦所在位置,計算完整的 AOB

本程式提供兩種操作模式:

  • GUI 模式:預設啟動,使用 GTK 圖形介面
  • CLI 模式:使用 -k 參數啟動命令列介面

公式

θ 計算

程式使用:

$$ \theta = \arcsin\left( \frac{2\pi MD}{NZL} \right) $$

其中:

變數 含義
N 潛望鏡整圓包含的總刻度數,例如 1.5× 一般為 4800,6× 一般為 1200
M 目標艦在潛望鏡視野內占據的橫向刻度
D 目標艦距離
Z 潛望鏡放大倍率
L 目標艦實際長度

注意:目前公式中的 D 與 L 必須使用與公式推導一致的單位。

程式首先計算:

$$ x = \frac{2\pi MD}{NZL} $$

然後計算:

$$ \theta = \arcsin(x) $$

由於 C 語言的 asin() 返回值為弧度,因此程式會將結果轉換為角度。


AOB 計算

程式將目標相對於我船的位置分為四個象限。

象限 位置 AOB
I 右舷前方 θ
II 右舷後方 180° - θ
III 左舷後方 180° + θ
IV 左舷前方 360° - θ

因此:

$$ AOB = \begin{cases} \theta & \text{右舷前方}\\ 180^\circ-\theta & \text{右舷後方}\\ 180^\circ+\theta & \text{左舷後方}\\ 360^\circ-\theta & \text{左舷前方} \end{cases} $$

其中 θ 的有效範圍為:

$$ 0^\circ \leq \theta \leq 90^\circ $$


編譯

本程式使用 C 語言實現,並使用:

  • GCC / MinGW-w64
  • GTK 3
  • GLib
  • 標準 C Library
  • 數學函式庫 libm

如果只需要 CLI 功能,核心計算本身只依賴標準 C 與數學函式庫;但目前程式預設啟動 GUI,因此完整編譯需要 GTK 3 開發環境。

專案提供 Makefile,推薦使用 Make 進行編譯。


Linux

Arch Linux

安裝 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 模式。


Debian / Ubuntu

安裝依賴:

sudo apt install gcc make libgtk-3-dev pkg-config

確認:

gcc --version
make --version
pkg-config --modversion gtk+-3.0

編譯:

make

執行:

./aob

不使用 Makefile

如果需要手動使用 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

推薦使用:

make

Windows

Windows 使用者可以使用 MSYS2 + MinGW-w64 編譯本程式。

1. 安裝 MSYS2

首先安裝 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

2. 編譯

進入專案目錄:

cd TorpedoCalculator

使用 Makefile 編譯:

make

成功後會生成:

aob.exe

執行:

./aob.exe

或者:

aob.exe

3. 啟動模式

預設啟動 GUI:

./aob.exe

也可以明確指定 GUI:

./aob.exe -g

使用命令列模式:

./aob.exe -k

查看幫助:

./aob.exe -h

4. 不使用 MSYS2

如果你使用其他 MinGW-w64 發行版,只要確保環境中具有:

  • GCC
  • Make(可選,也可以手動執行 GCC)
  • GTK3 development files
  • pkg-config

即可編譯本程式。

不同 MinGW-w64 發行版的 GTK3 安裝方式不同,因此本 README 不指定特定套件管理器。


Windows 的 -lm

在 MinGW-w64 環境中,數學函式庫通常由工具鏈直接處理,因此通常不需要像 Linux 一樣特別處理 -lm。

如果工具鏈要求,也可以在 Makefile 中加入:

-lm

使用方法

GUI 模式

直接執行:

./aob

Windows:

.\aob.exe

或者明確指定:

./aob -g

GUI 模式會提供與 CLI 模式相同的輸入資料:

  • N:整圓總刻度數
  • Z:潛望鏡倍率
  • M:目標艦占據的橫向刻度
  • D:目標艦距離
  • L:目標艦實際長度
  • 我船位於目標船前方或後方
  • 目標船首位於視野左側或右側

CLI 模式

使用:

./aob -k

Windows:

.\aob.exe -k

CLI 模式下首先輸入:

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

則:

$$ \theta = \arcsin \left( \frac{2\pi\times5\times1000} {1200\times6\times62} \right) $$

計算得到約:

θ = 4.04°

如果目標位於第二象限,即:

右舷後方

則:

$$ AOB = 180^\circ - 4.04^\circ $$

得到:

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

各文件的主要作用:

src/main.c

程序入口。

負責:

  • 解析命令列參數
  • 決定啟動 GUI 或 CLI
  • 處理 -g、-k、-h

src/AOB.c

核心數學計算。

負責:

  • θ 計算
  • AOB 計算

include/AOB.h

提供 AOB 計算函數與相關 enum 的聲明。

src/cli.c

命令列介面。

負責:

  • 讀取使用者輸入
  • 顯示計算結果
  • CLI 模式流程控制

src/gui.c

GTK 圖形介面邏輯。

負責:

  • 建立 GTK Application
  • 讀取 GUI
  • 處理使用者輸入
  • 調用 AOB 計算函數
  • 顯示計算結果

include/gui.h

GUI 模組的函數聲明。

ui/aob.ui

GTK GUI 的介面模板。

UI 的外觀與元件配置使用 GTK Builder .ui 文件描述,因此可以在不修改主要 C 邏輯的情況下調整 GUI 介面。

Makefile

負責:

  • 編譯整個專案
  • 自動處理編譯參數
  • 建立可執行文件
  • 清理編譯結果

技術說明

程式使用 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

License

本專案採用 GNU Lesser General Public License v3.0(LGPL-3.0)。

詳細授權條款請參閱專案中的:

LICENSE

文件。


Disclaimer

本程式為第三方工具,可用於 UBOAT 遊戲中的計算輔助。

公式與遊戲中的實際測量結果可能存在誤差。使用者應根據實際遊戲版本、潛望鏡倍率、刻度以及遊戲內測量結果自行確認參數是否適用。

About

爲UBOAT開發

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages