Java 在正方形内生成N个点(均匀)

Java 在正方形内生成N个点(均匀),java,math,point,uniform,Java,Math,Point,Uniform,我想在一个正方形内生成N个点(均匀)。 我怎样才能做到这一点呢?这是一个非常酷的问题,比我想象的要困难得多,但我的想法是这样的。有关于n-gons的文件,但我只做正方形。因此,圆的均匀分布是一个常见的问题,你不能单独采样半径,r,角度,θ,因为较大半径的权重较大,即如果我们取一个无限小的环空,由于面积是r^2的函数,因此我们从距离中心较远的较大半径处获得了更多面积,因此我们从r^2进行了统一采样 现在,矩形的想法类似,它的对称性可以通过旋转(角度)和与原点的距离(半径)来捕捉,但请注意,当你围绕

我想在一个正方形内生成N个点(均匀)。
我怎样才能做到这一点呢?

这是一个非常酷的问题,比我想象的要困难得多,但我的想法是这样的。有关于n-gons的文件,但我只做正方形。因此,圆的均匀分布是一个常见的问题,你不能单独采样半径,
r
,角度,
θ
,因为较大半径的权重较大,即如果我们取一个无限小的环空,由于面积是
r^2
的函数,因此我们从距离中心较远的较大半径处获得了更多面积,因此我们从
r^2
进行了统一采样

现在,矩形的想法类似,它的对称性可以通过旋转(角度)和与原点的距离(半径)来捕捉,但请注意,当你围绕一个圆旋转时,半径会发生剧烈变化,先上后下。我们需要一种基于角度来规定半径的方法,这样它在任意给定点的质量都是均匀的

考虑以下构造(我们可以确定正方形的方向,使其位于其一侧,但这更直观)对不起,我的图表绘制得不好

                             A

                                  X

                  B          O          C



                             D
这是我们的正方形,A,B,C,D是角,O是原点。我们稍后会解释X。让我们从点C开始,逆时针旋转,角度将表示为θ。如果我们以θ角从O开始画一条线,那么X是与正方形边缘的交点。换句话说,X=r(θ)。我们要做的是把距离r作为θ的函数,使之成为θ的均匀概率分布。这就是全部的想法

我们可以用正弦定律写出下面的内容

Sin(pi - Theta - pi/4)/c = sin(pi/4)/r(Theta) where C sits at (c,0)
做一些代数运算,得出结论

r(Theta) = sqrt(2)*c / (2sin(3pi/4 - Theta)
现在我们需要一个常数k,这样积分k*r(θ)会得到1,这很容易做到

我得到

a*sin(pi/4)ln|tan((Theta+pi/4)/2)| evaluated from 0 to pi/4
您已经成功地为r(θ)构建了p.d.f.(概率分布函数),现在计算c.d.f.(累积分布函数),将其设置为均匀,并获得θ的闭合形式表达式

到目前为止,我们已经构建了随机θ,来构建半径r,意识到就像一个圆,我们离得更远,质量更大,我们可以将它构建为

R=R(θ)/s
其中s在0到1之间是一致的


我们使用
r(θ)
,因为它是给定θ的最大可能值

这个问题很酷,比我想象的要困难得多,但我的想法是这样的。有关于n-gons的文件,但我只做正方形。因此,圆的均匀分布是一个常见的问题,你不能单独采样半径,
r
,角度,
θ
,因为较大半径的权重较大,即如果我们取一个无限小的环空,由于面积是
r^2
的函数,因此我们从距离中心较远的较大半径处获得了更多面积,因此我们从
r^2
进行了统一采样

现在,矩形的想法类似,它的对称性可以通过旋转(角度)和与原点的距离(半径)来捕捉,但请注意,当你围绕一个圆旋转时,半径会发生剧烈变化,先上后下。我们需要一种基于角度来规定半径的方法,这样它在任意给定点的质量都是均匀的

考虑以下构造(我们可以确定正方形的方向,使其位于其一侧,但这更直观)对不起,我的图表绘制得不好

                             A

                                  X

                  B          O          C



                             D
这是我们的正方形,A,B,C,D是角,O是原点。我们稍后会解释X。让我们从点C开始,逆时针旋转,角度将表示为θ。如果我们以θ角从O开始画一条线,那么X是与正方形边缘的交点。换句话说,X=r(θ)。我们要做的是把距离r作为θ的函数,使之成为θ的均匀概率分布。这就是全部的想法

我们可以用正弦定律写出下面的内容

Sin(pi - Theta - pi/4)/c = sin(pi/4)/r(Theta) where C sits at (c,0)
做一些代数运算,得出结论

r(Theta) = sqrt(2)*c / (2sin(3pi/4 - Theta)
现在我们需要一个常数k,这样积分k*r(θ)会得到1,这很容易做到

我得到

a*sin(pi/4)ln|tan((Theta+pi/4)/2)| evaluated from 0 to pi/4
您已经成功地为r(θ)构建了p.d.f.(概率分布函数),现在计算c.d.f.(累积分布函数),将其设置为均匀,并获得θ的闭合形式表达式

到目前为止,我们已经构建了随机θ,来构建半径r,意识到就像一个圆,我们离得更远,质量更大,我们可以将它构建为

R=R(θ)/s
其中s在0到1之间是一致的


我们使用
r(θ)
,因为它是给定θ的最大可能值

这个问题很酷,比我想象的要困难得多,但我的想法是这样的。有关于n-gons的文件,但我只做正方形。因此,圆的均匀分布是一个常见的问题,你不能单独采样半径,
r
,角度,
θ
,因为较大半径的权重较大,即如果我们取一个无限小的环空,由于面积是
r^2
的函数,因此我们从距离中心较远的较大半径处获得了更多面积,因此我们从
r^2
进行了统一采样

现在,矩形的想法类似,它的对称性可以通过旋转(角度)和与原点的距离(半径)来捕捉,但请注意,当你围绕一个圆旋转时,半径会发生剧烈变化,先上后下。我们需要一种基于角度来规定半径的方法,这样它在任意给定点的质量都是均匀的

考虑以下构造(我们可以确定正方形的方向,使其位于其一侧,但这更为复杂)