2010-04-20 15 views
6

Tôi muốn tạo các điểm ngẫu nhiên và đồng đều trên một hình trụ và hình nón (riêng). Hình trụ được xác định bởi trung tâm của nó, bán kính và chiều cao của nó. Thông số kỹ thuật tương tự cho hình nón. Tôi có thể nhận được hộp giới hạn cho mỗi hình dạng vì vậy tôi đã nghĩ đến việc tạo ra các điểm trong hộp giới hạn. Tuy nhiên, tôi không chắc chắn làm thế nào để dự án chúng vào xi lanh/hình nón hoặc nếu đây là ý tưởng tốt nhất.tạo đồng nhất các điểm 3D trên hình trụ/hình nón

Mọi đề xuất?

Cảm ơn.

+1

Dường như tỷ lệ sẽ tăng từ 1,5 đến 0,5. Bạn có thể muốn tỷ lệ = (max_y-y)/nón-> Chiều cao() thay thế. – comingstorm

+1

Ngoài ra, để ngăn chặn các điểm của bạn bị chồng lên xung quanh đỉnh, bạn muốn y = (max_y-min_y) * (1-sqrt (RandomNumber())) + min_y – comingstorm

+0

trông giống như câu hỏi trong EDIT của bạn đã được trả lời. Bạn có thể làm sạch nó, hoặc thêm một EDIT để chỉ ra rằng nó đã được trả lời? – brainjam

Trả lời

4

