www.webdeveloper.com
Results 1 to 4 of 4

Thread: I need help shrinking this function

  1. #1
    Join Date
    Jun 2009
    Posts
    10

    I need help shrinking this function

    Code:
    function(r, g, b)
    {
    	r = r / 255;
    	g = g / 255;
    	b = b / 255;
    	var minv = Math.min(r, g, b);
    	var maxv = Math.max(r, g, b);
    	var d    = maxv - minv;
    	var v = maxv;
    	if(d == 0)
    	{
    		var h = 0;
    		var s = 0;
    	}
    	else
    	{
    		s = d / maxv;
    		var dr = ((maxv - r) / 6 + (d / 2)) / d;
    		var dg = ((maxv - g) / 6 + (d / 2)) / d;
    		var db = ((maxv - b) / 6 + (d / 2)) / d;
    		h = r == maxv ? db - dg : g == maxv ? (1 / 3) + dr - db : b == maxv ? (2 / 3) + dg - dr : 0;
    		
    		h = h < 0 ? h += 1 : h > 1 ? h -= 1 : h;
    	}
    	h = Math.round(h * 360);
    	s = Math.round(s * 100);
    	v = Math.round(v * 100);
    	return "[" + h + ", " + s + ", " + v + "]";
    }
    It's quite long, longer than I'd like... My only way to shrink it was to take 3 if's and make them into a nested inline if, which I am still kinda amused that it works. Any ideas?
    Last edited by TheCowGoesMoo; 06-26-2009 at 03:49 PM. Reason: more random tabs?

  2. #2
    Join Date
    Jun 2007
    Posts
    667
    How do you call this function without a name?
    Code:
    h = h < 0 ? h += 1 : h > 1 ? h -= 1 : h;
    The assignment to h is redundant and the expression could be written:
    Code:
    h < 0 ? h += 1 : h > 1 ? h -= 1 : h;
    It's hazardous to declare variables within conditional blocks, since it can lead to referencing of non existent variables later in the function, or as demonstrated here:
    Code:
    	if(d == 0)
    	{
    		var h = 0;
    		var s = 0;
    	}
    	else
    	{
    		s = d / maxv;
    In the else block, s is made global.

    It would help if you'd explain the purpose of the function.
    Y_U U_G_A_E_U_ B_S_A_D_

  3. #3
    Join Date
    Feb 2006
    Posts
    2,927
    Code:
    function hue(r,g,b){
        var r= r/255, g = g/255, b= b/255;
        var max= Math.max(r, g, b), min= Math.min(r, g, b);
        var h= 0, s= 0, v= max, D=Math.round;
        if(max!= min){
            var d= max-min;
            s= d/max;
            switch(max){
                case r: h= (g-b)/d +(g< b? 6: 0); break;
                case g: h= (b-r)/d + 2; break;
                case b: h= (r-g)/d + 4; break;
            }
        }
        return [D(h*60), D(s*100), D(v*100)];
    }
    var h=hue(255,255,0)
    alert('['+h[0]+'\u00B0'+', '+h[1]+'%, '+h[2]+'%]');

  4. #4
    Join Date
    Jun 2009
    Posts
    10
    Quote Originally Posted by Sterling Isfine View Post
    How do you call this function without a name?

    The assignment to h is redundant and the expression could be written:

    It's hazardous to declare variables within conditional blocks, since it can lead to referencing of non existent variables later in the function, or as demonstrated here:
    In the else block, s is made global.

    It would help if you'd explain the purpose of the function.
    It's actually a function defined as $.fn.rgb2hsv = function ...

    Mrhoo, that worked perfectly. Thank you

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
HTML5 Development Center



Recent Articles