2009-04-21 50 views
17

Tôi muốn vẽ một số dữ liệu vào một kết cấu: nhiều mục liên tiếp. Chúng không được tạo ra theo thứ tự, và tất cả chúng có thể có kích thước khác nhau (nghĩ về một đống bộ nhớ). Mỗi mục dữ liệu là một hình chữ nhật nhỏ và tôi muốn có thể phân biệt chúng với nhau, vì vậy tôi muốn mỗi người trong số họ có một màu duy nhất.Tạo các màu duy nhất

Bây giờ tôi chỉ có thể sử dụng rand() để tạo các giá trị RGB và hy vọng tất cả chúng khác nhau, nhưng tôi nghi ngờ tôi sẽ không phân phối tốt trong không gian RGB. Có cách nào tốt hơn thế này không? Ví dụ. một cách tốt để đi xe đạp qua các màu sắc khác nhau trước khi chúng (gần) lặp lại là gì?

Màu sắc không phải khớp với bất kỳ dữ liệu nào trong các mục. Tôi chỉ muốn có thể nhìn vào nhiều giá trị và thấy rằng chúng khác nhau, vì chúng liền kề nhau.

Tôi có thể tìm ra điều gì đó nhưng tôi nghĩ đây là một câu hỏi thú vị. :)

+0

điều đó là đúng! đây là một câu hỏi rất thú vị :-) – dfa

+0

Xem http://stackoverflow.com/questions/470690/how-to-automatically-generate-n-distinct-colors/4382138#4382138 –

Trả lời

13

Sử dụng mô hình màu RGB không phải là cách hay để có được kết hợp màu sắc tốt. Tốt hơn là sử dụng một mô hình màu khác để tạo màu của bạn và sau đó chuyển đổi từ mô hình màu đó thành RGB.

Thay vào đó, tôi đề xuất bạn chọn kiểu màu HSV or HSL, đặc biệt bạn muốn thay đổi Hue.

Nếu bạn muốn các giá trị màu sắc khác nhau X, thay đổi chúng 0-360 với kích thước bước của 360 chia cho X.

+1

0, 360 (cùng màu), 180 , 300, 390, 102, 162, 213, 258, 298 (về cơ bản 300 lần nữa), 334, 367, (về cơ bản là 360 lần thứ ba). – Tatarize

2

Whats không gian mẫu của bạn ... có bao nhiêu mặt hàng chúng ta đang nói.

Bạn có thể xây dựng một mảng của RGB Triples từ

for(int r = 0; r < 255; r = r+16) 
    for(int g = 0; g < 255; g = g+16) 
     for(int b = 0; b < 255; b = b+16) 
      // take r, g, b and add it to a list 

Sau đó randomise danh sách của bạn và lặp qua nó. sẽ cung cấp cho bạn 16^3 (4096) các màu khác nhau trước một màu lặp lại.

+0

Giống hệt rand (0,16) << 20 | rand (0,16) << 12 | rand (0,16) << 4. Đó là màu ngẫu nhiên giữa # 000 và #FFF với màu 12 bit, kiểm tra lặp lại. Ví dụ # 0A0 và # 090 của bạn đặc biệt với sự phân biệt màu sắc với màu xanh sẽ trông khá giống nhau. – Tatarize

4

Nói chung RGB không phải là một không gian màu tuyệt vời để thực hiện những điều này bởi vì nó là phi tuyến cảm nhận, cho người mới bắt đầu. Điều này có nghĩa là khoảng cách bằng nhau di chuyển giữa các bộ ba RGB không khác nhau bằng mắt thường.

Tôi có thể làm việc trong không gian L*c*h* không gian (see also) hoặc HSL không gian và chỉ tạo khoảng cách thống nhất trong màu sắc. Những khoảng trống này đã được thiết kế để xấp xỉ tuyến tính.

+2

