Cần ý tưởng cho một thuật toán để vẽ các hình mờ không đều


8

Tôi đang tìm cách vẽ các hình không đều trên lưới x, y và tôi muốn đưa ra một phương pháp đơn giản, nhanh chóng nếu có thể. Ý tưởng duy nhất của tôi cho đến nay là vẽ một loạt các vòng tròn có kích thước ngẫu nhiên rất gần nhau, nhưng ở một khoảng cách ngẫu nhiên ngoài một tọa độ trung tâm nhiều hơn hoặc ít hơn, sau đó điền vào bất kỳ khoảng trống nào. Tôi nhận ra đây là một phương pháp không phù hợp, không phù hợp, hy vọng nó sẽ cung cấp cho bạn một ý tưởng sơ bộ về các loại hình tròn mờ, ngẫu nhiên mà tôi đang chụp. Vui lòng đề xuất các phương pháp để thực hiện điều này, tôi không quan tâm lắm đến mã. Tôi có thể tự ăn mì đó. Cảm ơn!


2
Tôi sẽ giúp nếu bạn đính kèm một số ví dụ về các hình dạng như vậy, nhưng từ những gì tôi hiểu, thuật toán Marching Squares có thể là thứ bạn đang tìm kiếm.
Alexander Konstantinov

Ví dụ, trong tất cả các trường hợp nghiêm trọng, hãy nghĩ các đốm gan: tròn, ngẫu nhiên, nhưng nói chung là hình trứng.
Yttermayn

6
Bài viết này mathicala.SE có một số ví dụ bạn có thể thấy thú vị: mathicala.stackexchange.com/questions/3345/ợi Câu trả lời hàng đầu về cơ bản là những gì bạn đang làm. một người khác tìm thấy vỏ lồi của các điểm ngẫu nhiên và sau đó nội suy một spline xuyên qua nó, nhưng điều đó có vẻ hơi phức tạp ...
Jemmy

Cảm ơn câu trả lời của bạn! Thật không may, tôi nghĩ rằng tôi có thể là một chút trong đầu của tôi. Tôi có thể phải tìm ra một cái gì đó khác.
Yttermayn

4
Điều gì về việc bắt đầu với một vòng tròn gần với kích thước mong muốn và sau đó hoán vị nó bằng cách sử dụng nhiễu perlin. Hoặc bằng cách di chuyển pixel đã chọn hoặc bằng cách làm mờ / mở rộng vòng tròn.
floAr

Câu trả lời:


1

Bạn có thể muốn chọn một số điểm, chọn một vectơ tại mỗi điểm và vẽ một spline qua chúng. Xem trang wikipedia này để biết mô tả đơn giản về một spline hình khối (còn gọi là spline Irwin-Hall). Đã được một thời gian kể từ khi tôi sử dụng chúng, nhưng nếu tôi nhớ chính xác, đây là thứ tôi thấy dễ hiểu và dễ sử dụng nhất. Nếu bạn biết công cụ bút từ photoshop, công cụ này hoạt động rất giống nhau (tôi tin rằng photoshop cũng sử dụng spline, nhưng tôi không chắc nó có phải là spline hình khối không).

Nếu bạn quan tâm, có nhiều spline hơn: ví dụ, splines Bezier và B-splines rất thú vị.

Một điều nữa xuất hiện trong đầu là các bộ mức, mặc dù điều đó có thể sẽ cần thêm một chút nghiên cứu từ phía bạn (để tìm các chức năng thỏa mãn yêu cầu của bạn).

Các tập cấp là bất đẳng thức ở dạng
f (x, y) = c
trong đó f là một số hàm và c là một số hằng.
Đây là một mô tả rất chung chung. Bạn có thể muốn điền vào một số hình dạng và vẽ tất cả các pixel trong đó
f (x, y) <= c
với một số màu. Ví dụ: đối với hình dạng 2d tròn hoàn hảo, bạn có phương trình nổi tiếng:
x ^ 2 + y ^ 2 <= r ^ 2
Bạn có thể chia tỷ lệ các thành phần x và y để có được một ellipsoid Với một chút thử nghiệm và nghiên cứu, nó sẽ có thể tìm thấy một số hình dạng funkier (tôi cho rằng).

Chỉnh sửa: một thử nghiệm nhỏ trên wolframalpha.com đã cho tôi điều này . (được tạo bằng lệnh 'cốt truyện abs ((x + sin (x) * y / 3) ^ 3) + y ^ 2 <= 7'). Tôi không biết đây có phải là bất cứ thứ gì như những gì bạn muốn không, nhưng nó chỉ là để cho bạn một ý tưởng.


1

Một cách tiếp cận đơn giản khác là sử dụng nhiễu tần số thấp của riêng bạn để vẽ (hoặc xác định) một hình trong tọa độ cực.

