[SciPy-User] random points within an ellipse

David Goldsmith d.l.goldsmith@gmail....
Thu Aug 5 03:12:46 CDT 2010


One more fix (I've learned my lesson: thoroughly test before posting code)
:-(

def rand_in_ellipse(a, b=1, t=0):
    angle = 2*pi*random()
    r = np.sqrt( (a*np.cos(angle-t))**2 + (b*np.sin(angle-t))**2 )
    r *= random()
    x = r * np.cos(angle)
    y = r * np.sin(angle)
    return np.array((x,y))

fig = plt.figure()

ax = fig.add_subplot(111)

sample = np.array([rand_in_ellipse(4., 3., np.pi/4) for i in np.arange(10000)])
ax.scatter(sample[:,0], sample[:,1], s=1)

plt.show() # Figure attached

DG


On Thu, Aug 5, 2010 at 12:49 AM, David Goldsmith <d.l.goldsmith@gmail.com>wrote:

> This is embarrassing: clearly, that was not a uniform distribution over the
> ellipse; here's the fix:
>
>
> def rand_in_ellipse(a, b=1, offset=0):
>     angle = 2*pi*random() - offset
>     r = np.sqrt( (a*np.cos(angle))**2 + (b*np.sin(angle))**2 )
>     r *= random()
>     x = r * np.cos(angle)
>     y = r * np.sin(angle)
>
>     return np.array((x,y))
>
> Which yields the attached.  (It looks denser in the center because the
> uniformity in the size of the points increases in significance as that size
> becomes of the same order as the distance away from other points.)
>
> DG
>
> On Wed, Aug 4, 2010 at 11:54 PM, David Goldsmith <d.l.goldsmith@gmail.com>wrote:
>
>> Whoops, sorry, in the example, the call to rand_in_ellipse should have
>> 4./3 as a single argument, i.e., the line should look like
>>
>> sample = np.array([rand_in_ellipse(4./3) for i in np.arange(10000)])
>>
>>
>>
>> DG
>>
>>
>> On Wed, Aug 4, 2010 at 11:50 PM, David Goldsmith <d.l.goldsmith@gmail.com
>> > wrote:
>>
>>> For the ellipse:
>>>
>>> import numpy as np
>>> from numpy.random import random_sample as random
>>>
>>> pi = np.pi
>>> def rand_in_ellipse(a, b=1, offset=0):
>>>     angle = 2*pi*random() - offset
>>>     x = a * random() * np.cos(angle)
>>>     y = b * random() * np.sin(angle)
>>>     return np.array((x,y))
>>>
>>> import matplotlib.pyplot as plt
>>>
>>> fig = plt.figure()
>>>
>>>
>>>
>>> ax = fig.add_subplot(111)
>>>
>>> sample = np.array([rand_in_ellipse() for i in np.arange(10000)])
>>> ax.scatter(sample[:,0], sample[:,1])
>>>
>>>
>>>
>>> plt.show() # Figure attached
>>>
>>> DG
>>>
>>>
>>> On Wed, Aug 4, 2010 at 8:13 PM, Benjamin Root <ben.root@ou.edu> wrote:
>>>
>>>> On Wed, Aug 4, 2010 at 7:18 PM, alex <argriffi@ncsu.edu> wrote:
>>>>
>>>>> On Wed, Aug 4, 2010 at 7:38 PM, Benjamin Root <ben.root@ou.edu> wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> For a project, I need to create sets of random coordinates within a 2d
>>>>>> domain.  To start, I have been creating random x and y coordinates, which
>>>>>> has worked very nicely.  However, I would like to start doing some fancier
>>>>>> domains like ellipses and crescents.  Does anybody know of any useful tricks
>>>>>> for doing this?
>>>>>>
>>>>>> Thanks,
>>>>>> Ben Root
>>>>>>
>>>>>
>>>>> For an ellipse you could start with random points in a disk like this
>>>>> http://mathworld.wolfram.com/DiskPointPicking.html
>>>>> and then I think you can just stretch along an axis to give the points
>>>>> inside the ellipse disk.
>>>>> For fancier shapes you can do rejection sampling as long as you can get
>>>>> a bounding box and
>>>>> you can tell what is inside vs outside the domain.
>>>>>
>>>>> Alex
>>>>>
>>>>>
>>>> Thanks Alex, that certainly does put me in the correct direction. It
>>>> appears that there isn't an analogous expression for an ellipse as there was
>>>> for a disc.  I probably will have to just take your suggestion and do some
>>>> scaling/rotation upon the set of points to get what I want.  It should be
>>>> more than sufficient, and it does look better than my original attempts.
>>>>
>>>> Ben Root
>>>>
>>>> _______________________________________________
>>>> SciPy-User mailing list
>>>> SciPy-User@scipy.org
>>>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>>>
>>>>
>>>
>>>
>>> --
>>> Mathematician: noun, someone who disavows certainty when their
>>> uncertainty set is non-empty, even if that set has measure zero.
>>>
>>> Hope: noun, that delusive spirit which escaped Pandora's jar and, with
>>> her lies, prevents mankind from committing a general suicide.  (As
>>> interpreted by Robert Graves)
>>>
>>
>>
>>
>> --
>> Mathematician: noun, someone who disavows certainty when their uncertainty
>> set is non-empty, even if that set has measure zero.
>>
>> Hope: noun, that delusive spirit which escaped Pandora's jar and, with her
>> lies, prevents mankind from committing a general suicide.  (As interpreted
>> by Robert Graves)
>>
>
>
>
> --
> Mathematician: noun, someone who disavows certainty when their uncertainty
> set is non-empty, even if that set has measure zero.
>
> Hope: noun, that delusive spirit which escaped Pandora's jar and, with her
> lies, prevents mankind from committing a general suicide.  (As interpreted
> by Robert Graves)
>



-- 
Mathematician: noun, someone who disavows certainty when their uncertainty
set is non-empty, even if that set has measure zero.

Hope: noun, that delusive spirit which escaped Pandora's jar and, with her
lies, prevents mankind from committing a general suicide.  (As interpreted
by Robert Graves)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.scipy.org/pipermail/scipy-user/attachments/20100805/b38dabc3/attachment-0001.html 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 43piover4ellipse.png
Type: image/png
Size: 230918 bytes
Desc: not available
Url : http://mail.scipy.org/pipermail/scipy-user/attachments/20100805/b38dabc3/attachment-0001.png 


More information about the SciPy-User mailing list