- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以我正在学习凸包算法,并编写了从朴素的蛮力到格雷厄姆扫描的所有算法。
这是我的 Bruteforce O(n^4) 算法。一开始,假设所有点都是船体的一部分。对于每个可能的三角形,消除位于三角形内的所有点。最后,那些没有消除的点将成为船体的一部分。
这是 Java 代码(已修复:使用 Thomash 的解决方案)
public List<Point> naive(List<Point> points) {
if (points == null)
return Collections.emptyList();
if (points.size() <= 3)
return points;
boolean[] extremePoints = new boolean[points.size()];
Arrays.fill(extremePoints, true);
for (int i = 0, sz = points.size(); i < sz; i++) {
if (extremePoints[i])
for (int j = 0; j < sz; j++) {
if (i != j && extremePoints[j]) {
for (int k = 0; k < sz; k++) {
if (k != i && k != j) {
for (int l = 0; l < sz; l++) {
if (extremePoints[l] && l != i && l != j
&& l != k) {
// Check if P[l] lies in triangle formed
// by
// P[i],P[j],P[k]
Polygon p = new Polygon();
p.addPoint(points.get(i).x,
points.get(i).y);
p.addPoint(points.get(j).x,
points.get(j).y);
p.addPoint(points.get(k).x,
points.get(k).y);
if (p.contains(points.get(l)))
extremePoints[l] = false;
}
}
}
}
}
}
}
Point centerOfHull = null; // Arbitrary point inside the hull
// Order?
for (int i = 0; i < extremePoints.length; i++) {
if (!extremePoints[i]) {
centerOfHull = points.get(i);
break;
}
}
List<Point> convexHull = new ArrayList<Point>();
for (int i = 0; i < extremePoints.length; i++) {
if (extremePoints[i]) {
convexHull.add(points.get(i));
}
}
Collections.sort(convexHull, new PointComp(centerOfHull));
// or use a heap. still O(nlogn)
return convexHull;
}
private class PointComp implements Comparator<Point> {
private Point center;
public PointComp(Point center) {
this.center = center;
}
@Override
public int compare(Point o1, Point o2) {
double angle1 = Math.atan2(o1.y - center.y, o1.x - center.x);
double angle2 = Math.atan2(o2.y - center.y, o2.x - center.x);
if (angle1 < angle2)
return 1;
else if (angle2 > angle1)
return -1;
return 0;
}
}
我试过目测这些点,它们似乎是正确的,但是我不知道如何建立点的顺序来绘制凸包多边形?感谢您的帮助。
最佳答案
如果您要通过暴力法查找哪些点是船体的一部分,您还不如继续做丑陋的事情来查找这些点的顺序。
当您绕着船体转时,您必须调整目标角度,但这行得通(而且这是您在纸上做的一种方法。)
关于java - Convex Hull - 确定点的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10513920/
我想知道两个 3D 凸包(A vs B)之间碰撞位置的近似 3D 位置和 3D 法线。 括号中的 CPU 显示了我完成的程序所需的相对 CPU 时间。 第 1 部分:提前退出(CPU 1%) 在第一步
例如,当点在 x,y 坐标中以 (x-left, x-right, y) 的形式给出时,( 1 , 5 , 3), (2 , 4, 5) 返回 (1,2 ,3) , (2 ,4 ,5), (4,5,3
所以我正在学习凸包算法,并编写了从朴素的蛮力到格雷厄姆扫描的所有算法。 这是我的 Bruteforce O(n^4) 算法。一开始,假设所有点都是船体的一部分。对于每个可能的三角形,消除位于三角形内的
这是我制作的一个简单的船体着色器代码,用于尝试理解曲面 segmentation 。我就是找不到这段代码有什么问题,但是编译函数总是返回 false。这是我的代码: 我的输入和输出结构: [doma
根据 D3 文档,可以为 hull 方法分配自定义访问器来获取 x 和 y 坐标。 Hull documentation 我想使用这些自定义访问器,但我无法弄清楚语法。这就是我所做的,这基本上是一个不
我正在尝试在 CUDA 中并行实现 quickHull 算法(用于凸包)。它适用于 input_size pts.size()) { printf
在线构造,一个一个地获取输入点,并为到那时为止给定的点找到船体。 我可以在 O(n * nlogn) 或 O(n^2 logn) 中使用 Graham 扫描来做到这一点。但我正在寻找一个 O(n^2)
我正在为 Waze 开发开源 JavaScript 插件——著名的免费 GPS 导航器——专门用于 online editor .这个用户脚本的想法是可以快速选择大的统一颜色的 map 区域以将它
本文整理了Java中com.koolearn.klibrary.text.view.ZLTextRegion.hull()方法的一些代码示例,展示了ZLTextRegion.hull()的具体用法。这
我使用这个node.js模块:https://www.npmjs.com/package/hull.js计算凹壳。在此链接的“工作原理”部分中,有 3 个关于其工作原理的步骤。但就我而言,算法在第
在数据集之间转换时,我的 D3 force 布局更新滞后: 当数据集从 MORE links 变为 LESS links 数据集时,剩余的凸包不会在 1 次点击时消失。用户需要点击两次更新按钮才能运行
我在创建复杂的凸包时遇到问题。如果我更改为具有 10 个点左右的简单多边形,效果很好,但是当我在大面积上有 20-30 个点时,它会在多边形中创建“分割”。然而数学表明它应该寻找所有异常值,并将它们用
我正在创建一个 Python 程序,该程序将拍摄图像(一张床的照片),然后运行 Canny 边缘检测,然后运行凸包轮廓检测以找出床的位置。 这是我的图像(请原谅丑陋的 Photoshop 工作)
我需要一些帮助来编写这个 algorithm . 对于一组给定的空间线,我试图在原点(引用点)为 0.5,0.5,0.5 时找到可访问的体积。 .目前,我执行以下操作: 对于每条线,计算到原点的距离
我正在尝试在力布局中的所有组上绘制凸包。但我只画了一半的凸包。当 D3 尝试绘制其余的外壳时,控制台返回错误:尚未创建元素。然而,当我检查控制台中的“组”变量时,所有组数据都在那里,x、y 数据都设置
在下面的代码中,我试图找出一个对象是否为绿色并在其周围绘制轮廓。有了这些信息,我还想找到形状的角并对其进行裁剪,但是我收到了与代码中未使用的 ConvexHull 函数相关的错误。我用过 python
我想使用 Voronoi 图提取边缘点(点位于凸包边界的边缘)。我知道 unbounded 单元格包含一个边界站点点,但我如何使用迭代器访问该信息? 解决方案 VD vd; //initialise
我是一名优秀的程序员,十分优秀!