Расчет случайных точек выборки с использованием полярных координат на декартовой карте - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь сгенерировать случайные точки выборки на декартовой плоскости с использованием полярных координат. У меня есть декартова карта с полярными секторами, я бы хотел поместить случайную точку выборки в каждый из секторов.

Визуальное описание проблемы

Я добавил точку выборки в первый сектор. Проблема в том, что я не знаю, как установить минимальные и максимальные пределы для каждого сектора, поскольку это декартова плоскость (использование декартовых минимальных и максимальных значений углов сектора даст вам прямоугольники вместо всего полярного сектора).

https://i.ibb.co/Vj9yW8m/system-Gen.png

Код прокомментирован для ясности. Окончательный результат размещен ниже.

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [10, 10]
import math
import pylab as pl
from matplotlib import collections as mc
import pprint
from IPython.utils import io
from random import randrange, uniform

#convertes cartesian x,y coordinates to polar r, theta coordinates
def cart2pol(x, y):
    rho = np.sqrt(x**2 + y**2)
    phi = np.arctan2(y, x)
    return np.array([rho, phi])

#convertes polar r,theta coordinates to cartesian x,y coordinates
def pol2cart(r, theta): #r is distance
    x = r * np.cos(theta)
    y = r * np.sin(theta)
    return np.array([x, y])

#cooks delicious pie
pi = np.pi

#no idea what this does
theta = np.linspace(0,2*pi,100)

#x theta
def x_size(r):
    return r*np.cos(theta)

#y theta
def y_size(r):
    return r*np.sin(theta)

#calculates distribution of sectors on a circle in radians
#eg. sub_liner(3) = array([0.       , 2.0943951, 4.1887902])
def sub_liner(k):
    sub_lines = []
    for c,b in enumerate(range(0,k)):     
        sub_lines = np.append(sub_lines,((12*pi/6)/k)*c)
    return sub_lines

#calculates all distribution sectors for every ring and puts them in a list
def mlp(i):
    master_lines = []
    k = 3
    for a in range(0,i):
        master_lines.append(sub_liner(k))
        k += 3
    return master_lines

#calculates all four corners of each sector for a ring
#(ring,ring points,number of rings)
def cg(r,rp,n):
    return [[[pol2cart(r-1,mlp(n)[r-1][i])[0],pol2cart(r-1,mlp(n)[r-1][i])[1]]\
  ,[pol2cart(r,mlp(n)[r-1][i])[0],pol2cart(r,mlp(n)[r-1][i])[1]]] for i in range(0,rp)]

#generates all corners for the ring sectors
def rg(n):
    cgl = []
    k = 3
    for r in range(1,11):
        cgl.append(cg(r,k,n))
        k += 3
    output = cgl[0]   
    for q in range(1,10):
        output = np.concatenate((output,cgl[q]))

    return output

#print(cg(1,3,10)[0][0][0])
#print(cg(1,3,10))

# randrange gives you an integral value
irand = randrange(0, 10)

# uniform gives you a floating-point value
frand = uniform(0, 10)

#define ring sectors
ring_sectors = rg(10)

#define node points
nx = 0.5
ny = 0.5

#define ring distance
ymin = [0]
ymax = [1]

#generate rings
ring_r = np.sqrt(1.0)
master_array = np.array([[x_size(i),y_size(i)] for i in range(0,11)])

#plot rings
fig, ax = plt.subplots(1)
[ax.plot(master_array[i][0],master_array[i][1]) for i in range(0,11)]
ax.set_aspect(1)
size = 10
plt.xlim(-size,size)
plt.ylim(-size,size)

#generate nodes
ax.plot(nx, ny, 'o', color='black');

#ring lines
lc = mc.LineCollection(ring_sectors, color='black', linewidths=2)
ax.add_collection(lc)

plt.grid(linestyle='--')

plt.title('System Generator', fontsize=8)

plt.show()

Образец вывода можно посмотреть на.

Изменить:

Что я пробовал:

Основываясь на обратной связи, я реализовал систему, которая получает случайные однородные значения между полярными координатами, и она работает, но точки не распределяются аккуратно в своих секторах, как должно быть, и я не уверен, почему. Может быть, у меня нет математики или я ошибся в функциях генератора. Если у кого-то есть понимание, я весь уши.

Вывод с точками

def ngx(n):
    rmin = 0
    rmax = 1
    nxl = []
    s1 = 0
    s2 = 1
    k = 0
    for i in range(0,n):
        for a in range(0,rmax*3):
            nxl.append(pol2cart(np.random.uniform(rmin,rmax),\
                                np.random.uniform(sub_liner(rmax*3)[(s1+k)%(rmax*3)],sub_liner(rmax*3)[(s2+k)%(rmax*3)]))[0])
            k += 1
        rmin += 1
        rmax += 1

    return nxl

def ngy(n):
    rmin = 0
    rmax = 1
    nyl = []
    s1 = 0
    s2 = 1
    k = 0
    for i in range(0,n):
        for a in range(0,rmax*3):
            nyl.append(pol2cart(np.random.uniform(rmin,rmax),\
                                np.random.uniform(sub_liner(rmax*3)[(s1+k)%(rmax*3)],sub_liner(rmax*3)[(s2+k)%(rmax*3)]))[1])
            k += 1
        rmin += 1
        rmax += 1

    return nyl

#define node points
nx = ngx(10)
ny = ngy(10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...