Cách cơ bản để tạo một tập hợp các điểm ngẫu nhiên với các ràng buộc ở các vị trí giữa chúng, là có một hàm điều chỉnh xác suất của các điểm được đặt tại một vị trí nhất định. chức năng này bắt đầu ra là một hằng số, và bất cứ khi nào một điểm được đặt, các khu vực cấm xung quanh điểm được thiết lập bằng không. Đó là khó khăn để làm với các biến liên tục, nhưng hợp lý dễ dàng nếu bạn discretize vấn đề của bạn.
Điều khác cần lưu ý là ở trên phần hình trụ. Nó có thể được dễ dàng hơn để nghĩ về nó như là điểm ngẫu nhiên trên một khu vực hình chữ nhật lặp đi lặp lại định kỳ. Điều này có thể được xử lý theo hai cách khác nhau:
đơn giản nhất là để đi vào xem xét không chỉ là gạch hình chữ nhật mà bạn đang đặt các điểm, mà còn những người láng giềng của mình. Bất cứ khi nào bạn đặt một điểm trong ngói chính của mình, bạn cũng đặt một điểm vào ô bên cạnh và tính hiệu ứng của chúng trên hàm xác suất bên trong ô của bạn.
Cách tiếp cận phức tạp hơn xem xét hàm xác suất sau đó convolution của hạt nhân mã hóa khu vực cấm, với tổng hàm delta, tương ứng với các điểm đã được đặt. Nếu điều này được tính bằng FFT, thì tính chu kỳ là một sản phẩm tự nhiên.
Phương pháp đầu tiên có thể được mã hóa như sau:
from __future__ import division
import numpy as np
r, h = 20, 300
w = 2*np.pi*r
int_w = int(np.rint(w))
mult = 10
pdf = np.ones((h*mult, int_w*mult), np.bool)
points = []
min_d, max_d = 230, 250
available_locs = pdf.sum()
while available_locs:
new_idx = np.random.randint(available_locs)
new_idx = np.nonzero(pdf.ravel())[0][new_idx]
new_point = np.array(np.unravel_index(new_idx, pdf.shape))
points += [new_point]
min_mask = np.ones_like(pdf)
if max_d is not None:
max_mask = np.zeros_like(pdf)
else:
max_mask = True
for p in [new_point - [0, int_w*mult], new_point +[0, int_w*mult],
new_point]:
rows = ((np.arange(pdf.shape[0]) - p[0])/mult)**2
cols = ((np.arange(pdf.shape[1]) - p[1]) * 2*np.pi*r/int_w/mult)**2
dist2 = rows[:, None] + cols[None, :]
min_mask &= dist2 > min_d*min_d
if max_d is not None:
max_mask |= dist2 < max_d*max_d
pdf &= min_mask & max_mask
available_locs = pdf.sum()
points = np.array(points)/[mult, mult*int_w/(2*np.pi*r)]
Nếu bạn chạy nó với các giá trị của bạn, kết quả thường chỉ là một hoặc hai điểm, như khoảng cách tối thiểu lớn cấm tất cả những người khác. nhưng nếu bạn chạy nó với các giá trị hợp lý hơn, ví dụ:
min_d, max_d = 50, 200
Đây là cách các hàm xác suất chăm sóc đặt mỗi 5 điểm đầu tiên:
Lưu ý rằng những điểm được trả về như cặp tọa độ, đầu tiên là chiều cao, thứ hai khoảng cách cùng chu vi hình trụ.
Khoảng cách dọc theo bề mặt của hình trụ hoặc đường thẳng (Euclide)? – NPE
dọc theo bề mặt của hình trụ – user1407199
Vui lòng thêm điều đó vào câu hỏi. – NPE