خوارزمية تولد عشوائيا جماليا ارضاء الألوان [مغلقة]

StackOverflow https://stackoverflow.com/questions/43044

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أبحث عن خوارزمية بسيطة لتوليد عدد كبير من العشوائية ، جماليا الألوان.لذلك لا مجنون ألوان النيون والألوان تذكرنا البراز ، إلخ.

لقد وجدت حلول لهذه المشكلة ولكنها تعتمد على بديل لوحات الألوان من RGB.وأود أن بدلا من مجرد استخدام مستقيم RGB من الخرائط ذهابا وإيابا.هذه حلول أخرى يمكن أيضا في معظم توليد 32 فقط أو حتى إرضاء ألوان عشوائية.

أي أفكار من شأنها أن تكون كبيرة.

هل كانت مفيدة؟

المحلول

يمكنك أن متوسط RGB من ألوان عشوائية مع تلك ثابت اللون:

(على سبيل المثال في جافا)

public Color generateRandomColor(Color mix) {
    Random random = new Random();
    int red = random.nextInt(256);
    int green = random.nextInt(256);
    int blue = random.nextInt(256);

    // mix the color
    if (mix != null) {
        red = (red + mix.getRed()) / 2;
        green = (green + mix.getGreen()) / 2;
        blue = (blue + mix.getBlue()) / 2;
    }

    Color color = new Color(red, green, blue);
    return color;
}


خلط ألوان عشوائية مع الأبيض (255, 255, 255) يخلق محايدة الباستيل خلال زيادة خفة مع الحفاظ على هوى من اللون الأصلي.هذه بشكل عشوائي الباستيل عادة الذهاب معا بشكل جيد ، وخاصة في أعداد كبيرة.

وهنا بعض ألوان الباستيل التي تم إنشاؤها باستخدام الأسلوب أعلاه:

First


يمكنك أيضا مزج لون عشوائي مع ثابت الباستيل ، مما يؤدي ملون مجموعة من الألوان المحايدة.على سبيل المثال, استخدام الضوء الأزرق يخلق الألوان مثل هذه:

Second


الذهاب إلى أبعد من ذلك ، يمكنك إضافة الاستدلال على المولدات الخاصة بك أن تأخذ في الاعتبار الألوان المكملة أو مستويات من التظليل ، ولكن كل ذلك يعتمد على الانطباع الذي تريد تحقيقه مع ألوان عشوائية.

بعض الموارد الإضافية:

نصائح أخرى

وأود أن استخدام عجلة الألوان و بالنظر إلى موقف عشوائي يمكن إضافة زاوية الذهبي (137,5 درجة)

http://en.wikipedia.org/wiki/Golden_angle

من أجل الحصول على ألوان مختلفة في كل مرة أن لا تتداخل.

ضبط سطوع عجلة الألوان يمكن أن تحصل أيضا مختلفة مشرق/الظلام تركيبات الألوان.

لقد وجدت هذا بلوق وظيفة أن يفسر بشكل جيد المشكلة و الحل باستخدام النسبة الذهبية.

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

تحديث: لقد وجدت هذا النهج:

هذا يسمى RYB(الأحمر والأصفر والأزرق) طريقة هو موضح في هذه الورقة:

http://threekings.tk/mirror/ryb_TR.pdf

كما "الطلاء مستوحاة من لون التركيب".

خوارزمية تولد الألوان و كل لون جديد اختيار لتعظيم الإقليدية المسافة المحددة سابقا منها.

هنا يمكنك أن تجد جيدة في تنفيذ جافا سكريبت:

http://afriggeri.github.com/RYB/

تحديث 2:

العلوم بو Medialb قد صدر للتو أداة تسمى "أريد هوى" التي تولد لوحات الألوان البيانات العلماء.باستخدام لون مختلف الأماكن و توليد لوحات باستخدام k-means clustering أو القوة ناقلات ( تنافر الرسوم البيانية) النتائج من تلك الأساليب هي جيدة جدا ، فإنها تظهر نظرية التنفيذ في صفحة الويب الخاصة بهم.

http://tools.medialab.sciences-po.fr/iwanthue/index.php

في جافا سكريبت:

function pastelColors(){
    var r = (Math.round(Math.random()* 127) + 127).toString(16);
    var g = (Math.round(Math.random()* 127) + 127).toString(16);
    var b = (Math.round(Math.random()* 127) + 127).toString(16);
    return '#' + r + g + b;
}

رأيت الفكرة هنا: http://blog.functionalfun.net/2008/07/random-pastel-colour-generator.html

تحويل إلى آخر لوحة هو أفضل بكثير من طريقة للقيام بذلك.هناك سبب لفعل ذلك:لوحات أخرى هي 'الإدراك الحسي' - أنها وضعت مماثلة على ما يبدو الألوان قريبة من بعضها البعض ، و ضبط متغير واحد يتغير لون بطريقة يمكن التنبؤ بها.لا شيء من ذلك صحيح بالنسبة RGB, حيث لا توجد علاقة واضحة بين الألوان أن "الذهاب معا بشكل جيد".

