|
尝试写一下💻不知对不对
用Asymptote编写一个函数,输入一个点列表,应用Andrew算法按逆时针顺序输出凸包上的点列表。
注意:返回列表中的最后一个点与第一个点相同。
| 输入5个点的列表$\{(-0.2,0.1),(0.5,0),(-1,-1),(-1,1),(1,0)\}$
输出凸包 |
- pair[] convex_hull(pair[] P){
- int n = P.length, k = 0;
- if (n <= 3) return P;
- pair[] H=new pair[2*n];
- P=sort(P,new bool(pair A, pair B){return A.x<B.x||(A.x==B.x&&A.y<B.y);});
- for (int i = 0; i < n; ++i) {
- while (k >= 2 && orient(H[k-2], H[k-1], P[i]) <= 0) --k;
- H[k] = P[i];++k;
- }
- for (int i = n-1, t = k+1; i > 0; --i) {
- while (k >= t && orient(H[k-2], H[k-1], P[i-1]) <= 0) --k;
- H[k] = P[i-1];++k;
- }
- H.delete(k,H.length-1);
- return H;
- }
- unitsize(4cm);
- path p;
- pair[] points={(-0.2,0.1),(0.5,0),(-1,-1),(-1,1),(1,0)};
- for(pair P:points){
- dot(P);
- label((string)P,P);
- }
- for(pair P:convex_hull(points)){
- p=P--p;
- }
- draw(p);
复制代码 |
|