算法5A----计算几何
某个点是否在三角形内
-
正确且简洁
-
一种解法,发射射线,穿过次数是奇数次,但是求交过程是很复杂的
-
分而治之和减而治之都是reduction 简化或减化
-
三角形是最简单的多边形了
-
转换成3个问题
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jgf5927Z-1602634390559)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014064923548.png)]
-
某一条边左右延长,注意是射线,分别是pq,qr,rp,分成两个半平面,点必须在它的左半平面
-
其余两条同样如此
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LPHqNqiG-1602634390560)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014065309419.png)]
-
为什么只用判断3边的结果是相等的?
-
ccw的控制模式导致的是+++,反过来是cw(顺时针),结果是—
-
怎么判断一个点在某条射线的左侧
- 通过叉积算面积,由于有正负,所以可以区分,海伦公式
- 行列式
- 正3条对角线的乘积-反三条对角线的乘积 得到的是平行四边形的面积,除以2就是三角形的面积
两条线段怎么判断相交
- 4个坐标
- 所谓的思维方式要循序渐进,要一环扣一环
- 异或操作 XOR 各有一个才是true ^
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6CDmukCJ-1602634390561)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014070840758.png)]
位置判断
- 两条平行直线确定的条带
- 切割成很多梯形
- 任意给一个点,在哪个梯形中
- 两条正交的有向射线(射线上有一系列点)
- 任意给一个点,在哪个四边形中
凸包
demo
- 桌子上有很多钉子
- 用一个橡皮筋撑开包住所有点,松开,就可以把其他钉子都包在里面
- 构成了一个convex hull 即凸包
- 二分类
- 与橡皮筋接触的是蓝色 extreme points 极点,这样的点存在一条经过它的有向射线,所有的点都在它的一侧,另一侧是空
- 不接触的是绿色 不具备这种分割属性 进一步就是存在三个点,可以把这个点包住,但是算法复杂度是O(n^4)
- 极边 extreme points
- 相邻极点连接成的边,也具备所有点在极边的一侧,另一侧为空,算法复杂度是O(n^3)
Jarvis march : selectionsort
- 选择排序,后缀有序,前缀无序
- 每一步可以持续找到一个解
gift wrapper algorithm
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y33nGkEO-1602634390563)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014073219209.png)]
-
从某一个极点出发,与其他所有点出发做射线,依次做toLeft测试,直到停止,这就找到了下一个与它相连的极点,
-
上面的步骤只用遍历依次,然后外面嵌套一层遍历,总体的时间复杂度是O(n^2)的
-
上面这个方法的前提是有第一个极点?
-
建立坐标系,X轴最大最小,或者y轴最大最小,习惯上一般取y轴最小
-
缺陷:有可能是两个相等的点
- 找到最左边的点 Lowest then left -> LTL
插入排序
- 前缀有序,后缀无序
模仿这个思路
- 已经构成了一个凸包,加入一个点,判断是否可以继续作为极点,继续撑大这个凸包
- 增加一个极点
- 不是极点,不增加
- 增加一个极点,封杀掉若干个原先的极点(原先是极点,变成非极点)
如何判断一个点是否在当前凸包的内侧还是外侧
-
分而治之
-
找到一个极点,找到它的前驱节点和后驱节点,分别做两条射线
-
然后与其他极点相连,构成了若干个三角形,然后做二分查找,左边或者右边
-
一直找到,除基准极点后,只存在一条及边时,判断点是在极边的内侧还是外侧
-
在内侧,不增加
-
在外侧 support/tangent
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YStRjNfV-1602634390564)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014075636521.png)]
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VKz1Nchg-1602634390565)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014080012933.png)]
-
找到LL RR ,区分阴面和阳面
-
-
fruit ninja
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yIxo0lhN-1602634390566)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014080614212.png)]
-
一刀切尽可能多的水果
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K3Mywezs-1602634390566)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201014080752865.png)]
-
如果存在最大,上端点都在切刀线之上,下端点都在切刀线之下
-
separation theorem 分割 compact 紧 unbound open (更严谨的凸包)
-
求出上端点的凸包(点多了之后,有的点不是极点),通过最左最右极点,可以分割出下凸和上凸
-
判断上端点凸包的下凸和下断点凸包的上凸没有交点?