2009-07-22 41 views
24

Tôi đang tìm một thuật toán sẽ tạo ra một loạt các màu để các màu sẽ được phân phối rộng rãi nhất có thể (vì vậy chúng sẽ không dễ bị lẫn lộn).Thuật toán để tạo màu duy nhất

Tôi có một loạt các đối tượng có ID đếm ngược từ 1. Tôi muốn đại diện cho từng đối tượng này với màu sắc khác nhau, mang tính thẩm mỹ, không dễ bị lẫn lộn với những người hàng xóm. Tuy nhiên, màu sắc không nhất thiết phải là ngẫu nhiên. Tôi muốn nhận được cùng một màu sắc mỗi lần tôi nhập cùng một ID.

Trả lời

6

Số lượng yếu tố có thể có giới hạn thấp hợp lý không? Một giải pháp nhanh chóng và dễ dàng là chỉ lưu trữ một mảng các giá trị màu bằng cách sử dụng ID của mục. Điều đó giả định rằng bạn có số lượng màu tương đối thấp và bạn chắc chắn rằng bạn sẽ không vượt quá một số mục nhất định.

Nếu bạn muốn tạo ra màu sắc thay vì sử dụng danh sách, một mẹo để làm cho chúng có giao diện nhất quán và phù hợp là tạo chúng bằng HSB. Xác định trước độ sáng và độ bão hòa, sau đó căn cứ giá trị màu khỏi một số chức năng của ID (điều này có thể là nhiều thứ tùy thuộc vào số lượng ID bạn dự định có, nhưng nhân ID với một số tiền (và sửa đổi khi vượt quá 255!) Là một cách tiếp cận thô ráp tốt Với ​​cách tiếp cận này, tất cả các màu sắc sẽ “căn chỉnh” về độ bão hòa và độ sáng nhưng mỗi màu sẽ có một màu riêng biệt. quất cùng một giải pháp nhanh chóng:.

class HsbColor 
{ 
    public int Hue { get; set; } 
    public int Saturation { get; set; } 
    public int Brightness { get; set; } 

    public Color ToRGB 
    { 
     // left as exercise to the reader... 
    } 
} 

public class Item 
{ 


    public int Id { get; set; } 
    private static const byte EXPECTED_MAX = 15; 
    private static int HUE_FACTOR = 255/EXPECTED_MAX; 

    public HsbColor Color 
    { 
     get { 

     var color = new HsbColor() { Saturation = 175, Brightness = 175 }; 

     color.Hue = (Id * HUE_FACTOR) % 255; 

     return color; 
     } 
    } 
} 
+0

Xem câu trả lời của tôi cho một cách để tránh dự đoán EXPECTED_MAX và vẫn nhận được một phân bố. –

16

bạn có thể nhân id bởi golden ratio (phi) để có được một số 0 < = n < 1. Tất cả các số mà bạn tạo ra sẽ có xu hướng được phân bố đều

PHI = (1 + sqrt(5))/2 
n = id * PHI - floor(id * PHI) 

Sau đó, chuyển đổi số đó thành màu, ví dụ:

hue = floor(n * 256) 
+7

http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/ –

10

Nhà thiết kế đồ họa biết rằng nếu có nhiều màu sẽ được sử dụng gần nhau trong màn hình thông tin, màu sắc phải tương đối gần nhau trong không gian màu. Những thay đổi nhỏ về độ bão hòa hoặc màu sắc thường tốt hơn nhảy lớn – khi nhiều màu sắc liên quan, mắt người thực sự tìm thấy nó dễ dàng hơn để đồng hóa thông tin khi khoảng cách màu không lớn lắm.

Ngoài ra, đừng quên rằng một số người dùng của bạn sẽ bị mù màu. Vì có rất nhiều loại mù màu, rất khó để biết những kết hợp cần tránh. Có thể ai đó khác có thể giải quyết câu hỏi này?

10

Tôi đã viết một bài viết về cùng một chủ đề này:

How to Generate Random Colors Programmatically

Về cơ bản, bạn có thể sử dụng không gian màu HSV, thiết lập một Saturation cố định và giá trị gia tăng, và sửa đổi các Huế. Khi bạn biết số lượng màu bạn cần, chỉ cần chia phạm vi của Huế [0,1[ bằng cách này. Nếu bạn không biết số lượng màu yêu cầu, bạn vẫn có thể sử dụng tỷ lệ vàng để chọn màu từ không gian này.

+2

Tôi đã triển khai thuật toán của bạn bằng JavaScript: http://jsfiddle.net/hCtc3/2/ –

+1

@philmccull tôi sửa đổi nó để chỉ tạo ra 30 màu sắc độc đáo và trực quan khác nhau bằng cách chỉ thay đổi màu sắc. http://jsfiddle.net/hCtc3/42 – Berty

+1

Kỹ thuật hay. – Timmmm

16

Tôi đã kiểm tra tất cả các cách để thực hiện, giải quyết nhiều cách. Và cuối cùng là sức mạnh vũ phu với CIEde2000 và thực sự, đặt cược tốt nhất của bạn chỉ là một danh sách tĩnh. Bạn không thể nhận được nhiều hơn 30 màu sắc với độ phân biệt tốt bất kể bạn làm gì. Yếu tố trong mù màu và những dòng lộn xộn, và bạn đang thực sự tạo ra cái gì đó là một trở ngại.Sử dụng bảng tra cứu và sửa đổi các điểm dữ liệu với một số đặc điểm khác ngoài màu sắc.

max difference color palette

#000000 
#00FF00 
#0000FF 
#FF0000 
#01FFFE 
#FFA6FE 
#FFDB66 
#006401 
#010067 
#95003A 
#007DB5 
#FF00F6 
#FFEEE8 
#774D00 
#90FB92 
#0076FF 
#D5FF00 
#FF937E 
#6A826C 
#FF029D 
#FE8900 
#7A4782 
#7E2DD2 
#85A900 
#FF0056 
#A42400 
#00AE7E 
#683D3B 
#BDC6FF 
#263400 
#BDD393 
#00B917 
#9E008E 
#001544 
#C28C9F 
#FF74A3 
#01D0FF 
#004754 
#E56FFE 
#788231 
#0E4CA1 
#91D0CB 
#BE9970 
#968AE8 
#BB8800 
#43002C 
#DEFF74 
#00FFC6 
#FFE502 
#620E00 
#008F9C 
#98FF52 
#7544B1 
#B500FF 
#00FF78 
#FF6E41 
#005F39 
#6B6882 
#5FAD4E 
#A75740 
#A5FFD2 
#FFB167 
#009BFF 
#E85EBE 
Các vấn đề liên quan