Jarvis:对于具有 h 个极值点的 n 个输入点,该算法在最坏情况下需要 O(nh) 时间。
Graham:最坏的情况下是 O(nlogn)。
来源 the ref of CGAL, from where I use the two algorithms.
这意味着当 h 小于 logn 时,Jarvis 对于数据集(假设是二维)速度更快。不过,我希望看到它的实际效果,但我未能找到用于此目的的数据集。有人知道吗?
谷歌搜索得到这个链接,它实际上支持我上面所说的。
algorithm convex-hull cgal computational-geometry grahams-scan
我有一个点云 C,其中每个点都有一个关联的值。假设这些点在二维空间中,所以每个点都可以用三元组 (x, y, v) 表示。
我想找到局部最大值点的子集。也就是说,对于某个半径 R,我想找到 C 中点 S 的子集,使得对于 S 中的任何点 Pi(具有值 vi),在距离 Pi 的 R 距离内,C 中没有点 Pj 的值 vj 为大于 vi。
我知道如何在 O(N^2) 时间内做到这一点,但这似乎很浪费。有没有一种有效的方法来做到这一点?
旁注:
numpy sparse-array kdtree sparse-matrix computational-geometry
我需要找到一个凸多边形的最大内切圆,我搜索了很多网站,我知道这可以通过使用 Delaunay 三角剖分来完成。我在 CGAL 讨论中找到了一个使用 CGAL 的算法的线程:
您可以使用 CGAL 轻松计算:
首先,计算点的 Delaunay 三角剖分。
然后,迭代三角剖分的所有有限面。对于每个有限面 f
- 计算它的外心 c
- 在三角剖分中定位 c(为了加快速度,您可以将 f 的一个顶点作为点位置的起始提示)
- 如果 locate(c,hint) 返回的面是有限的,则外心 c 位于点的凸包中,因此,f 是候选者
- 如果 f 是这样的候选人脸,计算它的平方外接圆半径,只保留最小平方外接圆半径的脸
CGAL 手册(第 2 章 2D 三角剖分,以及内核中的一些内容)显示了执行此操作的每个基本功能。
我对这个算法的最后一部分有点困惑。当我阅读它时,我从中了解到三角剖分面的最小外接半径是最大内切圆的半径。但是从使用 Delaunay 三角剖分的多边形示例来看,似乎即使是最小的外接圆有时也无法放入多边形内,那么它如何与最大的内切圆具有相同的半径?
假设我有数百个甚至数千个 GPS 坐标、纬度和经度,它们构成了一个国家/地区的边界。
我也有我目前的位置纬度和经度。
我如何确定(使用 C#,为 Windows10 UWP 编程)我的位置是否在某个国家/地区的边界内?
EG 假设我拥有构成下图中红线的所有点。如果我在 X 位置,我的函数将返回 true。如果我在 Y 位置,我的函数将返回 false。
我正在尝试自定义绘制二维中随机点的Voronoi区域
import matplotlib.pyplot as plt
%matplotlib inline
from scipy.spatial import Voronoi
pt = np.random.random((10,2))
x = sp.spatial.Voronoi(pt)
# trial an error to figure out the type structure of [x]
plt.plot(x.vertices[:,0], x.vertices[:,1], '.', markersize=5)
# how to iterate through the x.regions object?
for poly in x.regions:
z = np.array([ x.vertices[k] for k in poly])
print z
if z.shape[0] > 0:
plt.plot( z[:,0], z[:,1])
plt.xlim([0,2])
plt.ylim([0,2])
Run Code Online (Sandbox Code Playgroud)
为什么区域重叠?绘制无限区域的任何建议?
数据点只是随机数:
x.vertices
array([[ 0.59851675, 0.15271572],
[ 0.24473753, 0.70398382],
[ 0.10135325, 0.34601724],
[ 0.42672008, …Run Code Online (Sandbox Code Playgroud) 从一组不重叠(但接触)的多边形计算对偶图。
多边形A、B和C,它们部分共享的坐标 1-22(黄色)和对偶图(蓝色)。
我有一组S多边形。每个多边形P i都表示为坐标的有序列表。多边形P i的边a — b表示为P i,(a,b)
多边形代表对偶图的面和节点。为了识别多边形P i的相邻面,只需将P i的每条边与每个其他多边形P j的每条边进行比较。如果边由另一个多边形共享,则P i和P j相邻。
这将创建大量的多条边,稍后可以将其删除。
该算法效率不高,因为它的运行时间复杂度为O(E 2 ),其中E表示多边形集合S的边数。
第一步创建边缘索引。这会将运行时间减少到O(2×E) = O(E)
删除度数为 2 的每个节点。(我认为这不会影响对偶图?)
algorithm geometry graph computational-geometry planar-graph
嗨,我正在尝试执行多边形三角剖分。我了解简单多边形( Concave 或 Convex )的剪耳方法。我一直在寻找顶点是否是反射。我在多个地方读到的是关于顺时针和逆时针方向的内容,我无法理解。简而言之,这些方向指的是什么,请给我一些关于检查顶点是否反射的提示。 这是我正在关注的一篇文章的链接:
这是他们使用的公式:
// Input
VECTOR a, b, c; // the parts of our triangle.
// if (b.x - a.x) * (c.y - b.y) - (c.x - b.x) * (b.y - a.y) > 0
// we are counter-clockwise
Run Code Online (Sandbox Code Playgroud)
我无法理解这里有什么意义。
我在第一象限有两个点 A(X,Y) 和 B(P,Q)。还有一点C(L,M)。如何在顺时针方向找到 CA 和 CB 之间的角度?
我搜索了很多,所有的解决方案都使用了 atan2() 但它找到了相对于 x 轴的原点角度。
可以假设 C 和 A 是固定的。B 可以在第一象限的任何地方。角度必须是顺时针方向且在 0-360(或 0 到 360-1)范围内。
我在 C/C++ 中这样做。
编辑:为每个请求添加代码。这有点不同,因为我陷入了一个概念并需要对其进行澄清。如果点 x,y 位于 50,50 和 P 之间,此函数应该返回。 P 是相对于 CA 的角度。
bool isInsideAngle(long double x,long double y, long double p)
{
if((atan2(y,x) >= atan2(50,100)) && (atan2(y,x) <= (p * PI / 50)))
{
// cout<<"YES!";
// cout<<" atan2(y,x) = " <<atan2(y,x)*180/PI<<endl;
// cout<<" atan2(50,50) = " <<atan2(50,100)*180/PI<<endl;
// cout<<" (p * PI …Run Code Online (Sandbox Code Playgroud) 我想知道是否有任何基于 numpy 的工具可以:
一种可能性是使用skimage.morphology.convex_hull_image(),但这仅支持 2D 图像,因此我必须逐个切片(在 z 轴上)调用此函数,这很慢。[编辑:见下面的注释。]
我绝对更喜欢更有效的方式。例如, scipy.spatial.ConvexHull() 可以获取 N 维空间中的点列表,并返回一个凸包对象,该对象似乎不支持查找其凸包图像/体积。
points = np.transpose(np.where(image))
hull = scipy.spatial.ConvexHull(points)
# but now wonder an efficient way of finding the list of 3D voxels that are inside this convex hull
Run Code Online (Sandbox Code Playgroud)
任何想法如何?请注意效率对我的申请很重要。谢谢!
更新:同时,convex_hull_image()已经扩展到支持 ND 图像,但对于中等大小的数据来说速度很慢。下面接受的答案要快得多。
python scipy convex-hull computational-geometry scikit-image
可以测试三个二维点,a,b,和c,落在一条线通过注意线段(的斜率a,b)将必须是相同的(b,c),或通过注意到它们限定的三角形的面积当且仅当三个点共线时才为零。我选择了前一种方法,因为数学看起来更简洁:这个答案包含公式。
上面的问题是,虽然当我们将测试转换为代码时数学是完全正确的,但我们发现它的表现很差,因为浮点类型的基本不精确性。考虑以下 C++:
using point = std::tuple<float, float>;
bool are_collinear(point a, point b, point c, float eps) {
auto [a_x, a_y] = a;
auto [b_x, b_y] = b;
auto [c_x, c_y] = c;
auto test = (b_x - a_x) * (c_y - a_y) - (c_x - a_x) * (b_y - a_y);
return std::abs(test) < eps;
}
int main()
{
point a = { 28.8171,77.9103 …Run Code Online (Sandbox Code Playgroud) algorithm ×3
c++ ×2
cgal ×2
convex-hull ×2
geometry ×2
python ×2
scipy ×2
atan2 ×1
c ×1
delaunay ×1
grahams-scan ×1
graph ×1
graphics ×1
kdtree ×1
math ×1
numpy ×1
planar-graph ×1
scikit-image ×1
sparse-array ×1
voronoi ×1