الجواب لا ينبغي أن يغفل عنها ، لانها بسيطة و يقدم مزايا ، أخذ العينات من الصور واللوحات.العينة العديد من عشوائية بكسل كما تريد ألوان عشوائية على الصور المصغرة من الفن الحديث الهادئ ، سيزان وفان جوخ ، مونيه, صور...ميزة هو أنه يمكنك الحصول على الألوان من خلال موضوع وأنهم العضوية الألوان.فقط ضع 20 - 30 صورة في مجلد عشوائية عينة عشوائية الموافقة المسبقة عن علم في كل مرة.

التحويل إلى هامبورغ القيم على نطاق واسع رمز خوارزمية نفسيا القائمة على لوحة.هامبورغ هو أسهل بطريقة عشوائية.

في php:

function pastelColors() {
    $r = dechex(round(((float) rand() / (float) getrandmax()) * 127) + 127);
    $g = dechex(round(((float) rand() / (float) getrandmax()) * 127) + 127);
    $b = dechex(round(((float) rand() / (float) getrandmax()) * 127) + 127);

    return "#" . $r . $g . $b;
}

المصدر: https://stackoverflow.com/a/12266311/2875783

لقد كان النجاح باستخدام TriadMixing و CIE94 لتجنب ألوان مماثلة.الصورة التالية يستخدم إدخال الألوان الأحمر والأصفر والأبيض.انظر هنا.

TriadMixing + CIE94

هنا هو سريعة وقذرة اللون مولد في C# (باستخدام 'RYB نهج' كما هو موضح في هذا المادة).إنها كتابة من جافا سكريبت.

استخدام:

List<Color> ColorPalette = ColorGenerator.Generate(30).ToList();

أول اثنين من الألوان تميل إلى أن تكون بيضاء الظل الأسود.أنا غالبا ما تخطي عليهم مثل هذا (باستخدام Linq):

List<Color> ColorsPalette = ColorGenerator
            .Generate(30)
            .Skip(2) // skip white and black
            .ToList(); 

التنفيذ:

public static class ColorGenerator
{

    // RYB color space
    private static class RYB
    {
        private static readonly double[] White = { 1, 1, 1 };
        private static readonly double[] Red = { 1, 0, 0 };
        private static readonly double[] Yellow = { 1, 1, 0 };
        private static readonly double[] Blue = { 0.163, 0.373, 0.6 };
        private static readonly double[] Violet = { 0.5, 0, 0.5 };
        private static readonly double[] Green = { 0, 0.66, 0.2 };
        private static readonly double[] Orange = { 1, 0.5, 0 };
        private static readonly double[] Black = { 0.2, 0.094, 0.0 };

        public static double[] ToRgb(double r, double y, double b)
        {
            var rgb = new double[3];
            for (int i = 0; i < 3; i++)
            {
                rgb[i] = White[i]  * (1.0 - r) * (1.0 - b) * (1.0 - y) +
                         Red[i]    * r         * (1.0 - b) * (1.0 - y) +
                         Blue[i]   * (1.0 - r) * b         * (1.0 - y) +
                         Violet[i] * r         * b         * (1.0 - y) +
                         Yellow[i] * (1.0 - r) * (1.0 - b) *        y +
                         Orange[i] * r         * (1.0 - b) *        y +
                         Green[i]  * (1.0 - r) * b         *        y +
                         Black[i]  * r         * b         *        y;
            }

            return rgb;
        }
    }

    private class Points : IEnumerable<double[]>
    {
        private readonly int pointsCount;
        private double[] picked;
        private int pickedCount;

        private readonly List<double[]> points = new List<double[]>();

        public Points(int count)
        {
            pointsCount = count;
        }

        private void Generate()
        {
            points.Clear();
            var numBase = (int)Math.Ceiling(Math.Pow(pointsCount, 1.0 / 3.0));
            var ceil = (int)Math.Pow(numBase, 3.0);
            for (int i = 0; i < ceil; i++)
            {
                points.Add(new[]
                {
                    Math.Floor(i/(double)(numBase*numBase))/ (numBase - 1.0),
                    Math.Floor((i/(double)numBase) % numBase)/ (numBase - 1.0),
                    Math.Floor((double)(i % numBase))/ (numBase - 1.0),
                });
            }
        }

        private double Distance(double[] p1)
        {
            double distance = 0;
            for (int i = 0; i < 3; i++)
            {
                distance += Math.Pow(p1[i] - picked[i], 2.0);
            }

            return distance;
        }

