2013-04-04 37 views
5

Tôi muốn tạo các điểm ngẫu nhiên trên bề mặt hình trụ sao cho khoảng cách giữa các điểm nằm trong khoảng 230 và 250. Tôi đã sử dụng đoạn mã sau để tạo các điểm ngẫu nhiên trên bề mặt xi lanh:Tạo các điểm ngẫu nhiên trên bề mặt của hình trụ

import random,math 
H=300 
R=20 
s=random.random() 
#theta = random.random()*2*math.pi 
for i in range(0,300): 
    theta = random.random()*2*math.pi 
    z = random.random()*H 
    r=math.sqrt(s)*R 
    x=r*math.cos(theta) 
    y=r*math.sin(theta) 
    z=z 
    print 'C' , x,y,z 

Làm thế nào tôi có thể tạo ra ngẫu nhiên điểm như vậy mà họ rơi với trong phạm vi (trên xi lanh surfaceof)?

+0

Khoảng cách dọc theo bề mặt của hình trụ hoặc đường thẳng (Euclide)? – NPE

+0

dọc theo bề mặt của hình trụ – user1407199

+1

Vui lòng thêm điều đó vào câu hỏi. – NPE

Trả lời

1

Đây không phải là giải pháp hoàn chỉnh, mà là một thông tin chi tiết sẽ hữu ích. Nếu bạn "mở" bề mặt của hình trụ thành hình chữ nhật có chiều rộng w=2*pi*r và chiều cao h, nhiệm vụ tìm khoảng cách giữa các điểm được đơn giản hóa. Bạn đã không giải thích làm thế nào để đo "khoảng cách dọc theo bề mặt" giữa các điểm trên đỉnh của hình trụ và mặt bên - đây là một chút hơi phức tạp của hình học.

Để tính toán khoảng cách dọc theo bề mặt khi tạo đường may nhân tạo, chỉ cần sử dụng cả hai (x1-x2) và (w -x1 + x2) - tùy theo khoảng cách ngắn hơn nào bạn muốn.

Tôi nghĩ rằng đề xuất của @VincentNivoliers 'để sử dụng lấy mẫu đĩa Poisson là rất tốt, nhưng với các ràng buộc của h = 300 và r = 20 bạn sẽ nhận được kết quả khủng khiếp bất kể là gì.

1

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:

  1. đơ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.

  2. 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: enter image description here

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ụ.

Các vấn đề liên quan