Computational geometry
点线多边形封装¶
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
|
基础数值计算¶
C++ | |
---|---|
二维几何板子¶
点&向量¶
直线&线段¶
多边形¶
凸包¶
判断多边形是否为凸包¶
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
|
方法 2:
求凸包周长¶
例: P2742 [USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包
给定 n 个点的坐标, 求凸包周长.
凸包直径¶
https://www.luogu.com.cn/problem/P1452
平面最近点对¶
圆¶
最小圆覆盖¶
C++ | |
---|---|
三维几何板子¶
点&向量¶
直线&线段¶
平面¶
其他¶
C++ | |
---|---|
极角排序¶
我们知道,一个点的坐标可以转化为极坐标,其中极角的范围是 \([0, 2\pi)\) ,那么可以根据这个角度对所有点进行排序。
(long)double 排序¶
这种方式常数小,但会损失精度。
atan2(y,x),表示 \((x, y)\) 这个点与原点连线,这条线与x轴正半轴的夹角,这里的这个极角的范围是 \([−\pi,\pi]\) 的,一二象限为正,三四象限为负。
从小到大排完序后,实际上是第三象限→第四象限→第一象限→第二象限。
long long 叉积排序¶
这种方式常数大,但若所有的点坐标都是整数,会避免所有的精度问题。
以下代码排序后,得到的顺序是从 x 正半轴开始逆时针旋转扫过的位置。
例题1-2021 ICPC 澳门 C¶
题意:给定 n 个整数坐标点,任意两点都有一条连线,求至少要删除多少个点,才能让原点不被剩余点的连线包围住?题目保证没有连线会经过原点。
分析:若要满足题意,则剩余的点必定在以原点为顶点的180°范围之内。对给出的点进行极角排序,双指针枚举进行遍历,更新答案。
距离¶
欧式距离¶
曼哈顿距离¶
定义¶
在二维空间内,两个点之间的曼哈顿距离(Manhattan distance)为它们横坐标之差的绝对值与纵坐标之差的绝对值之和。则 A \((x_1, y_1)\),B \((x_2, y_2)\) 之间的曼哈顿距离用公式可以表示为: $$ d(A,B)=|x_1-x_2|+|y_1-y_2| $$
性质¶
- 非负性:曼哈顿距离是一个非负数
- 统一性:点到自身的曼哈顿距离为 0
- 对称性:A 到 B的距离与 B 到 A 的距离相等
- 三角不等式:从点 i 到点 j 的直接距离不会大于途径任何其他点 k 的距离
切比雪夫距离¶
定义¶
切比雪夫距离(Chebyshev distance)是向量空间中的一种度量,二个点之间的距离定义为其各坐标数值差的最大值。 $$ d(A,B)=max(|x_1-x_2|,|y_1-y_2|) $$ 可以理解为从一个点出发,可以往上下左右 左上 左下 右上 右下 8个方向前进,到达另一个点所需的最小步数。
切比雪夫距离与曼哈顿距离的相互转化¶
曼哈顿坐标系是通过切比雪夫坐标系旋转45°后,再缩小到原来的一半得到的。
将一个点 \((x, y)\) 的坐标变为 \((x+y, x-y)\) 后,原坐标系中的曼哈顿距离等于新坐标系中的切比雪夫距离。
将一个点 \((x, y)\) 的坐标变为 \((\frac{(x+y)}{2}, \frac{(x-y)}{2})\) 后,原坐标系中的切比雪夫距离等于新坐标系中的曼哈顿距离。
给定两矩形求重叠面积¶
半平面交¶
# P4196 [CQOI2006] 凸多边形 /【模板】半平面交¶
逆时针给出 \(n\) 个凸多边形的顶点坐标,求它们交的面积。例如 \(n=2\) 时,两个凸多边形如下图:
则相交部分的面积为 \(5.233\)。
解法
https://zhuanlan.zhihu.com/p/666868712
代码
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
|