        private double[] Pick()
        {
            if (picked == null)
            {
                picked = points[0];
                points.RemoveAt(0);
                pickedCount = 1;
                return picked;
            }

            var d1 = Distance(points[0]);
            int i1 = 0, i2 = 0;
            foreach (var point in points)
            {
                var d2 = Distance(point);
                if (d1 < d2)
                {
                    i1 = i2;
                    d1 = d2;
                }

                i2 += 1;
            }

            var pick = points[i1];
            points.RemoveAt(i1);

            for (int i = 0; i < 3; i++)
            {
                picked[i] = (pickedCount * picked[i] + pick[i]) / (pickedCount + 1.0);
            }

            pickedCount += 1;
            return pick;
        }

        public IEnumerator<double[]> GetEnumerator()
        {
            Generate();
            for (int i = 0; i < pointsCount; i++)
            {
                yield return Pick();
            }
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }

    public static IEnumerable<Color> Generate(int numOfColors)
    {
        var points = new Points(numOfColors);

        foreach (var point in points)
        {
            var rgb = RYB.ToRgb(point[0], point[1], point[2]);
            yield return Color.FromArgb(
                (int)Math.Floor(255 * rgb[0]),
                (int)Math.Floor(255 * rgb[1]),
                (int)Math.Floor(255 * rgb[2]));
        }
    }
}

ديفيد الغراب طريقة في البحث والتطوير اثنين من الخطوط الملاحية المنتظمة:

GetRandomColours <- function(num.of.colours, color.to.mix=c(1,1,1)) {
  return(rgb((matrix(runif(num.of.colours*3), nrow=num.of.colours)*color.to.mix)/2))
}
function fnGetRandomColour(iDarkLuma, iLightLuma) 
{       
  for (var i=0;i<20;i++)
  {
    var sColour = ('ffffff' + Math.floor(Math.random() * 0xFFFFFF).toString(16)).substr(-6);

    var rgb = parseInt(sColour, 16);   // convert rrggbb to decimal
    var r = (rgb >> 16) & 0xff;  // extract red
    var g = (rgb >>  8) & 0xff;  // extract green
    var b = (rgb >>  0) & 0xff;  // extract blue

    var iLuma = 0.2126 * r + 0.7152 * g + 0.0722 * b; // per ITU-R BT.709


    if (iLuma > iDarkLuma && iLuma < iLightLuma) return sColour;
  }
  return sColour;
} 

على الباستيل ، تمر في أعلى لمى الظلام/الضوء الأعداد الصحيحة - أي fnGetRandomColour(120, 250)

الاعتمادات:جميع الاعتمادات http://paulirish.com/2009/random-hex-color-code-snippets/ ستاكوفيرفلوو.com/أسئلة/12043187/كيف تحقق-إذا-hex-اللون-هو-أيضا-أسود

جافا سكريبت التكيف داود الغراب الأصلي الإجابة ، أي و Nodejs رمز معين المدرجة.

generateRandomComplementaryColor = function(r, g, b){
    //--- JavaScript code
    var red = Math.floor((Math.random() * 256));
    var green = Math.floor((Math.random() * 256));
    var blue = Math.floor((Math.random() * 256));
    //---

    //--- Extra check for Internet Explorers, its Math.random is not random enough.
    if(!/MSIE 9/i.test(navigator.userAgent) && !/MSIE 10/i.test(navigator.userAgent) && !/rv:11.0/i.test(navigator.userAgent)){
        red = Math.floor((('0.' + window.crypto.getRandomValues(new Uint32Array(1))[0]) * 256));
        green = Math.floor((('0.' + window.crypto.getRandomValues(new Uint32Array(1))[0]) * 256));
        blue = Math.floor((('0.' + window.crypto.getRandomValues(new Uint32Array(1))[0]) * 256));
    };
    //---

    //--- nodejs code
    /*
    crypto = Npm.require('crypto');
    red = Math.floor((parseInt(crypto.randomBytes(8).toString('hex'), 16)) * 1.0e-19 * 256);
    green = Math.floor((parseInt(crypto.randomBytes(8).toString('hex'), 16)) * 1.0e-19 * 256);
    blue = Math.floor((parseInt(crypto.randomBytes(8).toString('hex'), 16)) * 1.0e-19 * 256);
    */
    //---

    red = (red + r)/2;
    green = (green + g)/2;
    blue = (blue + b)/2;

    return 'rgb(' + Math.floor(red) + ', ' + Math.floor(green) + ', ' + Math.floor(blue) + ')';
}

تشغيل الدالة باستخدام:

generateRandomComplementaryColor(240, 240, 240);

هل يمكن أن يكون لهم في السطوع.التي من شأنها أن تحكم ammount من "النيون" الألوان قليلا.فعلى سبيل المثال ، إذا كان "سطوع"

brightness = sqrt(R^2+G^2+B^2)

كان في أعلى مستوى معين لا بد يكون غسلها, لون الضوء عليه.على العكس من ذلك ، إذا كان في معين منخفضة لا بد سيكون أكثر قتامة.وهذا من شأنه القضاء على أي مجنون الصدارة الألوان و إذا اخترت لا بد عالية جدا أو منخفضة حقا ، فإنها ستكون قريبة إلى حد ما إما أبيض أو أسود.

سيكون من الصعب الحصول على ما تريد حسابيا - الناس تم دراسة نظرية اللون لفترة طويلة و لا حتى تعرف كل القواعد.

ومع ذلك ، هناك بعض القواعد التي يمكنك استخدامها اعدام سيئة تركيبات الألوان (أي هناك قواعد الاشتباك الألوان و اختيار الألوان المكملة).

أنصح لك زيارة المكتبة قسم الفن و تحقق من كتب عن نظرية الألوان للحصول على فهم أفضل لما هو لون جيد من قبل كنت في محاولة لجعل واحدة - يبدو أنك قد لا تعرف حتى لماذا بعض مجموعات العمل والبعض الآخر لا.

-آدم

أود أن نوصي بشدة باستخدام CG HSVtoRGB تظليل وظيفة ، فهي رهيبة...يعطيك اللون الطبيعي التحكم مثل الرسام بدلا من التحكم مثل crt التي تخلخل ويفترض!

هذا هو وسيلة لكسب 1 تعويم قيمة.أيرمادي, إلى 1000 ds من تركيبات من الألوان والسطوع والتشبع وغيرها:

int rand = a global color randomizer that you can control by script/ by a crossfader etc.
float h = perlin(grey,23.3*rand)
float s = perlin(grey,54,4*rand)
float v = perlin(grey,12.6*rand)

Return float4 HSVtoRGB(h,s,v);

النتيجة رهيبة اللون العشوائية!هذا ليس طبيعيا ولكنه يستخدم اللون الطبيعي التدرجات و يبدو العضوية controlleably irridescent / الباستيل المعلمات.

بالنسبة بيرلين, يمكنك استخدام هذه الوظيفة ، بل هو سريع زجزاج نسخة من بيرلين.

function  zig ( xx : float ): float{    //lfo nz -1,1
    xx= xx+32;
    var x0 = Mathf.Floor(xx);
    var x1 = x0+1;
    var v0 = (Mathf.Sin (x0*.014686)*31718.927)%1;
    var v1 = (Mathf.Sin  (x1*.014686)*31718.927)%1;
    return Mathf.Lerp( v0 , v1 , (xx)%1 )*2-1;
}

هنا هو شيء كتبته لموقع صنعت.وسوف لصناعة السيارات في توليد عشوائي شقة لون الخلفية لأي div مع الطبقة .flat-color-gen.مسج مطلوب فقط لأغراض إضافة css الصفحة ؛ ليس المطلوب في الجزء الرئيسي من هذا الذي هو generateFlatColorWithOrder() الأسلوب.

JsFiddle الرابط

(function($) {
    function generateFlatColorWithOrder(num, rr, rg, rb) {
        var colorBase = 256;
        var red = 0;
        var green = 0;
        var blue = 0;
        num = Math.round(num);
        num = num + 1;
        if (num != null) {

            red = (num*rr) % 256;
            green = (num*rg) % 256;
            blue = (num*rb) % 256;
        }
        var redString = Math.round((red + colorBase) / 2).toString();
        var greenString = Math.round((green + colorBase) / 2).toString();
        var blueString = Math.round((blue + colorBase) / 2).toString();
        return "rgb("+redString+", "+greenString+", "+blueString+")";
        //return '#' + redString + greenString + blueString;
    }

    function generateRandomFlatColor() {
        return generateFlatColorWithOrder(Math.round(Math.random()*127));
    }

    var rr = Math.round(Math.random()*1000);
    var rg = Math.round(Math.random()*1000);
    var rb = Math.round(Math.random()*1000);
    console.log("random red: "+ rr);
    console.log("random green: "+ rg);
    console.log("random blue: "+ rb);
    console.log("----------------------------------------------------");
    $('.flat-color-gen').each(function(i, obj) {
        console.log(generateFlatColorWithOrder(i));
        $(this).css("background-color",generateFlatColorWithOrder(i, rr, rg, rb).toString());
    });
})(window.jQuery);

استخدام متميزة-الألوان.

مكتوب في جافا سكريبت.

فإنه يولد لوحة من بصريا ألوان مختلفة.

متميزة-الألوان هو شكلي للغاية:

  • اختيار كيفية العديد من الألوان في لوحة
  • تقييد هوى إلى مجموعة محددة
  • تقييد صفاء (التشبع) إلى مجموعة محددة
  • تقييد خفة إلى مجموعة محددة
  • تكوين العامة نوعية لوحة
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top