Trường hợp hình trụ là không đáng kể. Nếu hình trụ bán kính r> 0 và chiều cao h> 0 là hình ảnh của (x, y, z) = (r cos φ, r sin φ, z) trên φ ∈ [0, 2π [và z ∈ [-h/2, h/2], sau đó chỉ cần chọn φ và z ngẫu nhiên trong các khoảng thời gian này. Tất nhiên người ta có thể chỉ đơn giản là đại diện cho hình nón cũng bằng cách sử dụng các parametrisation tiêu chuẩn, nhưng sau đó phần tử khu vực sẽ không được liên tục trên mặt phẳng tham số, và do đó việc phân phối các điểm sẽ không được ngẫu nhiên. Vì vậy, bạn cần phải tìm một parametrisation khác nhau. Tôi đã thảo luận chi tiết về chủ đề này cho một hình cầu tại my AlgoSim site.

2

Sẽ đơn giản hơn để tạo điểm trực tiếp trên hình trụ hoặc hình nón.

Đã một thời gian kể từ khi tôi thực hiện việc này, nhưng thông số trục của hình trụ và sau đó cho mỗi điểm đại diện cho vòng tròn ở độ cao đó. Điều này sẽ tạo ra các điểm trên bề mặt. Bán kính của hình tròn là bán kính của hình trụ.

Đối với hình nón bạn cần phải giảm bán kính của vòng tròn khi bạn di chuyển từ chân đế đến đỉnh.

-1

Để đưa những câu trả lời trong giả:

Đối với một xi lanh, cho cylinderRadius và cylinderHeight:

angle = random number between 0 & 360 

x = cos(pi/180*angle)*cylinderRadius 
y = sin(pi/180*angle)*cylinderRadius 
z = random number between 0 and cylinderHeight. 

Đối với một hình nón, được đưa ra coneRadius, coneHeight:

angle = random number between 0 & 360 

z = random number between 0 and coneHeight 

thisRadius = coneRadius * (1-(z/coneHeight)); //This gives a decreasing radius as height increases. 

x = cos(pi/180*angle)*thisRadius 
y = sin(pi/180*angle)*thisRadius 

Mỗi điểm (x, y, z) sẽ nằm trên hình trụ/hình nón. Tạo ra đủ các điểm này và bạn có thể sinh ra các hạt trên bề mặt của hình trụ/hình nón, nhưng nó có thể không tạo ra sự phân bố đồng đều ...

+0

Vấn đề * là * để tìm một bản phân phối đồng nhất, và đây không phải là trường hợp trong mã của bạn cho hình nón. –

2

Một cách để nghĩ rằng cả hình trụ và hình nón đều có thể không được mở vào các bề mặt phẳng - chỉ cần cắt từng mặt bằng một đường thẳng từ trên xuống dưới.

Hình trụ không mở hình chữ nhật (nếu bạn đang bao gồm phần trên cùng và dưới cùng, sau đó thêm một vài đĩa).

Hình nón mở ra một hình tam giác với đáy cong là vòng cung của hình tròn (nếu bạn đang bao gồm phần đáy của hình nón, sau đó thêm đĩa).

Thật dễ dàng để nhúng các bề mặt phẳng này vào bên trong hình chữ nhật R trên mặt phẳng xy. Tạo ra các điểm được phân bố đồng đều trong R và bất cứ khi nào chúng nằm bên trong các bề mặt phẳng, hãy ánh xạ chúng trở lại các bề mặt ban đầu.

Xem một số câu trả lời khác ở đây để cố gắng phối hợp hình nón theo góc và chiều cao. Mặc dù các điểm sẽ được phân bố đồng đều về góc độ và chiều cao, chúng sẽ không được phân phối đồng đều với w.r.t. khu vực. Chúng sẽ phân bố nhiều hơn ở đầu.

0

Hãy một điểm được xác định bởi tọa độ r, một, h, nơi r là "bán kính" (khoảng cách từ trục dọc đi từ trung tâm), một là góc như trong các tọa độ cực và h là chiều cao của nó.

Đối với xi lanh (bán kính R và chiều cao H): chọn một cách độc lập

  • một bộ đồng phục trong [0, 2pi),
  • h thống nhất trong [0 , H] và
  • r với một "mật độ tam giác": f (r) = 2 r/R nếu 0 < = r < = R, 0 nếu ngược lại (mật độ tại r nên tỉ lệ với chiều dài chu vi bán kính r).

Không khó để lấy mẫu từ phân bố tam giác như vậy vì phân phối tích lũy của nó (một phương trình bậc hai) dễ dàng đảo ngược (xem this article). Ngoài ra, câu trả lời này được dựa trên trực giác, nhưng nó không phải là khó khăn để chứng minh rằng phân phối bạn có được trên xi lanh là thống nhất.

Đối với nón (bán kính R và chiều cao H): chọn

  • một bộ đồng phục trong [0, 2pi),
  • h với mật độ thực hiện với một phân đoạn parabola: f (h) = 3 (H - h)^2/H^3 nếu 0 < = h < = H, 0 nếu ngược lại (mật độ tại h nên tỷ lệ với diện tích phần hình tròn ở độ cao h),
  • hãy r (h) = (H-h) R/H (bán kính của mặt cắt ở độ cao h); sau đó chọn r với một "phân phối tam giác" f (r) = 2 r/r (h) nếu 0 < = r < = r (h), 0 nếu không thì.

Một lần nữa, lấy mẫu h phải dễ dàng vì phân phối tích lũy dễ dàng không thể đảo ngược.

EDIT. Nếu bạn có ý nghĩa để tạo điểm trên bề mặt của các hình dạng, sau đó là giải pháp đơn giản hơn:

xi lanh: chọn

  • một bộ đồng phục trong [0, 2pi),
  • h đồng phục trong [0, H],
  • r = R.

Cone: chọn

  • một bộ đồng phục trong [0, 2pi),
  • h với mật độ tam giác: f (h) = 2 (H - h)/H^2 nếu 0 < = h < = H, 0 nếu không (mật độ tại h phải tỷ lệ thuận với chiều dài chu vi ở độ cao h).
  • r = r (h) = (H-h) R/H = bán kính ở độ cao h.
+0

Tôi nghĩ anh ấy muốn điểm * trên * hình trụ, không phải bên trong nó. –

+0

Rất tiếc. Bạn có nghĩa là trên bề mặt? –

+0

Có, theo định nghĩa, một hình trụ (và hình nón) là một bề mặt trong không gian, không phải là vật thể rắn. Và tôi nghĩ OP thực sự đang sử dụng định nghĩa toán học này, bởi vì anh ta sử dụng mệnh đề "on" thay vì "bên trong". –

-1

Đối với điểm thống nhất trên một vòng tròn hoặc hình nón có bán kính R và chiều cao/độ cao H:

generate: 
    angle= uniform_random(0,2*pi) 
    value= uniform_random(0,1) 

in either case, let: 
    r= R * sqrt(value) 

then (using separate random numbers for each): 
    circle_point= point3d(r*cos(angle), r*sin(angle), H) 
or: 
    cone_point= point3d(r*cos(angle), r*sin(angle), r*H) 

Lưu ý rằng nếu bạn muốn một căn cứ trên nón của bạn, bạn sẽ cần phải làm điều đó một cách riêng biệt từ hình dạng cong. Để đảm bảo mật độ của các điểm giống nhau đối với các phần khác nhau, một cách dễ dàng là tính toán các khu vực của các bộ phận và tạo ra một số điểm tỉ lệ cho mỗi phần.

Giá trị sqrt (giá trị) là điều đảm bảo mật độ điểm ngẫu nhiên của bạn là đồng nhất. Như các câu hỏi khác đã đề cập, bạn muốn phân phối hình tam giác tam giác cho việc này; lấy sqrt() biến phân bố đồng đều trên [0,1) thành hình tam giác.

Đối với hình trụ, bạn không muốn sqrt(); phần cong là:

cylinder_point= point3d(R*cos(angle), R*sin(angle), H*value) 
0

Các câu trả lời khác đã bao gồm vỏ hình trụ khá tốt. Đối với hình nón, mọi thứ khó hơn một chút. Để duy trì mật độ điểm liên tục, bạn cần phải bù đắp cho thay đổi trong bán kính.

Để làm điều đó, bạn có thể bắt đầu bằng cách chọn khoảng cách giữa các điểm. Khi bạn di chuyển dọc theo trục của hình nón, bạn tính chu vi ở độ cao đó, sau đó chia chu vi khoảng cách tuyến tính giữa các điểm để lấy số điểm. Sau đó bạn chia 2pi radian (hoặc 360 độ, hoặc bất cứ điều gì) bằng số điểm để có được khoảng cách góc cho bán kính đó.

Tùy thuộc vào độ chính xác bạn cần, bạn có thể theo dõi phần còn lại từ một vòng kết nối khi tính toán vòng kết nối tiếp theo. Ví dụ: nếu bạn có hai vòng kết nối hoạt động để cần xxx.4 điểm, bạn sẽ làm tròn mỗi phần nếu nhìn vào sự cô lập - nhưng nhìn chúng lại với nhau, bạn có xxx.8 điểm, vì vậy bạn nên vòng một xuống và khác lên để giữ mật độ tổng thể càng gần càng tốt với giá trị chính xác.

Lưu ý rằng mặc dù nó không rõ ràng, sau này cũng có thể áp dụng cho hình trụ - bạn thường sẽ có một số làm tròn trong việc phân phối mỗi vòng tròn của các điểm.