Saya menulis dua metode di bawah ini untuk secara otomatis memilih N warna yang berbeda. Ia bekerja dengan mendefinisikan fungsi linear satu demi satu pada kubus RGB. Keuntungan dari ini adalah Anda juga bisa mendapatkan skala progresif jika itu yang Anda inginkan, tetapi ketika N menjadi besar, warnanya bisa mulai terlihat serupa. Saya juga bisa membayangkan membagi RGB cube secara merata menjadi sebuah kisi dan kemudian menggambar poin. Adakah yang tahu metode lain? Saya mengesampingkan mendefinisikan daftar dan kemudian hanya bersepeda melalui itu. Saya juga harus mengatakan saya biasanya tidak peduli jika mereka berbenturan atau tidak terlihat bagus, mereka hanya harus berbeda secara visual.
public static List<Color> pick(int num) {
List<Color> colors = new ArrayList<Color>();
if (num < 2)
return colors;
float dx = 1.0f / (float) (num - 1);
for (int i = 0; i < num; i++) {
colors.add(get(i * dx));
}
return colors;
}
public static Color get(float x) {
float r = 0.0f;
float g = 0.0f;
float b = 1.0f;
if (x >= 0.0f && x < 0.2f) {
x = x / 0.2f;
r = 0.0f;
g = x;
b = 1.0f;
} else if (x >= 0.2f && x < 0.4f) {
x = (x - 0.2f) / 0.2f;
r = 0.0f;
g = 1.0f;
b = 1.0f - x;
} else if (x >= 0.4f && x < 0.6f) {
x = (x - 0.4f) / 0.2f;
r = x;
g = 1.0f;
b = 0.0f;
} else if (x >= 0.6f && x < 0.8f) {
x = (x - 0.6f) / 0.2f;
r = 1.0f;
g = 1.0f - x;
b = 0.0f;
} else if (x >= 0.8f && x <= 1.0f) {
x = (x - 0.8f) / 0.2f;
r = 1.0f;
g = 0.0f;
b = x;
}
return new Color(r, g, b);
}
java
colors
color-scheme
color-picker
pekerjaan
sumber
sumber
Jawaban:
Anda dapat menggunakan model warna HSL untuk membuat warna Anda.
Jika semua yang Anda inginkan adalah rona berbeda (kemungkinan), dan sedikit variasi pada cahaya atau saturasi, Anda dapat mendistribusikan rona seperti:
sumber
Pertanyaan-pertanyaan ini muncul dalam beberapa diskusi SO:
Berbagai solusi diusulkan, tetapi tidak ada yang optimal. Untungnya, sains menyelamatkan
Sewenang-wenang N
2 yang terakhir akan gratis melalui sebagian besar perpustakaan / proxy universitas.
N terbatas dan relatif kecil
Dalam hal ini, orang bisa mencari solusi daftar. Artikel yang sangat menarik dalam subjek ini tersedia secara gratis:
Ada beberapa daftar warna yang perlu dipertimbangkan:
Saya juga bertemu dengan Palette ini oleh seorang mahasiswa MIT. Terakhir, Tautan berikut mungkin berguna untuk mengkonversi antara sistem warna / koordinat yang berbeda (beberapa warna dalam artikel tidak ditentukan dalam RGB, misalnya):
Untuk daftar Kelly dan Boynton, saya sudah membuat konversi ke RGB (dengan pengecualian putih dan hitam, yang seharusnya jelas). Beberapa kode C #:
Dan berikut adalah nilai RGB dalam representasi hex dan 8-bit-per-channel:
Untuk Anda semua pengembang Java, berikut adalah warna JavaFX:
berikut ini adalah warna kelly yang tidak disortir menurut urutan di atas.
berikut ini adalah warna kelly yang disortir berdasarkan rona (perhatikan bahwa beberapa warna kuning tidak terlalu kontras)
sumber
Seperti jawaban Uri Cohen, tetapi sebagai gantinya. Akan mulai dengan menggunakan warna yang berjauhan. Deterministik.
Sampel, warna kiri terlebih dahulu:
sumber
Ini ide. Bayangkan sebuah silinder HSV
Tetapkan batas atas dan bawah yang Anda inginkan untuk Kecerahan dan Kejenuhan. Ini mendefinisikan cincin penampang persegi dalam ruang.
Sekarang, sebarkan N poin secara acak di dalam ruang ini.
Kemudian menerapkan algoritma repulsion berulang pada mereka, baik untuk jumlah iterasi tetap, atau sampai titik stabil.
Sekarang Anda harus memiliki N poin yang mewakili N warna yang sekitar berbeda mungkin dalam ruang warna yang Anda minati.
Hugo
sumber
Demi generasi yang akan datang, saya tambahkan di sini jawaban yang diterima dengan Python.
sumber
Semua orang tampaknya telah kehilangan keberadaan ruang warna YUV yang sangat berguna yang dirancang untuk mewakili perbedaan warna yang dirasakan dalam sistem visual manusia. Jarak di YUV mewakili perbedaan dalam persepsi manusia. Saya membutuhkan fungsi ini untuk MagicCube4D yang mengimplementasikan kubus Rubik 4-dimensi dan jumlah tak terbatas dari teka-teki berkelok-kelok 4D lainnya yang memiliki jumlah wajah yang berubah-ubah.
Solusi saya mulai dengan memilih titik-titik acak di YUV dan kemudian secara iteratif memecah dua titik terdekat, dan hanya mengkonversi ke RGB ketika mengembalikan hasilnya. Metodenya O (n ^ 3) tapi itu tidak masalah untuk jumlah kecil atau yang bisa di-cache. Ini tentu bisa dibuat lebih efisien tetapi hasilnya tampak sangat baik.
Fungsi ini memungkinkan spesifikasi opsional batas kecerahan agar tidak menghasilkan warna di mana tidak ada komponen yang lebih terang atau lebih gelap dari jumlah yang diberikan. IE Anda mungkin tidak ingin nilai dekat dengan hitam atau putih. Ini berguna ketika warna yang dihasilkan akan digunakan sebagai warna dasar yang kemudian diarsir melalui pencahayaan, layering, transparansi, dll. Dan harus tetap terlihat berbeda dari warna dasar mereka.
sumber
Model warna HSL mungkin cocok untuk warna "sortasi", tetapi jika Anda mencari warna yang berbeda secara visual, Anda pasti membutuhkan model warna Lab .
Setelah Anda tahu itu, menemukan subset optimal N warna dari berbagai warna masih merupakan masalah (NP) yang sulit, jenis yang mirip dengan masalah salesman keliling dan semua solusi menggunakan algoritma k-mean atau sesuatu yang tidak akan benar-benar Tolong.
Yang mengatakan, jika N tidak terlalu besar dan jika Anda mulai dengan seperangkat warna terbatas, Anda akan dengan mudah menemukan subset warna yang sangat baik menurut jarak Lab dengan fungsi acak sederhana.
Saya telah memberi kode alat semacam itu untuk penggunaan saya sendiri (Anda dapat menemukannya di sini: https://mokole.com/palette.html ), inilah yang saya dapatkan untuk N = 7:
Ini semua javascript jadi silakan untuk melihat sumber halaman dan menyesuaikannya untuk kebutuhan Anda sendiri.
sumber
L
dari 0 hingga 128 dana
danb
dari -128 hingga 128. ¶ Saya mulai denganL
= 0,a
= -128,b
= -128 yang berwarna biru cerah. Lalu saya bertambaha
tiga kali. ❶ Perubahan besar (+128)a
= 50 menghasilkan warna biru yang sedikit lebih gelap. ❷ (+85)a
= 85 hasil masih berwarna biru. ❸ Namun, perubahan yang relatif kecil (+43)a
= 128 benar-benar mengubah warna menjadi fuchsia.Inilah solusi untuk mengelola masalah "berbeda" Anda, yang sepenuhnya berlebihan:
Buat unit bola dan jatuhkan poin di atasnya dengan biaya memukul mundur. Jalankan sistem partikel hingga mereka tidak lagi bergerak (atau delta "cukup kecil"). Pada titik ini, masing-masing poin sejauh mungkin dari satu sama lain. Konversi (x, y, z) ke rgb.
Saya menyebutkannya karena untuk kelas masalah tertentu, solusi jenis ini dapat bekerja lebih baik daripada brute force.
Saya awalnya melihat pendekatan ini di sini untuk mempelajari bulatan.
Sekali lagi, solusi yang paling jelas dari melintasi ruang HSL atau ruang RGB mungkin akan berfungsi dengan baik.
sumber
Saya akan mencoba untuk memperbaiki saturasi dan luminasi maksimum dan fokus pada rona saja. Seperti yang saya lihat, H dapat bergerak dari 0 hingga 255 dan kemudian membungkusnya. Sekarang jika Anda menginginkan dua warna yang kontras, Anda akan mengambil sisi berlawanan dari cincin ini, yaitu 0 dan 128. Jika Anda menginginkan 4 warna, Anda akan dipisahkan oleh 1/4 dari 256 panjang lingkaran, yaitu 0, 64.128.192. Dan tentu saja, seperti yang disarankan orang lain saat Anda membutuhkan N warna, Anda bisa memisahkannya dengan 256 / N.
Apa yang akan saya tambahkan ke ide ini adalah dengan menggunakan representasi terbalik dari angka biner untuk membentuk urutan ini. Lihat ini:
... dengan cara ini jika Anda membutuhkan N warna yang berbeda, Anda hanya dapat mengambil angka N pertama, membalikkannya, dan Anda mendapatkan poin sejauh mungkin (untuk N menjadi kekuatan dua) sementara pada saat yang sama mempertahankan bahwa setiap awalan dari urutan berbeda banyak.
Ini adalah tujuan penting dalam kasus penggunaan saya, karena saya memiliki grafik di mana warna diurutkan berdasarkan area yang dicakup oleh warna ini. Saya ingin area terbesar dari grafik memiliki kontras yang besar, dan saya setuju dengan beberapa area kecil untuk memiliki warna yang mirip dengan yang dari 10 teratas, karena jelas bagi pembaca yang mana yang mana hanya dengan mengamati area tersebut.
sumber
getfracs
. Tapi pendekatan Anda cepat dan "sederhana" dalam bahasa tingkat rendah: bit membalikkan di C .Jika N cukup besar, Anda akan mendapatkan warna yang mirip. Hanya ada begitu banyak dari mereka di dunia.
Mengapa tidak mendistribusikannya secara merata melalui spektrum, seperti:
Jika Anda ingin mencampur urutan sehingga warna yang serupa tidak bersebelahan, Anda mungkin dapat mengacak daftar yang dihasilkan.
Apakah saya memikirkan ini?
sumber
Ini sepele di MATLAB (ada perintah hsv):
sumber
Saya telah menulis paket untuk R yang disebut qualpalr yang dirancang khusus untuk tujuan ini. Saya sarankan Anda melihat sketsa untuk mengetahui cara kerjanya, tetapi saya akan mencoba merangkum poin-poin utama.
qualpalr mengambil spesifikasi warna dalam ruang warna HSL (yang telah dijelaskan sebelumnya dalam utas ini), memproyeksikannya ke ruang warna DIN99d (yang secara seragam seragam) dan menemukan
n
yang memaksimalkan jarak minimum di antara mereka.sumber
Saya pikir algoritma rekursif sederhana ini melengkapi jawaban yang diterima, untuk menghasilkan nilai rona yang berbeda. Saya membuatnya untuk hsv, tetapi dapat digunakan untuk ruang warna lain juga.
Ini menghasilkan rona dalam siklus, terpisah sebanyak mungkin satu sama lain dalam setiap siklus.
Saya tidak dapat menemukan algoritma semacam ini di sini. Saya harap ini membantu, ini posting pertama saya di sini.
sumber
Fungsi OpenCV ini menggunakan model warna HSV untuk menghasilkan
n
warna yang terdistribusi secara merata di sekitar 0 <= H <= 360º dengan maksimum S = 1.0 dan V = 1.0. Fungsi menampilkan warna BGR dalambgr_mat
:sumber