Алгоритм градиентной заливки
От: andy_support  
Дата: 05.07.05 10:22
Оценка:
Нужно нарисовать круг в котором должна быть градиентная заливка, при следующих условиях:
1. Количество цветов 3
2. Задаются точки полавного перехода из одного цвета в другой
3. Радиус этого круга делится на 200 частей и точки градиентного перехода как раз задаются значением от 10 до 190
Никак не могу получить плавную красивую картинку
Формулу использую (A1-(A1-B1)/h*x, A2-(A2-B2)/h*x, A3-(A3-B3)/h*x), где A,B цвета; h высота (в нашем случае R)
... << RSDN@Home 1.1.3 stable >>
Re: Алгоритм градиентной заливки
От: byterus Россия  
Дата: 05.07.05 10:32
Оценка:
Здравствуйте, andy_support, Вы писали:

_>Нужно нарисовать круг в котором должна быть градиентная заливка, при следующих условиях:

_>1. Количество цветов 3
_>2. Задаются точки полавного перехода из одного цвета в другой
_>3. Радиус этого круга делится на 200 частей и точки градиентного перехода как раз задаются значением от 10 до 190
_>Никак не могу получить плавную красивую картинку
_>Формулу использую (A1-(A1-B1)/h*x, A2-(A2-B2)/h*x, A3-(A3-B3)/h*x), где A,B цвета; h высота (в нашем случае R)

Посмотри в JEDI jvGradient. Правда там только два цвета.
MySQL stored procedure debugging
Re[2]: Алгоритм градиентной заливки
От: andy_support  
Дата: 05.07.05 10:46
Оценка:
Здравствуйте, byterus, Вы писали:

B>Здравствуйте, andy_support, Вы писали:


_>>Нужно нарисовать круг в котором должна быть градиентная заливка, при следующих условиях:

_>>1. Количество цветов 3
_>>2. Задаются точки полавного перехода из одного цвета в другой
_>>3. Радиус этого круга делится на 200 частей и точки градиентного перехода как раз задаются значением от 10 до 190
_>>Никак не могу получить плавную красивую картинку
_>>Формулу использую (A1-(A1-B1)/h*x, A2-(A2-B2)/h*x, A3-(A3-B3)/h*x), где A,B цвета; h высота (в нашем случае R)

B>Посмотри в JEDI jvGradient. Правда там только два цвета.



С двумя цветами никаких проблем, а вот с тремя и плавным переходом не получается
Re: Алгоритм градиентной заливки
От: Rius Россия  
Дата: 05.07.05 10:56
Оценка:
вот заливка двумя цветами через msimg32.dll
также она вроде поддерживает и большее число точек и цветов
//---------------------------------------------------------------------------
//Copyright © Rius :)
//Chelyabnsk 2003-2005
//mailto: rius@mail.ru
//-  GradFill.cpp  ----------------------------------------------------------
#pragma hdrstop

#include "GradFill.h"
//---------------------------------------------------------------------------
bool GradientRect(HDC hDC, TRect &Rect, bool IsVertical, TColor Start, TColor End)
{
    TRIVERTEX vert[2];

//    HDC hDC = GetDC(PaintBox1);

    vert[0].x = Rect.Left;
    vert[0].y = Rect.Top;
    vert[0].Red   = GetRValue(Start)<<8;
    vert[0].Green = GetGValue(Start)<<8;
    vert[0].Blue  = GetBValue(Start)<<8;
    vert[0].Alpha = 0;

    vert[1].x = Rect.Right;
    vert[1].y = Rect.Bottom;
    vert[1].Red   = GetRValue(End)<<8;
    vert[1].Green = GetGValue(End)<<8;
    vert[1].Blue  = GetBValue(End)<<8;
    vert[1].Alpha = 10;

    GRADIENT_RECT gRect;
    gRect.UpperLeft = 0;
    gRect.LowerRight = 1;

    DWORD Direction = (IsVertical ?  GRADIENT_FILL_RECT_V : GRADIENT_FILL_RECT_H);

    return GradientFill(hDC, &vert[0], 2, &gRect, 1, Direction);
}
//---------------------------------------------------------------------------
/*bool GradientRect(HDC hDC, TRect &Rect, bool IsVertical, TColor Start, TColor End)
{
    BLENDFUNCTION blend;
    blend.BlendOp = AC_SRC_OVER;
    blend.BlendFlags = 0;
    blend.SourceConstantAlpha = 128;
    blend.AlphaFormat = 1;
    bool res = ::AlphaBlend(Image1->Canvas->Handle,
        0, 0, Image2->Width, Image2->Height,
        Image2->Canvas->Handle,
        0, 0, Image2->Width, Image2->Height,
        blend);

//        Image2->Hide();
        Image1->Repaint();
        Caption = res? "1" : "0";
*/
#pragma package(smart_init)



