2017-01-28 2 views
1

반지 내에서 임의의 x 및 y 좌표를 생성하려고합니다. 반지름은 3.5이고 내부 반경은 2입니다. x와 y에 대해 : 파이썬에서 반지 내에서 임의의 x, y 좌표를 생성하려고 시도했습니다.

def meteorites(): 
    circle = False 
    while circle == False:   
     r = np.array([uniform(-6., 6.), uniform(-6., 6.)]) 
     # we will regenerate random numbers untill the coordinates 
     # are within the ring x^2+y^2 < 3,5^2 and x^2+y^2 > 2^2 
     if (r[0]**2+r[1]**2 < 12.25) and (r[0]**2+r[1]**2 > 4.): 
      circle = True 

     else : 
      circle = False 

    return r[0], r[1] 

x = np.zeros(1000) 
y = np.zeros(1000) 
for i in range(1000): 
    x[i] = meteorites()[0] 
    y[i] = meteorites()[1] 
plt.scatter(x,y) 
plt.show() 

나는 결과를 플롯

내가 -3.5에서 3.5로 사각형을 얻을 좌표
x**2 + y**2 < 12.25 and x**2 + y**2 > 4 

나는 다음과 같은 기능을 썼다. 문제를 찾을 수없는 것 같습니다. 나는 그것이 코딩 오류, 또는 일부 멍청한 수학 문제인지 잘 모르겠습니다. 너희 둘은 보통 둘 다 잘하기 때문에 내가 여기서 뭘 잘못하고 있는지 볼 수 있니?

+3

왜 임의의 각도를 생성하지 대신 거리, 다음 X, Y 쌍에 그 변환? –

+0

@MartijnPieters 거리를 균일하게 생성하면 내부 링에서 점의 밀도가 높아집니다. – kennytm

답변

8

반지의 임의 지점을 균일하게 분포 시키려면 얇은 원형 영역의 상대적 영역을 고려해야합니다. How it works for the circle enter image description here

귀하의 경우 제곱 된 내부 및 외부 반지름의 범위에서 SquaredR의 균일 한 분포를 생성하십시오. 의사 코드 : 두 번 meteorites()를 호출 insstead를 한 번만 전화 :

Fi = RandomUniform(0, 2 * Pi) 
SquaredR = RandomUniform(inner*inner, outer*outer) 
R = Sqrt(SquaredR) 
x,y = R * Cos(Fi), R * Sin(Fi) 
5

임의의 각도와 두 제약 조건 사이의 임의의 거리를 가져옵니다. 방사형에서 변환을 사용하여 다음과 같이

import numpy 
n = 1000 
phi = numpy.random.uniform(0, 2*numpy.pi, n) 
r = numpy.random.uniform(2, 3.5, n) 

그런 다음 X, Y 좌표를 구성 할 수있다 :

from math import sin, cos, radians, pi, sqrt 

def meteorites(): 
    angle = uniform(0, 2 * pi) # in radians 
    distance = sqrt(uniform(4, 12.25)) 
    return distance * cos(angle), distance * sin(angle) 
+0

완벽. Dank je wel! – user90465

+0

그래, 타이밍을봤을 때 깨달았다. 내가 원을 가로 질러 바른 분포를 연구하는 데 바쁜 때 나는 당신의 코멘트를 보지 못했다 ;-) –

0

당신은 NumPy와를 사용하여 1000 샘플을 생성하려면 다음을 시도 할 수 있습니다 : 당신은 uniform distribution in a circle 생산해야합니다 데카르트 좌표 : X 및 Y는 N을 반복 할 필요없이 배열 지금 같이

x = r * numpy.cos(phi) 
y = r * numpy.sin(phi) 

이것은 NumPy와의 전력을 나타낸다.

x[i] = meteorites()[0] 
y[i] = meteorites()[1] 

이들은 x[i]에 링에 한 지점에서 x 값을 할당 :이 두 라인은 당신이 원하는 일을하지 않기 때문에

5

당신은 당신의 반지에 해당하지 않는 임의의 점을 받고있어 , 그리고에서 y[i]까지의 다른 지점에서 y입니다. meteorites()을 두 번 호출하기 때문에 다른 지점에서 좌표를 얻습니다.

x[i], y[i] = meteorites() 
1

:

대신, 당신은 아마 로그인하면 함수를 호출 한 다음 각 좌표에 할당, 또는 두 가지 모두 대상이 등호의 왼쪽에있는 곳 반복자는-개봉과 함께 과제를 수행 할 @Martijn Pieters가 제안했듯이 필요한 범위 내에서 극좌표를 균일하게 그립니다.

theta = uniform(0,2*np.pi) 
r = uniform(2.,3.5) 
x = r*np.cos(theta) 
y = r*np.sin(theta) 

편집 :이 순전히 수학적으로 발생하는 링의 모든 단계에 대한 동일한 확률이있을 것입니다.

그러나 실제로 주어진 theta에 대한 픽셀 수가 더 적을수록 r이 더 낮은 한계에 근접합니다. 그래서 더 작은 확률로보다 작은 r의 "운석"이 발생할 것입니다.

나는이 효과가 무시할 만하다고 생각합니다.

+0

원은 2pi 라디안을 갖는다; 당신은 * 반지 *에 위치를 배치하고 있습니다. –

+0

@ Martins Pieters corrected, thx. –

2

반지 범위 내에서 임의의 각도와 임의의 거리를 선택하는 루프를 실행하는 것이 좋습니다. 그런 다음 좌표를 계산하십시오.

그러나 코드에서 첫 번째 문제는 볼 수있다는 작성해야하는 것입니다 :

x[i],y[i] = meteorites() 

대신, 당신은 두 번 X의 결과로) 운석을 (라고하고 당신의 예에서

x[i] = meteorites()[0] 
y[i] = meteorites()[1] 

그리고 두 개의 다른 운석.

2

귀하의 구현이 한 줄을 수정하는 경우도 작동합니다.

x = np.zeros(1000) 
y = np.zeros(1000) 
for i in range(1000): 
    x[i], y[i] = meteorites() 
plt.scatter(x,y) 
plt.show() 

enter image description here

관련 문제