# Thread: I need help shrinking this function

1. Registered User
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. Code works; charms don't.
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.

3. Registered User+
Join Date
Feb 2006
Posts
2,930
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. Registered User
Join Date
Jun 2009
Posts
10
Originally Posted by Sterling Isfine
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
•