繁体   English   中英

最小凸多边形的质心

Centroid of the minimum convex polygon

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个物种在整个区域的发生点。 我想计算包含该物种所有发生点的最小凸多边形的质心。 谁能告诉我如何在 R 中做到这一点?

2 个回复

首先要注意,凸多边形的质心不等于其顶点的质心,除非在多边形是三角形的特殊情况下。 (如果您实际上想要顶点的质心而不是多边形的质心,则使用sapply(ch[c("x", "y")], mean)根据下面计算的chcolMeans(X[ix, ])根据上一节中计算的ix计算。)

为了得到质心,将凸包多边形的面积分成三角形(Delaunay 三角化),计算每个三角形的质心和面积,然后使用面积作为权重取质心的加权平均值。

voronoi.mosaic包中的 voronoi.mosaic 将提供三角形顶点的索引和三角形的面积。 在其输出p1p2p3是三角形顶点的输入X的索引, area是相应的区域。 由此我们计算xy作为三角形质心的坐标。 然后在他们计算之后的行中,我们采用他们的加权平均值来获得整体质心cen 最后我们绘制一切。

library(tripack)

set.seed(43)

# test data
n <- 25
X <- matrix(rnorm(2 * n), ncol = 2)

vm <- voronoi.mosaic(xy.coords(X))
x <- with(vm, rowMeans(cbind(X[p1, 1], X[p2, 1], X[p3, 1])))
y <- with(vm, rowMeans(cbind(X[p1, 2], X[p2, 2], X[p3, 2])))
cen <- apply(cbind(x, y), 2, weighted.mean, vm$area)  # centroid of conv hull

tri <- tri.mesh(xy.coords(X)) # triangularization
ch <- convex.hull(tri) # ch$i gives indexes of vertices of conv hull

# plot points & Delauney triangularization, conv hull (red) and centroid (red)
plot(tri)
lines(X[c(ch$i, ch$i[1]), ], col = "red", lwd = 2)
points(cen[1], cen[2], col = "red", pch = 20, cex = 2)

(剧情后续) 截图

德尔迪尔

Trippack 的另一种方法是使用 deldir 包来获取质心。 deldir函数在其输出del.wts提供了对每个输入点进行加权的量,以便它们的加权平均值是质心。 cen.dd等于上面cen浮点近似值,绘图也相似。 chull来自 R 的基础。

library(deldir)

dd <- deldir(xy.coords(X))
cen.dd <- with(dd$summary, sapply(list(x, y), weighted.mean, del.wts))

# plot points & triangularization, compute & plot conv hull (red) and 
#  centroid (red)
plot(dd, wlines = "triang")
ix <- chull(X)
lines(X[c(ix, ix[1]), ], col = "red", lwd = 2)
points(cen.dd[1], cen.dd[2], col = "red", pch = 20, cex = 2)

更新

已经完全修改了答案。

正如G. Grothendieck指出的,多边形的质心不是顶点的平均值。 凸多边形质心的公式并不难,我还没有看到它们发布:

set.seed(42)
pts <- matrix(rnorm(40, 5, 1), 20, 2)
plot(pts)
# The centroid of the data points
points(t(pts.mn), pch=8, col="darkgreen", cex=2)
verts <- chull(pts)
poly <- pts[verts,]
polygon(poly)
cent <- colMeans(poly)
# The centroid of the vertices
points(t(cent), pch=8, col="blue", cex=2)

现在是面积和质心的公式。 这些假设多边形是封闭的(第一行与最后一行相同)并且点逆时针穿过多边形:

poly <- rbind(poly, poly[1, ])
n <- nrow(poly)
x <- rev(poly[, 1])
y <- rev(poly[, 2])
i <- 1:(n-1)
# Area of the polygon
A <- sum(c(x[i] * y[i+1] - x[i+1] * y[i])) / 2
# Coordinates of the centroid
Cx <- sum((x[i] + x[i+1]) * (x[i] * y[i+1] - x[i+1] * y[i])) / (6 * A)
Cy <- sum((y[i] + y[i+1]) * (x[i] * y[i+1] - x[i+1] * y[i])) / (6 * A)
# The centroid of the polygon
points(Cx, Cy, pch=8, col="red", cex=2)

凸包

1 Python:最小凸多边形?

我在书中偶然发现了一种有趣的表示数据的方式:Ann B. Butler撰写的《比较脊椎动物神经解剖学》。 下图是本书的描述及其图像。 有谁知道如何在python中编写这样的情节? ...

4 凸多面体的质心

我有一个封闭的凸多面体,它是由一个凸多边形(面)阵列定义的,这些多边形由三维空间中的顶点数组定义。 假设密度均匀,我试图找到多面体的质心。 目前我用这个伪代码中的算法计算它。 这基本上取面的质心的加权平均值。 我不是100%确定这是正确的,因为我无法在线找到正确的算法。 如果有人 ...

5 查找多边形的质心

我使用以下代码查找多边形的质心(我没有编写代码,它来自另一个问题)。 问题是,仅当输入向量vertices中的点按顺时针顺序排列时,它才起作用。 当这些点按逆时针方向排列时不起作用。 这是我所说的cw &amp;&amp; ccw order的图片: 我不明白为什么当点的 ...

6 多边形的面积和质心

我在学校里有一个程序,我必须告诉大家它在做什么。 我得到的程序是一个计算多边形的面积和质心的程序。 现在,我几乎了解所有信息,但是程序中有两个数字,我什么也做不了。 -10001和-47。 如果我更换它们,该程序将无法进行计算。 你能告诉我为什么-10001和47吗? 如果我添加而不 ...

2016-02-27 16:22:43 1 159   c
7 找到多边形的质心?

为了获得中心,我尝试将每个顶点添加到总数中,然后除以顶点数。 我还试图找到最顶部、最底部 -&gt; 获得中点...找到最左边,最右边,找到中点。 这两个都没有返回完美的中心,因为我依靠中心来缩放多边形。 我想缩放我的多边形,所以我可以在它们周围放置一个边框。 考虑到多边形可能是凹的、凸的并 ...

8 多边形的面积和质心:实用

我正在使用R包实践来计算具有3到5个顶点的多边形的面积和质心。 我知道手册解释了该区域为负数的情况,对此我不太了解。 此外,在这些情况下的质心不是我希望得到的。 我遇到的问题是我的程序可能会生成具有正确排序的顶点的多边形,但是会产生负区域: 有人可以建议一种通用的方法(即任意数 ...

9 在 r 中标记多边形的质心

我目前正在尝试检测数据中的疾病簇,需要提取每个多边形的质心。 当我奔跑时; 但是它返回一个没有多边形名称的质心列表。 然后我需要将质心与我的疾病数据合并,所以我需要知道哪个多边形是哪个,所以我需要在输出中保留多边形的名称。它目前将所有多边形名称重新标记为数字,而不是它的实际名称名称。 我担心当我 ...

10 查找多边形区域的质心

我有以下几点观点: 我尝试使用http://csharphelper.com/blog/2014/07/find-the-centroid-of-a-polygon-in-c/中的方法 但是结果很遥远: 我有什么想念的吗? 谢谢 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM