Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何生成给定区域的随机形状。(R语言)。?_R_2d_Shapes_Area - Fatal编程技术网

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

如何生成给定区域的随机形状。(R语言)。?,r,2d,shapes,area,R,2d,Shapes,Area,我的问题是。。我正在研究一些聚类算法。。这是我第一次尝试2d形状 给定一个特定的面积,比如500平方米。。我需要为特定区域生成随机形状 比如说一个500平方米的矩形、正方形、三角形。。等对我该如何处理这个问题有什么建议吗。。我使用的是R语言。要创建一个通用方法将非常困难。 但你们可以为3面、4面、5面物体编写一个例子。 这是一个随机三角形的例子 类三角形 { 双角1; 双角2; //双角度3;180角度1-角度2; 双基; } 三角形随机三角形(双区域){ //A=(基准高度)/2.0; 双角度

我的问题是。。我正在研究一些聚类算法。。这是我第一次尝试2d形状

给定一个特定的面积,比如500平方米。。我需要为特定区域生成随机形状


比如说一个500平方米的矩形、正方形、三角形。。等对我该如何处理这个问题有什么建议吗。。我使用的是R语言。

要创建一个通用方法将非常困难。 但你们可以为3面、4面、5面物体编写一个例子。 这是一个随机三角形的例子

类三角形
{
双角1;
双角2;
//双角度3;180角度1-角度2;
双基;
}
三角形随机三角形(双区域){
//A=(基准高度)/2.0;
双角度1=*随机数<180*;
双角度2=*随机数<(180-角度1)*;
*使用trig以角度和基准获取高度*
双基=(面积*2.0)/高度;
返回新三角形(){Angle1=Angle1,Angle2=Angle2,Base=Base};
}

面积为500m^2的任意正方形很容易——它是一个边长为500m的正方形。你在乎旋转吗?然后通过runif(x,0,2*pi)旋转它。你在乎它的位置吗?添加一个(x,y)偏移量,该偏移量是根据runif或其他方法计算的

矩形?给定任意一对边的长度,您只能自由选择其他两条边的长度。如何选择第一对边的长度?您可能希望在应用程序的一些“合理”限制之间使用runif()。您可以使用rnorm(),但这可能会给出负长度,所以可能是rnorm平方。一旦你有了那一面,另一面的长度是500/L。旋转,平移,加入盐和胡椒粉调味

对于三角形,面积公式为半基乘以高度。因此,生成一个基准长度——同样是runif、rnorm等——然后选择另一个给出所需高度的点。轮换等

概括地说,一个形状有许多“自由度”,约束要固定的区域将限制其中至少一个自由度[1],因此,如果您开始使用随机数构建形状,您将不得不输入计算值


[1] 正好一个?我不确定-这些不是统计意义上的自由度…

对于正多边形,这样做相当简单

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

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

因此,知道n和A可以很容易地找到R

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

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

在R中:


我建议对相邻小方块的随机游走进行编码,这样小方块的聚集可以是具有已知面积的任意形状


这在很大程度上取决于您希望分布的外观。当您谈论形状时,“随机”可能意味着许多不同的东西。困难?几乎没有!其中只有三行是重要的。@Spacedman:我的意思是使用类,而不是三角形的实际代码。如果OP要求R,那么要么给出R代码,要么给出R代码伪代码,不是C#。我编辑了代码,所以它更干净。如果我有时间,我稍后会发布一个通用(非规则)凸面形状的解决方案。
class Triangle
{
  double Angle1;
  double Angle2;
  //double angle3; 180 - angle1 - angle2;
  double Base;
}
Triangle randomTriangle(double area){
  //A = (base*hieght)/2.0;
  double angle1 = *random number < 180*;
  double angle2 = *random number < (180 - angle1)*;

  *use trig to get height in terms of angles and base*
  double base = (area*2.0)/height;

  return new Triangle(){Angle1 = angle1, Angle2 = angle2, Base = base};
}
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)
    }
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)
    }