Как сгенерировать координаты круга в списке

Я пытаюсь смоделировать диффузию частиц, и мне нужно создать их начальные координаты. Им нужно начать по кругу с координатами [x,y] в списке. Например, когда частицы начинают симуляцию в квадрате, массив координат выглядит так:

[[2, 2], [2, 3], [3, 2], [3, 3]]

Я также пытаюсь установить начальную позицию частиц примерно в центре сетки. Например, приведенные выше координаты являются начальными позициями в сетке 5x5.

Есть ли у кого-нибудь предложения, как генерировать координаты по кругу (не просто координаты по окружности, заполненные)

Чтобы сгенерировать точки в квадрате, я использую код ниже:

сетка классов():

def __init__(self, x, y):
    
    self.grid = np.zeros((x,y))
    self.list_of_atoms=[]
    self.x = x
    self.y = y
    
def initiate_atoms_in_square(self,quantity):
    """initiate a square of atoms roughly in the centre of the grid space """
    self.side_length = int(math.sqrt(quantity))
    self.start = int(self.x/2 + ((self.x**2)/2))
    lower_x = int(self.x/2)
    upper_x = int(self.x/2+self.side_length)
    lower_y = int(self.y/2)
    upper_y = int(self.y/2+self.side_length)
      
    coords=[]
    for i in range(lower_x,upper_x):
        for j in range(lower_y,upper_y):
            coords.append([i,j])
          

person Tom    schedule 25.07.2020    source источник


Ответы (1)


Вот решение, которое вычисляет массив квадратов расстояний от центральной точки, а затем получает индексы ближайших n точек — путем сортировки списка кортежей (squared_distance, indices), где indices — это кортеж индексов (как возвращается np.ndindex) — и устанавливает значения массива self.grid равными 1 в этих точках. (Есть явное зацикливание, поэтому, возможно, существует более эффективное решение.)

Обратите внимание, что я поставил сетку как (y, x), так что y относится к строкам, потому что наоборот это больше сбивает с толку.

Он также создает список индексов в self.list_of_atoms. (Каждый элемент списка представляет собой набор индексов.)

import numpy as np

class Grid():
    def __init__(self, x, y):

        self.grid = np.zeros((y,x), dtype=np.int)
        self.list_of_atoms=[]
        self.x = x
        self.y = y

    def initiate_atoms_in_circle(self, quantity, centrex=None, centrey=None):
        if centrex == None:
            centrex = self.x / 2
        if centrey == None:
            centrey = self.y / 2

        xvals, yvals = np.meshgrid(np.arange(self.x), np.arange(self.y))
        dist2 = (xvals - centrex) ** 2 + (yvals - centrey) ** 2
        dist2_and_pos = [(dist2[indices], indices) for indices in np.ndindex(dist2.shape)]
        dist2_and_pos.sort()

        for _, indices in dist2_and_pos[:quantity]:
            self.grid[indices] = 1
            self.list_of_atoms.append(indices)

        self.list_of_atoms.sort()
            
g = Grid(20, 15)
g.initiate_atoms_in_circle(100)
print(g.grid)
print("Total atoms:", np.sum(g.grid))
print("Length of indices list:", len(g.list_of_atoms))
print("Start of indices list:", g.list_of_atoms[:5])

Это дает:

[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0]
 [0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0]
 [0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0]
 [0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0]
 [0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0]
 [0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0]
 [0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0]
 [0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0]
 [0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0]
 [0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
Total atoms: 100
Length of indices list: 100
Start of indices list: [(2, 9), (2, 10), (2, 11), (3, 7), (3, 8)]
person alani    schedule 25.07.2020
comment
Теперь я получаю сообщение об ошибке, когда использую эти координаты, которые, я думаю, исходят из вашего кода, выводимого в списке кортежей. Есть ли у вас какие-либо предложения по преобразованию в список списков? - person Tom; 25.07.2020
comment
@Tom [list(tpl) for tpl in mylist] составил бы список списков из списка кортежей. - person alani; 25.07.2020
comment
опаздывать со мной, я, очевидно, глупо. Я вставил [список (tpl) для tpl в self.list_of_atoms], но я все еще получаю список кортежей. - person Tom; 25.07.2020
comment
@Tom Это не изменит список, это просто выражение для создания нового списка - вам придется назначить его обратно self.list_of_atoms - person alani; 25.07.2020
comment
@Tom Кстати, если вы знаете, что вам нужен список списков, вы всегда можете просто изменить self.list_of_atoms.append(indices) в моем коде на self.list_of_atoms.append(list(indices)) вместо того, чтобы после этого обрабатывать список. - person alani; 25.07.2020