您的问题是选择正确的 (r,g,b)
函数,以返回0到10之间的值。您声明 (0,255,0)
应该返回10.0,而其他值应该返回更少,(255,0,255)
应该返回0。因此,您需要为该函数选择至少两个参数。一个是在 (x,x,x)
处的值(如果您希望该值相等,否则该参数将是 X 的函数),另一个是非极端值插值的规则。因此,您的函数应该如下所示:
function score(r,g,b:int):Number {
var rc:int=Math.max(0,Math.min(255,r));
var gc:int=Math.max(0,Math.min(255,g));
var bc:int=Math.max(0,Math.min(255,b));
const GRAY:Number=5.0;
if ((rc==rg) and (rc==rb)) return GRAY;
return ir(r,g,b);
}
实际上,您可以在所有8个角落指定值,并按照您能想象的任何规律进行简单插值。例如,通过相对距离。像这样:
const SCORES:Array=[
0,
0,
10,
6.66666,
0,
0,
6.66666,
5.0
];
const POINTS:Array=[
{r:0;g:0;b:0},
{r:255;g:0;b:0},
{r:0;g:255;b:0},
{r:255;g:255;b:0},
{r:0;g:0;b:255},
{r:255;g:0;b:255},
{r:0;g:255;b:255},
{r:255;g:255;b:255}
];
function score(r,g,b:int):Number {
var rc:int=Math.max(0,Math.min(255,r));
var gc:int=Math.max(0,Math.min(255,g));
var bc:int=Math.max(0,Math.min(255,b));
var dists:Array=new Array();
var td:Number=0;
for (var i:int=POINTS.length-1;i>=0;i--)
var dist:Number=distance({r=rc;g=gc;b=bc},POINTS[i]);
if (dist<1e-6) return SCORES[i];
dists.unshift(1.0/dist);
td+=1.0/dist;
}
var result:Number=0;
for (i=POINTS.length-1;i>=0;i--)
result+=SCORES[i]*dists[i]/td;
return result;
}
green / 255 x 10
对于你的问题已经足够了?我已经扩展成一个答案,如果这不是你想要的,请告诉我... - VC.One