Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2009, 12:43   #1
strel-core
 
Регистрация: 15.05.2009
Сообщений: 4
По умолчанию Формула получения цвета с градиента

Нужна помощь в написании функции, которая получает цвет из градиента.
Дана определенная координата на которой один цвет переходит в другой, собственное сам градиент, нужно получить цвет из самого градиента, а собственно значение на в любой части отрезка. Собственно функция:
есть два цвета допустим Red(255) и Yellow(65535), начальная точка на отрезке от куда начинается градиент и конечная точка на отрезке где заканчиваться градиент ну и ну и точка которая на отрезке которая и является нужным цветом со всего градиента.

...double Gradietn(int point, int gradientBegin, int gradientEnd, int color, int color2)....

Gradient(60, -50, 80, 255, 65535); - на всем отрезке от -50 до 80 должен быть градиент от красного к желтому, все что больше 80 это уже чисто желтый, все что меньше -50 чисто красный, функция должна вернуть цвет который и есть точка 60.

Большое спасибо
strel-core вне форума Ответить с цитированием
Старый 15.05.2009, 22:57   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

А в что именно не получается?
Arigato вне форума Ответить с цитированием
Старый 18.05.2009, 10:26   #3
strel-core
 
Регистрация: 15.05.2009
Сообщений: 4
По умолчанию

не знаю как сделать переход от градиента к градиенту, у меня переход получается не от к цвета к цвету, а появляются еще и лишние цвета. если делать переход от черного (0) к красному(255) то все красиво, а вот если другие цвета, желтый и красный то уже все.
strel-core вне форума Ответить с цитированием
Старый 18.05.2009, 13:42   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Ну жёлтый - это красный + зеленый. Берем по максимуму красного и зелёного - получаем насыщенный жёлтый. Затем уменьшаем количество зелёного до 0, в конце получаем чисто красный.
Arigato вне форума Ответить с цитированием
Старый 18.05.2009, 14:05   #5
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

все очень просто!
считаем рассотяние на котором определен градиент.(80-(-50))=130
далее находи кол-во цветов(65535-255)=65280
теперь находим кол-во цветов которое приходится на 1 px(65280/130)
и вычисляем цвет в нужной точке(65280/130*(60-(-50)))
PS. нужно сдвинуть систему координат так, чтобы не было отрицательных чисел или вообще воздержаться от них.
Kostia вне форума Ответить с цитированием
Старый 18.05.2009, 16:20   #6
strel-core
 
Регистрация: 15.05.2009
Сообщений: 4
По умолчанию

Костя, я тоже сначала так думал, таких расчетов у мну гора уже формулы 3 придумал, но должна же быть реально формула. По твоим расчетам получается приблизительно 55220, а этот цвет больше на зеленый похож чем на желтый.

Работать с RGB конечно тоже можно, но такая проблема, что да я то могу с двумя цветами градиент сделать, а вот если я задам другую комбинацию, если знаете как сделать универсальную формулу для получения цвета с градиента, только работая с RGB цветом, то в студию, буду рад.

http://cloford.com/resources/colours/500col.htm
strel-core вне форума Ответить с цитированием
Старый 18.05.2009, 17:05   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Да это элементарно делается. Вот, набросал примерчик:

Код:
type
  TRGB = record
          R, G, B: Byte;
        end; {rec RGB}

const
  C1: TRGB = (R:255; G:255; B:0);
  C2: TRGB = (R:255; G:0; B:0);

procedure TForm1.FormPaint(Sender: TObject);
var
  X: Integer;
  BitMap: TBitMap;
  R, G, B, KR, KG, KB: Single;
begin
  BitMap := TBitMap.Create;
  BitMap.Width := ClientWidth;
  BitMap.Height := ClientHeight;
  R := C1.R; G := C1.G; B := C1.B;
  KR := (C2.R - C1.R) / ClientWidth;
  KG := (C2.G - C1.G) / ClientWidth;
  KB := (C2.B - C1.B) / ClientWidth;
  for X := 0 to ClientWidth do
  begin
    with BitMap.Canvas do
    begin
      Pen.Color := RGB (Round (R), Round (G), Round (B));
      MoveTo (X, 0);
      LineTo (X, ClientHeight);
      R := R + KR; G := G + KG; B := B + KB;
    end; {with}
  end; {for}
  Canvas.Draw (0, 0, BitMap);
  BitMap.Free;
end;
C1 - начальный цвет, C2 - конечный цвет.

P.S. Просьба к модераторам: перенести тему в раздел "Мультимедиа в Delphi", т.к. она как раз для него.
Arigato вне форума Ответить с цитированием
Старый 18.05.2009, 17:58   #8
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Код:
void DrawGradient(int width, int begin, int end)
{
	float r,g,b,dr,dg,db;
	r=GetRValue(begin)/255.0;
	g=GetGValue(begin)/255.0;
	b=GetBValue(begin)/255.0;
	dr=(GetRValue(end)/255.0 - r)/(float)width;
	dg=(GetGValue(end)/255.0 - g)/(float)width;
	db=(GetBValue(end)/255.0 - b)/(float)width;
	for(int i=1;i<=width;i++)
	{
		r+=dr;
		g+=dg;
		b+=db;
		for(int k=1;k<=100;k++)
		{
			glBegin(GL_POINTS);
				glColor3f(r,g,b);
				glVertex2d(i,k);
			glEnd();
		}
	}
}
в общем
width - ширина градиента
begin и end - начальный и конечный цвет
я разбиваю сначала начальный цвет на составляющие(т.к. в OGL я использую float для задания цвета, то делю 255, т.к. максимальное значение цвета 1.0)
далее в переменные dr,dg,db я заношу число на которое нужно увеличивать или уменьшать начальный цвет.

Это почти как вычислить dx. Если требуется за 30 итераций пройти от числа 10 до 60. Шаг = (60-10)/30=5/3
так и здесь с каждой составляющей цвета.

Пример во вложении MV c++ 2008 express. Вывод при помощи opengl(glut)
Вложения
Тип файла: rar GL1.rar (2.1 Кб, 36 просмотров)
Kostia вне форума Ответить с цитированием
Старый 18.05.2009, 18:02   #9
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Прошу прощение, у меня на Делфи код, не заметил, что требовалось на Си.
Но принцип работы алгоритма от туда можно извлечь.
Arigato вне форума Ответить с цитированием
Старый 19.05.2009, 18:13   #10
strel-core
 
Регистрация: 15.05.2009
Сообщений: 4
По умолчанию thanks

Arigato. тебе спасибо, алгоритм у тебя выдрал, то что ты на делфи написал, Косте тоже спасибо, что не поленился, тоже написал, но я уже до этого сделал как ты написал свой пост
strel-core вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм получения диапазона IP zAlexandrz Общие вопросы Delphi 4 26.02.2010 22:43
Составить подпрограмму для получения обратной матрицы Astis Паскаль, Turbo Pascal, PascalABC.NET 0 01.05.2009 18:52
Проблема получения сертификата подписчика - CertFindCertificateInStore _test_ Win Api 1 28.04.2009 18:42
Получения номера страницы по выделенной ячейки brezze Microsoft Office Excel 1 11.07.2008 22:06
реализация метода приведённого градиента Вулфа в vba excel Metal_Heart Microsoft Office Excel 1 12.05.2008 15:06