Question List in January, 2023

不知道自己想要的是什么,却总是左顾右盼,瞻前顾后,才是最可怕的人生。
——老片复盘半只猫
评王家卫《东邪西毒》欧阳锋与洪七

1、工作记录

工作内容不对外公开。

2、日常积累

2.1 R-Tree

TODO

2.2 指数平滑

一次指数平滑算法(single exponential smoothing)隶属于指数平滑,其家族成员主要有:一次平滑,二次平滑和三次平滑 3 类。在这三类算法中,一次平滑法为历史数据的加权预测,二次平滑法适用于具有一定线性趋势的数据,三次平滑法则是在二次平滑法基础上再平滑一次,其适用于具有一定曲线趋势关系时使用。算法主要有两个参数:初始值和 \(\alpha\) 值参数。一次指数平滑的状态方程如下:

\[\hat{x}_{t+1}=s_t;\quad s_t=\alpha x_t+(1-\alpha)s_{t-1};\]
初始值
是平滑的最初起点值,一般取数据前 1 期,2 期,3 期,4 期或 5 期的平均值作为初始值,如果数据序列越少则初始值 S0 应该取更多前几期的平均值,因为数据序列较少时前期的重要性相对较高。
:math:`alpha` 值
在指数平滑算法中, \(\alpha\) 是新数据的权重,取值范围为 \([0,1]\),越大意味着新数据所占的权重越高,而原预测值所占权重越低。如果数据波动不大,一般值取的较小些比如 \([0.1, 0.5]\) 之间,如果数据波动较大则 \(\alpha\) 值取值相对较大些,比如 \([0.6, 0.8]\) 之间。

2.3 曲线平滑

#曲线

在介绍曲线插值平滑之前,需要了解一下后文中常见的作为自变量的 \(t\) 是个啥。对于曲线平滑算法的操作来说,这个自变量 \(t\) 构成的集合可以称为节点向量。

\(\mathbf{T}\) 是由 \(m+1\) 个非递减数构成的集合,\(t_0\leqslant t_1\leqslant t_2\leqslant\cdots\leqslant t_m\)\(t_i\) 称为节点(Knots), 集合 \(\mathbf{T}\) 称为节点向量(Knot Vector), 半开区间 \([t_i, t_{i+1})\) 是第 \(i\) 个节点区间(Knot Span)。

(1) 多重节点:注意某些 \(t_i\) 可能相等,某些节点区间会不存在。
a. 多重节点 \(t_i(k)\):若某一节点 \(t_i\) 出现 \(k\) 次,即 \(t_i= t_{i+1} = \cdots = t_{i+k-1}, k>1\)
b. 简单节点:若节点 \(t_i\) 只出现一次,则 \(t_i\) 是一个简单节点;
(2) 节点向量的均匀性:根据节点间距确定节点向量均匀性。
a. 均匀的:如果节点等间距,即对 \(0\leqslant i \leqslant m-1\) 而言 \(u_{i+1} - u_i\)是一个常数;
b. 非均匀的:否则节点向量成为非均匀的;

Bézier Curve

Bézier Curve 于 1962 年由法国工程师 Pierre Bézier 所发表,通常翻译为贝塞尔曲线;其主要意义在于无论是直线或曲线都能在数学上予以描述。贝塞尔曲线完全由其控制点决定其形状,\(n\) 个控制点对应着 \(n-1\) 阶的贝塞尔曲线,并且可以通过递归的方式来绘制。

贝塞尔曲线

Pt. :math:`2`:一阶公式,给定点 \(P_0,P_1\) 贝塞尔曲线表现为两点间的直线,\(t\in[0,1]\)

\[B(t)=P_0+(P_1-P_0)\cdot t=(1-t)\cdot P_0+tP_1\]

Pt. :math:`3`:二阶公式,给定点 \(P_0,P_1,P_2\) 贝塞尔曲线表现为如下形式,\(t\in[0,1]\)

\[B(t)=(1-t)^2P_0+2t(1-t)P_1+t^2P_2\]

Pt. :math:`4`:三阶公式,给定点 \(P_0,P_1,P_2,P_4\) 贝塞尔曲线表现为如下形式,\(t\in[0,1]\)

\[B(t)=P_0(1-t)^3+3P_1t(1-t)^2+3P_2t^2(1-t)+P_3t^3\]

Pt. :math:`n`:一般公式,给定点 \(P_0,P_1,\cdots,P_n\) 贝塞尔曲线表现为如下形式,\(t\in[0,1]\)

\[\begin{split}B(t)=\sum_{i=0}^n\begin{pmatrix}n\\i\end{pmatrix}P_i(1-t)^{n-i}t^i\end{split}\]

高阶 Bézier 可以通过不断递归到一阶。上式可以看出,Bézier 系数是二项式 \(\left(t+\left(1-t\right)\right)^n = (1)^n\) 的展开,故而其各项系数之和为 1。Bézier 曲线始终会在包含了所有控制点的最小凸多边形中,而不是按照控制点的顺序围成的最小多边形。其第一个控制点和最后一个控制点,恰好是曲线的起始点和终点。

B–Spline Curve

B–Spline Curve 于 1965 年由 Isaac Jacob Schoenberg 创造,其全称为 Basis Spline Curve,通常翻译为 B 样条曲线;是 Bezier Curve 一般化的一种形式。B 样条曲线曲面具有几何不变性、凸包性、保凸性、变差减小性、局部支撑性等许多优良性质,是CAD 系统中常用的几何表示方法。