Ngay cả trong khoảng cách thường xuyên HSL của 'hue' là [không phải là tuyến tính cảm nhận] (http://phrogz.net/tmp/colordifferences). – Phrogz

+1

HSL là phép chuyển đổi toán trực tiếp từ RGB bất kể màu sắc cụ thể. Các không gian không được thiết kế để tuyến tính. LCH là một sửa đổi của LAB mà thực sự đòi hỏi phải có màu sắc dựa trên sự đe dọa để phù hợp hơn với mắt người. – Tatarize

0

này rất giống với vấn đề bốn màu liên quan đến bản đồ màu, điều này có thể mang lại một số giải pháp thú vị dành cho bạn:

Four colour theorem

+2

Nó thực sự không phải là tất cả những gì tương tự như vấn đề màu 4. Nick đang sử dụng nhiều màu sắc khi cần thiết, trong khi các vấn đề về màu đang cố gắng giảm thiểu số lượng bạn cần .... – simon

+0

Thực ra nó không liên quan gì đến vấn đề màu 4, trong đó chỉ cần 4 màu và chúng chỉ được sử dụng dưới dạng "thẻ". Ở đây, anh ta quan tâm đến những phẩm chất quang học (giống hệt) của các màu đã chọn. – Hejazzman

+1

Tôi không đồng ý, tôi nghĩ rằng có công đức trong vấn đề màu 4 ở đây. Vấn đề là phân biệt các hạng mục được sắp xếp trong một mặt phẳng 2D thông qua việc sử dụng màu sắc. Vấn đề 4 màu chứng minh rằng bạn * có thể * giải quyết vấn đề bằng cách sử dụng chỉ 4 màu tương phản. –

2

Google "đồng bằng e cie 2000"; công thức khác biệt màu sắc rất hữu ích để xác định khoảng cách rõ ràng (trực quan) giữa 2 màu. (Trên một màn hình, có một công thức khác nhau cho sắc tố.) Nó hoạt động trên màu sắc trong không gian phòng thí nghiệm (đạo cụ để simon), nhưng áp dụng một tính toán cảm nhận của sự khác biệt.

Chúng tôi phát hiện ra rằng một số khoảng 1,5 là đủ để đảm bảo thị biệt màu sắc (tức là bạn có thể biết sự khác biệt nếu họ đang ở gần nhau), nhưng nếu bạn muốn mang tính chất màu (bạn có thể tìm thấy bất kỳ màu sắc trong một huyền thoại), bạn sẽ cần phải tăng lên.

Để tạo bộ màu ...Tôi có thể bắt đầu ở một góc của không gian Lab, và đi xung quanh nó bằng cách sử dụng một kích thước bước tạo ra sự khác biệt lớn về hình ảnh (lưu ý: nó không tuyến tính, vì vậy kích thước bước có thể sẽ thích ứng) và sau đó ngẫu nhiên danh sách.

0

Nếu bạn chỉ cần một bộ màu perceptually-biệt (và không phải là một thuật toán để tạo ra chúng) tôi đã tạo ra một công cụ miễn phí trên trang web của tôi mà chỉ làm điều đó:
http://phrogz.net/css/distinct-colors.html

Thay vì chỉ sử dụng thậm chí khoảng cách trong không gian RGB hoặc HSV (không phân bố đồng đều đối với nhận thức của con người), công cụ này cho phép bạn tạo ra một mạng lưới các giá trị trong không gian HSV và sau đó sử dụng tiêu chuẩn CMC(I:c) cho khoảng cách màu sắc để ném ra màu sắc. với nhau. (Thanh trượt 'ngưỡng' trên tab thứ hai cho phép bạn kiểm soát mức độ khác biệt của màu sắc thị giác, hiển thị cho bạn kết quả theo thời gian thực.)

Cuối cùng, bạn có thể sắp xếp danh sách các màu được tạo theo các tiêu chí khác nhau, và sau đó đồng đều 'xáo trộn' danh sách đó để bạn được đảm bảo có các giá trị riêng biệt trực quan nằm cạnh nhau trong danh sách. (Tôi khuyên bạn nên sử dụng giá trị 'Interleave' khoảng 5).

Khi công cụ này hoạt động tốt với Chrome, Safari và (thông qua một shim) Firefox; IE9 không hỗ trợ thanh trượt đầu vào phạm vi HTML5, mà giao diện người dùng sử dụng rộng rãi để khám phá tương tác.

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