目录
CPA评估以及VIM学习
1. CPA评估
CPA(Closest Point of Approach)是指船舶避碰中的一个关键概念,用于描述在海上相遇时船舶之间的最近距离点。它的定义可以通过以下几个方面进行解释。
首先,CPA是受到国际海上避碰规则(COLREGS)的指导,并在海事领域中被广泛采用。这些规则旨在确保船舶之间的安全交通,并规定了船舶在相遇时应采取的行动。CPA概念的引入有助于评估碰撞风险,并确定避碰措施。
其次,CPA通常在船舶自动识别系统(AIS)中计算和显示。AIS是一种船舶间自动通信系统,通过交换、航向、速度等信息,提供实时的船舶运行状况。通过使用AIS数据,可以计算出两艘船舶之间的最小距离,并预测最近会遇的位置和时间。
CPA的意义在于提供了对碰撞风险的评估。通过计算CPA,船舶可以了解到与其他船舶相遇时的安全距离,并在需要时采取适当的行动,以避免碰撞事故的发生。CPA的值越大,说明船舶之间越远,碰撞风险越小;相反,CPA的值越小,风险越高。
此外,CPA还可以用来评估船舶之间的相对接近速度。当两艘船舶的接近速度较高时,即使CPA较大,仍可能存在较大的碰撞风险。因此,CPA的计算不仅要考虑两艘船舶的最小距离,还需综合考虑它们的速度和航向。
总之,CPA是船舶避碰中的一个重要概念,用于评估船舶相遇时的最近距离点和碰撞风险。通过使用CPA,船舶可以确定安全航行的策略,并确保在复杂的海上环境中保持船舶交通的安全和有序。
1.1. 传统方法
通过对方位进行平滑之后,使用方位变化率进行动态判断,由于方位变化率的时间-方位变化率半对数图的特征,当接近CPA时刻时,方位变化率最高。(由于公司限制,故只列出基本的计算原理代码,核心计算过程请咨询武汉中蓬科技公司)
std::vector<int> findMaxIndices(const std::vector<int>& arr, int segmentSize) {
std::vector<int> maxIndices;
for (int i = 0; i < arr.size() - segmentSize + 1; i += segmentSize) {
std::vector<int> segment(arr.begin() + i, arr.begin() + i + segmentSize);
int maxVal = segment[0];
int maxIdx = 0;
for (int j = 1; j < segmentSize; j++) {
if (segment[j] > maxVal) {
maxVal = segment[j];
maxIdx = i + j;
}
}
if (maxVal != segment.back()) {
maxIndices.push_back(maxIdx);
}
}
return maxIndices;
}
std::pair<int, int> findElement(const std::vector<std::pair<double, double>>& data, double target) {
for (const auto& element : data) {
if (element.first == target) {
return std::make_pair(element.second, element.first);
}
}
return std::make_pair(-1, -1);
}
2. VIM学习使用
作为一个代码编辑器,在整理C++大型项目代码时,查找相关代码以及对代码进行对比操作都十分方便,拥有众多快捷键进行操作,十分快捷效率。在老师的介绍下,开始系统学习。
2.1 VIM基础操作
VIM经常使用到的模式有三种:命令/正常/普通模式(Normal mode);插入模式(insert mode);末行模式(last list mode)。insert模式进入normal模式(键盘输入i,反之退出按Esc),lastlist模式进入normal模式(键盘输入‘shift’+‘:’,反之按Esc退出),insert模式与lastlist模式之间不能切换。
Normal Mode:
- 光标移动基础按键:
键盘按键 | VIM功能 | 记忆/键位 |
---|---|---|
按键h | 光标向左移动 | 四个移动键的最左边 |
按键j | 光标向上移动 | jump单词 |
按键k | 光标向下移动 | king代表高高在上 |
按键l | 光标想右移动 | 四个移动键的最右边 |
- 光标移动小技巧:
键盘按键 | VIM功能 |
---|---|
按shift+$ ——shift+4 | 移动到光标所在行的“行尾”:行右 |
按shift+^——shift+6 | 移动到光标所在行的“行首”:行左 |
按gg——{连点两下小写g} | 进入文本开头 |
按shift+g——G | 进入文本末端 |
按n+shift+g——G | 跳转光标到指定第n行开头;n是行号 |
按w | 光标跳到下个单词的开头 |
按e | 光标跳到下个单词的字尾 |
按b | 光标跳到上个单词的开头 |
- 文本操作:
键盘按键 | VIM功能 |
---|---|
按 u | 撤销(可多次按) |
按ctrl+r | 撤销的恢复(可多次按) |
按ctrl+g | 显示光标所在行的行号 |
按yy | 复制光标所在行(一行) |
按n+yy | 复制n行:从光标所在行起往下复制n行的内容 |
按 p | 粘贴一次复制内容 |
按n+p | 粘贴n次复制内容 |
按dd | 删除光标所在行 |
按n+dd | 从光标所在行起往下删除n行 |
dd+p | 剪切一次刚刚删除的内容(有剪才有切-有删除才有剪切) |
按ndd+p | 剪切n次刚刚删除的内容 |
按c+w | 从光标位置往后删除当前单词或字符并进入插入模式 |
按c+n+w | 从光标位置往后删除n个当前单词或字符并进入插入模式 |
按 x——小写x | 从光标所在位置起往后删除一个字符 |
按 n+x | 从光标所在位置起往后删除n个字符 |
按shift+x——大写X | 从光标所在位置起往前删除一个字符 |
按n+shift+x——n+大写X | 从光标所在位置起往前删除n个字符 |
按shift+~ ——1左边那个字符~(文本大小写切换) | 从光标往后的小写转大写/大写转小写 |
按n+r+字符——比如我按3+r+a那么从当前光标往后的三个字符都变为a | 局部替换文本 |
shift+r——R | 进入替换模式可以整体替换 |
Lastlist Model:
- 保存/退出文件操作:
键盘按键 | VIM功能 |
---|---|
:wq | 保存并退出 Vim 编辑器 |
:wql | 保存并强制退出 Vim 编辑器 |
:q | 不保存就退出 Vim 编辑器 |
:ql | 不保存,且强制退出 Vim 编辑器 |
:w | 保存但是不退出 Vim 编辑器 |
:w! | 强制保存文本 |
:w filename | 另存到 filename 文件 |
x! | 保存文本,并退出 Vim 编辑器 |
ZZ | 直接退出 Vim 编辑器 |
- 查找:“/关键词”:在查找结果中,用
N
、n
可以切换上下结果;输入nohl
,可以取消高亮。
键盘按键 | VIM功能 |
---|---|
/abc | 从光标所在位置向前查找字符串 abc |
/^abc | 查找以 abc 为行首的行 |
/abc$ | 查找以 abc 为行尾的行 |
?abc | 从光标所在位置向后查找字符串 abc |
n或; | 向同一方向重复上次的查找指令 |
N或, | 向相反方向重复上次的查找指定 |
- 替换:
键盘按键 | VIM功能 |
---|---|
r | 替换光标所在位置的字符 |
R | 从光标所在位置开始替换字符,其输入内容会覆盖掉后面等长的文本内容,按“Esc”可以结束 |
:s/a1/a2 |
替换当前光标所在行第一处符合条件的内容 |
:s/a1/a2/g |
替换当前光标所在行所有的 a1 都用 a2 替换 |
:%s/a1/a2 |
替换所有行中,第一处符合条件的内容 |
:%s/a1/a2/g |
替换所有行中,所有符合条件的内容 |
:n1,n2 s/a1/a2 |
将文件中 n1 到 n2 行中第一处 a1 都用 a2 替换 |
:n1,n2 s/a1/a2/g |
将文件中 n1 到 n2 行中所有 a1 都用 a2 替换 |
Insert Model:
- 进入插入模式:
键盘按键 | VIM功能 |
---|---|
a | 在当前光标位置的右边添加文本 |
i | 在当前光标位置的左边添加文本 |
A | 在当前行的末尾位置添加文本 |
I | 在当前行的开始处添加文本(非空字符的行首) |
O | 在当前行的开始处添加文本(非空字符的行首) |
o | 在当前行的下面新建一行 |
R | 替换(覆盖)当前光标位置及后面的若干文本 |
J | 合并光标所在行及下一行为一行(依然在命令模式) |
cl | 删除光标选中的字符,然后进入插入模式,等同于s |
cw | 删除从当前光标,到光标所在单词的结尾的字符,然后进入插入模式,w的意思是单词 |
caw | 删除当前光标所在的单词,及单词后的空格,然后进入插入模式,光标会直接选中下个单词的首字母。aw的意思是一个单词 |
c3w | 删除当前光标所在的单词,及后续的2个单词,及空格。一共删除3个单词 |
2.2 VIM 高阶操作
2.2.1比较命令:命令行指令
屏幕将被水平分隔,分别显示一个文件,其中不同的部分将被高亮显示。
-
只在某一文件中存在的行,显示为蓝色;
-
而在另一文件中的对应位置的行,显示为绿色;
-
在两个文件中都存在的行,显示为紫色
-
行中不相同的字符,显示为红色;
-
相同的行,没有高亮显示并且会被折叠。
命令行指令:
//打开两个文件对比不同
vim -d file1 file2
//如果已经打开了文件file1,那么可以在Vim中用以下命令,再打开另一个文件file2进行比较:
:diffsplit file2
//如果已经使用split打开了两个文件,那么可以分别在两个窗口里面输入以下命令,进行比较:
:diffthis
//如果想要垂直比较两个文件,可以使用以下命令:
:vert diffsplit file2
2.2. 折叠:
使用zo
命令,可以展开被折叠的相同的文本行;而zc
命令,则可以重新折叠相同的行。
2.3. 查看:
比较文件时,经常需要结合上下文来确定最终要采取的操作。缺省情况下,是会把不同之处上下各6行的文本显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数为3行,可以使用以下命令:
:set diffopt=context:3
2.4. 滚动
如果你在一个文件中滚动屏幕,那么另一个文件也会自动滚动以显示相同的位置。
//使用下命令,取消联动:
:set noscrollbind
//使用下命令,将重新绑定联动:
:set scrollbind
//利用下命令,可以定义滚动方式:
:set scrollopt ver,hor,jump
//如果光标停留在两个文件的不同位置,那么可以使用下面的命令同步滚动:
:syncbind
2.5. 更新:
如果更改了某个文件的内容,vim又没有自动更新diff检查,那么可以使用如下命令更新:
:diffupdate
2.6. 跳转:
你可以用[c
命令;跳转到前一个不同点;或者用]c
命令,跳转到后一个不同点。