CPA评估以及VIM学习——week_30

发布时间 2023-07-25 22:48:08作者: akaS

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 编辑器
  • 查找:“/关键词”:在查找结果中,用Nn可以切换上下结果;输入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命令,跳转到后一个不同点。