Bézier 曲线的阶次是控制点个数减 1, 且移动一个控制点整段曲线都会变化,曲线的整体性较强;而 B 样条则可以指定阶次(即 \(k\)),控制点的改变仅仅改变曲线的部分形状,而不是整体。具体的实现主要是把一条曲线变为多段贝塞尔曲线的拼接。将 Bézier 曲线一般方程中的伯恩斯坦函数拆出来:

\[\begin{split}B_{i,n}(t)=C_i^n(1-t)^{n-i}t^i=\begin{pmatrix}n\\i\end{pmatrix}(1-t)^{n-i}t^i\end{split}\]

则可以 Bézier 曲线方程写成如下含有伯恩斯坦基函数 \(B_{i,n}(t)\) 的形式:

\[B(t)=\sum_{i=0}^nP_iB_{i,n}(t)\]

B 样条曲线的一般公式,给定点 \(P_0,P_1,\cdots,P_n\) ,以及 Cox-de Boor 递归公式 \(N_{i,k}(t)\), 则其公式为:

\[B(t)=\sum_{i=0}^nP_iN_{i,k}(t)\]

式中,\(k\) 为基函数的阶,Cox-de Boor 递归公式的函数如下:

\[\begin{split}\begin{align*} N_{i,0}(t)&=\begin{cases} 1 & \text{ if } t_i\leqslant t<t_{i+1}\\ 0 & \text{ otherwize } \end{cases}&,k=1\\ N_{i,k}(t)&=\frac{t-t_i}{t_{i+k}-t_i}N_{i,k-1}(t)+\frac{t_{i+k+1}-t}{t_{i+k+1}-t_{i+1}}N_{i+1,k-1}(t)&,k\geqslant 2 \end{align*}\end{split}\]

实现中一般将 order 定义为 k 阶,density 定义为两点间的最短间距,小于 1 时定义为 1 即可。

参考文献

  1. 知乎. 一次指数平滑、二次指数平滑、三次指数平滑[EB/OL].

  2. 百度百科. 贝塞尔曲线[EB/OL].

  3. 知乎. 曲线篇: 贝塞尔曲线[EB/OL].

  4. 知乎. 曲线篇:深刻理解B 样条曲线(上)[EB/OL].

  5. 知乎. 在B-spline中,如何理解knot和breakpoint?彼此之间联系和区别是什么?[EB/OL].

  6. 知乎. 综述:城市道路自动驾驶车辆规划与控制技术[EB/OL].

  7. 稀土掘金. 深入理解贝塞尔曲线[EB/OL].

  8. 百度文库. B 样条曲线[EB/OL].

  9. Bilibili. Obsidian入门指南(三-4)[EB/OL].

  10. PaperPass. 专利引用格式[EB/OL].

  11. 知乎. 贝塞尔曲线与B样条[EB/OL].

3、专业知识

3.1 python spatialite

安装准备

  1. pysqlite: 用于操作 SQLite 数据库的包;

  2. libspatialite5: 空间拓展 spatialite 的核心操作库;

  3. spatialite-bin: 用于操作 spatialte 的一些二进制文件工具;

  4. python-pyspatialite: 用于操作空间库的一些包;

brew install libspatialite

具体使用

import sqlite3
conn = sqlite3.connect(":memory:")
conn.enable_load_extension(True)
conn.execute('SELECT load_extension("libspatialite.7.dylib")')

3.2 C++

#cplusplus

passing ‘const xxx ‘ as ‘this’ argument discards qualifiers

因为对象 aconst 修饰,表示该对象无法被修改,但是 A::getHeight() 并没有 const 后缀修饰,导致编译器认为该函数可能会有修改对象的可能而报此错误。如果确认只是 getter 函数且不修改数据,将成员函数以 const 后缀修饰即可消除该错误。

参考文献

  1. 姚连璧等. 基于高精地图的道路场景三维建模[J]. 测绘科学与技术, 2022-10(1): 1-12.

  2. 王华等. 基于GIS数据的大尺度三维路网的自动生成[J].Computers & Graphics, 2021(96): 71-81.

  3. Zhang, Xuequan, et al. 用于构建大规模虚拟路网的模板式三维道路建模[J].

  4. Kai-Wei Chiang, et al. 基于移动端测绘的 OpenDRIVE 格式高清地图自动路网建模[J].

  5. 百度. 一种道路压盖关系的确定方法及装置[P].中国专利: CN105956088B, 2016.

  6. 城市生活. 一种道路压盖关系绘制的方法及装置[P]. 中国专利: CN107591080A, 2018.

  7. 腾讯. 电子地图系统中立交道路的渲染方法和装置[P]. 中国专利: CN103208226A, 2013.

  8. 比亚迪. 三维道路交叉口的模型化方法及装置[P]. 中国专利: CN101930624B, 2009.

  9. 阿里巴巴. 一种道路高程的确定方法和装置[P]. 中国专利: CN111501496B, 2019.

  10. 高德. 一种道路绘制方法及装置[P]. 中国专利: CN107545833B, 2016.

  11. 知乎. [LaTeX 绘图] tikz 绘制流程图,概述和两个示例 [EB/OL].

  12. Python与开源GIS .开始使用 SpatiaLite[EB/OL].

  13. CSDN 博客. # passing ‘const xxx ‘ as ‘this’ argument discards qualifiers[EB/OL].