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

标签 r 2d shapes area

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

给定一个特定区域,例如 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/

相关文章:

r - 如何编写一个通用函数来找出正值之间的距离?

安卓开发: Combining small tiles/bitmaps into one bitmap

java - 2D 游戏中的绘图问题

java - 反转嵌套循环

r - 从其他 data.table 添加列的更好语法

r - DT Shiny R - [input$tableId_rows_all, ] 不工作

从 R 中的整个数据集中随机选择 10% 的数据

c++ - Sprite 的凸多边形化

Java - 将字符或字符串转换为形状/区域

CSS 形状和文本对齐问题