gpt4 book ai didi

r - 如何在给定的指定区域生成随机形状。(R语言)?

转载 作者:行者123 更新时间:2023-12-02 08:55:59 25 4
gpt4 key购买 nike

我的问题是这样的..我正在研究一些聚类算法..首先我正在尝试二维形状..

给定一个特定区域,例如 500 平方米单位..我需要为特定区域生成随机形状

说一个 500 平方单位的矩形、正方形、三角形..等等..关于我应该如何解决这个问题的任何建议..我正在使用 R 语言..

最佳答案

对于正多边形执行此操作相当简单。

外接圆半径为 R 的 n 边正多边形的面积为

A = 1/2 nR^2 * sin((2pi)/n)

因此,知道n和A就可以轻松求出R

R = sqrt((2*A)/(n*sin((2pi)/n))

因此,您可以选择中心,在距离 R 处移动并在 2pi/n 处生成 n 个点角度增量。

在 R 中:

regular.poly <- function(nSides, area)
{
# Find the radius of the circumscribed circle
radius <- sqrt((2*area)/(nSides*sin((2*pi)/nSides)))

# I assume the center is at (0;0) and the first point lies at (0; radius)
points <- list(x=NULL, y=NULL)
angles <- (2*pi)/nSides * 1:nSides

points$x <- cos(angles) * radius
points$y <- sin(angles) * radius

return (points);
}


# Some examples
par(mfrow=c(3,3))

for (i in 3:11)
{
p <- regular.poly(i, 100)
plot(0, 0, "n", xlim=c(-10, 10), ylim=c(-10, 10), xlab="", ylab="", main=paste("n=", i))
polygon(p)
}

我们可以推断出一个通用的凸多边形。

凸多边形的面积可以计算为: A = 1/2 * [(x1*y2 + x2*y3 + ... + xn*y1) - (y1*x2 + y2*x3 + ... + yn*x1)]

我们如上所述生成多边形,但角度和半径与正多边形的角度和半径不同。

然后我们缩放这些点以获得所需的面积。

convex.poly <- function(nSides, area)
{
# Find the radius of the circumscribed circle, and the angle of each point if this was a regular polygon
radius <- sqrt((2*area)/(nSides*sin((2*pi)/nSides)))
angle <- (2*pi)/nSides

# Randomize the radii/angles
radii <- rnorm(nSides, radius, radius/10)
angles <- rnorm(nSides, angle, angle/10) * 1:nSides
angles <- sort(angles)

points <- list(x=NULL, y=NULL)
points$x <- cos(angles) * radii
points$y <- sin(angles) * radii

# Find the area of the polygon
m <- matrix(unlist(points), ncol=2)
m <- rbind(m, m[1,])
current.area <- 0.5 * (sum(m[1:nSides,1]*m[2:(nSides+1),2]) - sum(m[1:nSides,2]*m[2:(nSides+1),1]))

points$x <- points$x * sqrt(area/current.area)
points$y <- points$y * sqrt(area/current.area)

return (points)
}

关于r - 如何在给定的指定区域生成随机形状。(R语言)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4859482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com