Показать сообщение отдельно
Старый 17.03.2016, 23:03
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
HSV состоит из Оттенка (Hue) — спектрального круга, соотв. измеряется в градусах и имеет 360 градаций, а также Насыщенности и Яркости, которые измеряются в % и имеют по 100 градаций.
Спектрумбар удобно рисовать 360 пикселей высотой и тогда координата маркера будет прямо коррелировать со значением Hue. Спектр здесь — как бы развернутый в линию круг. Брать с него пиксель имеет смысл только в том случае, если Вы действительно закрашивали его точными цветами и все 360 там представлены. Все это рисование требует ресурсов и времени. Гораздо проще кинуть векторный градиент.
Код AS3:
//// Spectrum Scale
var matrix:Matrix = new Matrix();
matrix.createGradientBox(20, 360, Math.PI / 2, 0, 0); 
// 20, 360 — размеры шкалы, как она будет рисоваться. Градиент "резиновый", так что 
// размеры шкалы могут быть какими угодно, только координату маркера придется 
// пересчитывать в проценты и брать этот процент от 360 для Hue.
_spectrum.graphics.beginGradientFill
(
	GradientType.LINEAR, 
	[0xFF0000, 0xFF00FF, 0x0000FF, 0x00FFFF, 0x00FF00, 0xFFFF00, 0xFF0000], 
	[1, 1, 1, 1, 1, 1, 1], 
	[2, 44, 86, 128, 170, 212, 254], 
	matrix
);
Я еще не встречал человека, способного отличить два стоящих впритык пикселя с разницей цвета в 1. Весь этот визуальный натуризм не имеет никакого смысла даже в спектрумбаре, не говоря уже о квадрате. Никто не выбирает глазом нужный пиксель(!) чтобы попасть в него маркером. Если кому-то нужен ТОЧНЫЙ цвет, он вводит его числами поканально или HEX-кодом (у Вас пока нет текстовых полей для этого). Ловить точный цвет на поле это маразм, согласитесь.
Итак, координата маркера на спектрумбаре это Hue; соответственно, когда Вы получили извне какой-то цвет в RGB, переводите его в HSV. Н будет координатой маркера на спектрумбаре. Ставите туда маркер и вызываете функцию, которая вычисляет базовый цвет из координаты маркера/Н (у Вас в любом случае такая должна быть, чтобы менять базу когда юзер двигает руками маркер). У меня это выглядит примерно так:
Код AS3:
_hue = 360 - _marker.y;
_baseColor = HSV.toRGB(_hue, 1, 1);
Думаю, обратный процесс не составит труда? Вычислить _hue из RGB и отнять его из 360, чтобы узнать нужную координату маркера?

Добавлено через 4 минуты
Ну а маркер на большом поле ставится по координатам S и V, которые Вы получаете все там же, переведя RGB в HSV. Они в процентах; соотв. Вам надо передвинуть маркер на данный процент от высоты и ширины поля.
Удачи))
__________________
Reality.getBounds(this);