是这样的,我最终是想在一个矩形区域生成若干满足一定约束条件的任意四边形,用来模拟混凝土中石子的分布...
具体要求如下:
在100*100的矩形区域内生成n个满足如下条件的四边形
1.四边形出现的位置(可以按照四边形的形心或任一顶点的坐标作为四边形的位置)在矩形区域均匀随机分布;
2.四边形四条边最长边和最短边长度只比在3与1之间随机分布,且四个角最大角不超过150度,最小角不小于30度,用max和min这个参数控制所有随机生成的四边形的最长边的长度,最长边的长度在[min.max]之间服从均值为(min+max)/2,方差为s(可以赋给具体值)的正态分布(模拟石子的粒径级配,苹果 指出当要生成的四边形个数较大时,直径分布不可能按照正态分布,但目前还是按照正态分布编写吧);
3.生成的四边形互不相交互不包含;且所有四边形要在矩形区域内,不能与矩形边界相交;
4.如果可以的话,定义一个参数d,调节任意两个四边形之间的最小距离(就是构成两个四边形上的两组点集之间的最小距离),一个参数D作为所有四边形和矩形框边界之间的最小距离;
目前我按照这个代码(感谢 永),做出这样的效果,可是四边形的控制条件还没有加上:
(disk = Reap[
region = BoundaryDiscretizeGraphics[Rectangle[{0, 0}, {20, 10}]];
Do[p = RandomPoint[region];
rad =
If[(tem = Abs[SignedRegionDistance[region, p]]) < .2, tem,
RandomReal[{.2,
Min[{tem, Min@(Subtract @@ RegionBounds@region)/40}]}]];
region =
RegionDifference[region, DiscretizeRegion@Sow[Disk[p, rad]]],
200]][[-1, -1]];)
diskP = Polygon[(random = RandomPoint[#, 4])[[
Last@FindShortestTour[random]]]] & /@ Circle @@@ disk;
Graphics[Transpose[{RandomColor[
Hue[1/3, NormalDistribution[.6, .2], NormalDistribution[.6, .07]],
diskP // Length], diskP}]]

这段代码中四边形是圆的内接四边形,只满足凸四边形的要求,其他控制条件不满足,大家看看如何使随机生成的四边形满足约束条件...