Decorative image frame

MotherFaker的个人博客

随葫芦娃一起消散吧,旧日的幻影

MotherFaker的个人博客

设计模式学习笔记-策略模式

策略模式是一种行为设计模式,它允许我们在运行时选择特定的算法或行为,而无需对客户端代码进行修改。这对于那些需要根据不同条件(如客户类型)执行不同逻辑的场景尤其有用。通过策略模式,可以有效避免大量的if-else或switch-case判断,使代码更具可读性、可扩展性和维护性。

阅读更多...

计算几何-凸包(二)

1.极性(Extremity)的概念

在如图所示的一个凸包内,存在两种点,对构成凸包有实质作用的点(蓝色)和没有实质作用的点(绿色)。而对构成凸包有实质作用的点则被称为极点(Extreme Points)。

极点存在一个特性:存在一条穿过极点的直线,使得凸包内所有点都在这条线的同一侧。

2.判断极点的方法

1.In-Triangle Test

取一个点,枚举其余点集可产生的所有三角形,判断该点是否包含于某个三角形内,如果不存在,则该点为极点。伪代码如下

1
2
3
4
5
6
7
8
9
10
for (const Point of AllPoints) {
Point.ifExtreme = true
for (const Triangle of AllTriangles) {
// 只要存在包含该点的三角形,则此点不是极点
if (Triangle.contains(Point)) {
Point.ifExtreme = false
break
}
}
}

该方法复杂度为O(n4)O(n^4),其中计算AllTriangles时间复杂度为O(n2)O(n^2),效率极差。

1.1 To-Left Test

实现Triangle.contains(Point)可用To-Left Test方法。此方法将三角形三个点按照逆时针首尾相连的到三条直线,然后判断对于这三条直线来说,是否Point全在直线左侧。

判断点是否在线段左侧可通过判断这三个点逆时针所形成的三角的有向面积是否大于0,公式如下

S=12pxpy1qxqy1sxsy1S=\frac{1}{2}\begin{vmatrix} p_x&p_y&1\\ q_x&q_y&1\\ s_x&s_y&1 \end{vmatrix}