Giả sử bạn muốn một đốm màu ở giữa gốc, bán kính trung bình 1; điều này có thể dễ dàng được thu nhỏ và dịch sang các vị trí và kích thước khác. Hãy tưởng tượng với phương trình đơn giản r = 1 - điều này sẽ xác định một vòng tròn bán kính một tại điểm gốc. Để thêm một chút biến thể cho nó, bạn có thể thay đổi bán kính hình sin - thêm một thuật ngữ có dạng w 1 * sin (+ 1 ), trong đó w 1 và θ 1 là các hằng số tôi sẽ quay lại sau một chút. Một thuật ngữ tội lỗi sẽ không tạo ra nhiều sự khác biệt, nhưng có một số mức độ khác nhau của các tần số khác nhau sẽ bắt đầu thêm chính xác loại biến thể 'mềm' mà tôi nghi ngờ bạn đang theo đuổi. Dạng tổng thể sẽ nằm dọc theo các dòng của r = 1 + w 1 * sin (θ + θ 1 ) + w2 * sin (2θ + 2 ) + w 3 * sin (3θ + θ 3 ) + w 4 * sin (4θ + 4 ) + w 5 * sin (5θ + 5 ) - hoặc nhiều điều khoản hơn nếu bạn muốn, tất nhiên.

Vậy làm thế nào để chúng ta chọn các giá trị cho w i i ? Chà, chỉ nên chọn ngẫu nhiên từ (0,2π) - nói cách khác, mỗi "sóng" trên hình dạng của bề mặt sẽ bắt đầu tại một điểm khác nhau xung quanh hình dạng. Đối với w, có một số lựa chọn khác nhau. Chọn w i ngẫu nhiên từ (0, w) (đối với một số w cố định đại diện cho 'biến thể tổng thể' để đưa ra hình dạng; tôi có thể bắt đầu với w = 0,25 nhưng thử nghiệm với w = 0,1) cho mỗi i sẽ dẫn đến được gọi là nhiễu trắng , trong đó tất cả các tần số có trọng lượng bằng nhau - đây sẽ là 'blobbiest', với các biến thể rộng ở mọi tần số. Chọn w i ngẫu nhiên từ (0, w * (1 / i)) - nói cách khác,tiếng ồn, nơi trọng lượng tắt, nhưng chậm. Đây cũng được gọi là tiếng ồn 1 / f và đó là tiếng ồn 'fractal' nổi tiếng nhất. Cuối cùng, việc chọn các trọng số ngẫu nhiên từ (0, w * (1 / i ^ 2)) (nói cách khác, chia mỗi trọng lượng ngẫu nhiên cho i ^ 2) sẽ tạo ra tiếng ồn nâu - đây là mức 'mềm nhất' trong ba, với ít biến đổi nhất từ ​​một vòng tròn - nhìn chung nó sẽ có dạng hình bầu dục.

Dưới đây là ví dụ về ba, sử dụng 'tổng trọng lượng' là w = 0,25 và sử dụng cùng một bộ giá trị ngẫu nhiên cho w i và and i được lấy từ Random.org :

Blob "Tiếng ồn trắng": Một đốm màu với tiếng ồn trắng

Blob "Tiếng ồn hồng": Một đốm màu với tiếng ồn hồng

Blob "Tiếng ồn Brown": Một đốm màu được tạo ra với tiếng ồn brownian

Lưu ý rằng những đốm màu này sẽ không hoàn hảo; đặc biệt, họ không thể tự cuộn mình lại (vì với mọi - nói cách khác, với mọi góc độ từ gốc - có một giá trị r duy nhất), và nếu bạn không chọn đúng trọng lượng của mình, họ có thể tự - giao nhau (nếu r được phép đi âm). Nhưng họ làm rất tốt việc trở thành một người có sức thuyết phục và đối với hầu hết các ứng dụng trò chơi, người dùng sẽ không nhận thấy bất kỳ vấn đề nào.


(Cũng lưu ý: thực tế là các hình dạng này rất gần với đối xứng là một yếu tố của (a) các hệ số của sóng hài thứ hai và thứ tư rất nhỏ và (b) các pha của sóng hài thứ nhất, thứ ba và thứ năm - bao nhiêu chúng tôi thay thế các giá trị theta - rất gần, tại .468, .464 và .443; hầu hết các 'đốm' sẽ không có nhiều sự đối xứng về chúng.)
Steven Stadnicki

0

Ngoài các câu trả lời khác, bạn có thể sử dụng tiếng ồn Perlin với độ lệch vòng, nếu bạn điều chỉnh các cài đặt một chút, bạn có thể dễ dàng tạo ra một số hình dạng khác nhau đẹp.

Nếu bạn muốn mã của mình nhanh, bạn có thể sử dụng thư viện tạo tiếng ồn như libnoise (Giả sử bạn đang sử dụng c ++), đây là thư viện tạo tiếng ồn, làm cho các tác vụ tương tự trở nên rất đơn giản, vì nó cung cấp cho bạn một nút phương pháp tiếp cận dựa trên việc tạo ra thủ tục dựa trên tiếng ồn. Nó có ràng buộc với các ngôn ngữ khác quá.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.