如何生成给定区域的随机形状。(R语言)。?
我的问题是。。我正在研究一些聚类算法。。这是我第一次尝试2d形状 给定一个特定的面积,比如500平方米。。我需要为特定区域生成随机形状如何生成给定区域的随机形状。(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; 双角度
比如说一个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)
}