Показать сообщение отдельно
Старый 22.08.2003, 19:41
Nox Noctis вне форума Посмотреть профиль Отправить личное сообщение для Nox Noctis Посетить домашнюю страницу Nox Noctis Найти все сообщения от Nox Noctis
  № 3  
Nox Noctis
don't panic!
 
Аватар для Nox Noctis

Регистрация: Aug 2001
Сообщений: 4,121
здесь нужна система не RGB а HSV (HSL)...
по ней все легко и просто получается :)

кто найдет полное объяснения какого-нибудь способа перевода rgb <--> hsl, будет тому щастье :) я не нашел...

вот. код не мой, где взял - не помню :)
почему из ржб в хсв тут переводится именно так - я не понимаю...

Код:
// FULL GRADIENT FILL EXAMPLE
//
_root.createEmptyMovieClip("FColorWheel", 1);
FColorWheel.hex = function(nmbr, base) {
	var hexStr = "ABCDEF";
	var hexVal = Math.round(nmbr*255/base);
	dig1 = hexVal%16;
	dig2 = (hexVal-dig1)/16;
	if (dig1>9) {
		dig1 = hexStr.charAt(dig1-10);
	}
	if (dig2>9) {
		dig2 = hexStr.charAt(dig2-10);
	}
	hexVal = dig2.toString()+dig1.toString();
	return hexVal;
};
//
FColorWheel.hsvToRGB = function(h, s, v) {
	var r, g, b, i, f, p, q, t;
	if (s == 0) {
		r = g=b=v;
	}
	if (h == 360) {
		h = 0;
	}
	h /= 60;
	i = Math.floor(h);
	f = h-i;
	p = v*(1-s);
	q = v*(1-(s*f));
	t = v*(1-(s*(1-f)));
	if (i == 0) {
		r = v;
		g = t;
		b = p;
	} else if (i == 1) {
		r = q;
		g = v;
		b = p;
	} else if (i == 2) {
		//
		r = p;
		g = v;
		b = t;
	} else if (i == 3) {
		r = p;
		g = q;
		b = v;
	} else if (i == 4) {
		r = t;
		g = p;
		b = v;
	} else if (i == 5) {
		r = v;
		g = p;
		b = q;
	}
	this.red = this.hex(r*255, 255);
	this.green = this.hex(g*255, 255);
	this.blue = this.hex(b*255, 255);
	this.hexColor = "0x"+this.red+this.green+this.blue;
	return this.hexColor;
};
//
FColorWheel.drawWheel = function(radius, centerX, centerY, s, b) {
	for (var i = 0; i<=360; i++) {
		angle0 = (i/180)*Math.PI;
		angle1 = ((i+1)/180)*Math.PI;
		c = this.hsvToRGB(360-i, s, b);
		with (this) {
			colors = [0xFFFFFF, Number(c)];
			alphas = [100, 100];
			ratios = [0, 0xFF];
			//
			matrix = {a:2*radius, b:0, c:0, d:0, e:2*radius, f:0, g:centerX, h:centerY, i:1};
			beginGradientFill("radial", colors, alphas, ratios, matrix);
			moveTo(centerX, centerY);
			lineTo(centerX+radius*Math.cos(angle0), centerY+radius*Math.sin(angle0));
			lineStyle(1.25, "0x000000", 50);
			//
			lineTo(centerX+radius*Math.cos(angle1), centerY+radius*Math.sin(angle1));
			lineStyle(0, "0x000000", 0);
			moveTo(centerX, centerY);
			endFill();
		}
	}
};
//
FColorWheel.drawWheel(100, 200, 200, 1, 1);