//---------------------------------------------------------------------------
//Copyright © Rius :)
//Chelyabnsk 2003-2005
//mailto: rius@mail.ru
//---------------------------------------------------------------------------

#ifndef GradFillH
#define GradFillH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
//USERES("PanelXP.res");//не работает
//USELIB("msimg32.lib");//не работает в BCB 6
#pragma comment(lib, "msimg32.lib")
//---------------------------------------------------------------------------
bool GradientRect(HDC hDC, TRect &Rect, bool IsVertical, TColor Start, TColor End);
//---------------------------------------------------------------------------
#endif
Re[3]: Алгоритм градиентной заливки
От: _silent Россия http://www.bezhetsk.ru
Дата: 05.07.05 12:12
Оценка:
Здравствуйте, andy_support, Вы писали:

B>>Посмотри в JEDI jvGradient. Правда там только два цвета.


_>С двумя цветами никаких проблем, а вот с тремя и плавным переходом не получается


ну а если попробовать разделить участок на две части — одна — от первого до второго и вторая — от второго до третьего цветов? (:
по-моему, так и должно быть, нет?
Re[3]: Алгоритм градиентной заливки
От: Andy BiiiG Россия  
Дата: 05.07.05 15:04
Оценка:
Здравствуйте, andy_support, Вы писали:


_>>>Нужно нарисовать круг в котором должна быть градиентная заливка, при следующих условиях:

_>>>1. Количество цветов 3
_>>>2. Задаются точки полавного перехода из одного цвета в другой
_>>>3. Радиус этого круга делится на 200 частей и точки градиентного перехода как раз задаются значением от 10 до 190
_>>>Никак не могу получить плавную красивую картинку
_>>>Формулу использую (A1-(A1-B1)/h*x, A2-(A2-B2)/h*x, A3-(A3-B3)/h*x), где A,B цвета; h высота (в нашем случае R)

_>С двумя цветами никаких проблем, а вот с тремя и плавным переходом не получается


Представь, что твои три точки A,B,C находятся на плоскости, например (x,G) (x-направо, G (Green или другой компонент цвета, неважно — вверх)

По твоей формуле AB — прямая, ВС — также прямая, в точке B наблюдаем перелом.
А надо плавненько, как сплайн. По каждому из трех компонентов цвета

Если такая идея тебе подходит, посмотри http://alglib.sources.ru/interpolation/spline3.php
Re[4]: Алгоритм градиентной заливки
От: andy_support  
Дата: 06.07.05 10:50
Оценка:
_>ну а если попробовать разделить участок на две части — одна — от первого до второго и вторая — от второго до третьего цветов? (:
_>по-моему, так и должно быть, нет?


Понимаешь какая штука, я пробовал сделать так как ты говоришь
рисовал сначала один круг до определённого радиуса, а потом второй но плавног перехода не получается, так как напрмер значение радиуса после рисования круга равно определённому значению, а при изменение цвета, изменённое значение использовыать уже нельзя, плавного перехода нет
Например я рисую от красного к зелёному до радиуса 120, а потом меняю формулу на зелёный к синиму и уже при значение текущего радиуса получается синий
... << RSDN@Home 1.1.3 stable >>
Re[5]: Алгоритм градиентной заливки
От: Rius Россия  
Дата: 06.07.05 13:18
Оценка:
Почитайте вот это, наверняка должно помочь:
Красота &mdash; это страшная сила
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.