На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Значение параметров градиента

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Значение параметров градиента
 
Добрый день. В mapgdi.h имеется вспомогательный примитив IMGVECTORGRADIENT со следующим описанием:
Код
typedef struct IMGVECTORGRADIENT    // ВСПОМОГАТЕЛЬНАЯ СТРУКТУРА{
  unsigned int  Color;        // Цвет градиентной заливки (COLORREF)
  unsigned int  Left;         // Процент заполнения габаритов слева
  unsigned int  Right;        // Процент заполнения габаритов справа
  unsigned int  Bright;       // Процент изменения яркости заливки
}
  IMGVECTORGRADIENT;
Этот примитив используется в том числе некоторыми IML-объектами. Не могли бы вы объяснить значение его параметров? Какая геометрия нужна этому примитиву? Сколько точек должно быть в метрике и как они интерпретируются?
 
Данный примитив используется в структуре GRADIENTPARM, которая находится в библиотеке программируемых знаков (rscarmy.iml, rscarmy.iml64):
Код
typedef struct GRADIENTPARM    // Градиентный векторный
{
  IMGVECTOREX *     Vector;    // Описание векторного (полигона)
  IMGVECTORGRADIENT Gradient;  // Параметры градиентной заливки
  int               Size;      // sizeof(GRADIENTPARM);
  int               Zero;
}
  GRADIENTPARM;
Градиентная заливка используется для заполнения векторных знаков типа "Флаг", которые содержатся классификаторах семейства operator.rsc (входит в состав ГИС "Оператор").
Обычно основной фон полотна флага рисуется белым цветом. Цвет Color определяет цвет вертикальной штриховки полигона (полотна флага) линиями (слева направо).
Поле Left определяет степень влияния цвета Color самой левой линии (габаритов заполняемого полигона), Right - самой правой линии.
Если Left и Right равны 0, то левая и правая линии штриховки флага имеют белый цвет. Цвет средней вертикальной линии стремится к Color.
Векторный знак (Vector) должен содержать площадной примитив произвольной формы (до 128 точек).
 
Александр, спасибо. Выглядит это не очень консистентно относительно других примитивов, сам бы я не разобрался. А если векторный знак содержит несколько полигонов, они все должны отрисоваться с градиентной заливкой?
Изменено: Анатолий Кудрин - 03.06.2020 20:39:42
 
Пример использования градиентной заливки в imlapi\rscarmy\rscarmy.cpp.
Все полигоны, которые будут в переданном знаке, получат градиентную заливку.

Код
typedef struct GRADIENTPARM    // Градиентный векторный
{
  IMGVECTOREX *     Vector;
  IMGVECTORGRADIENT Gradient;
  int               Size;                      
  int               Zero;
}
  GRADIENTPARM;

//-----------------------------------------------------------------
// Знак с выносной линией и градиентной заливкой
//-----------------------------------------------------------------
int _fastcall VectorGradient(const POLYDATAEX * data, const IMGDRAW * draw,
                             const IMGCONTEXT * context, int test,
                             FRAME * border)
{
 POLYDATAEX pdata;
 int pointcount;            

 int polycounts[2];
 DRAWPOINT * points;

 const  char * parm;
 int    func;
 const  char * vectorparm;
 int    vectorfunc;
 int    i;
 int    hideline = 0;

 GRADIENTPARM gradientparm;

 // Тип функции линии
 func = imlDrawType(draw, 1);

 // Параметры функции линии
 parm = imlDrawParm(draw, 1);

 // Тип функции значка
 vectorfunc = imlDrawType(draw, 2);

 // Параметры функции значка
 vectorparm = imlDrawParm(draw, 2);

 IMGCONTEXT contextd;
 memcpy((char *)&contextd,context,sizeof(IMGCONTEXT));
 float datascale = -1;
 if (data->Flags & PF_SCALETOLEVEL)
   datascale = PossibleScale(data->ShowScale, contextd.ViewScale);
 if (datascale > 0)
     contextd.Scale = datascale;

 pdata = *data;
 pdata.DX = 0;
 pdata.DY = 0;

 if (pdata.Count <= 1)
   {
     // Подобъектов нет - нарисовать только векторный знак
     hideline = 1;
   }
 else
   {
     // Степень вертикальности линии
     int count = *pdata.PolyCounts;    
     int dx = pdata.Points->X - (pdata.Points + count)->X;

     if ((dx >= -1) && (dx <= 1))
       hideline = 1;
   }

 if (hideline == 0)
   {
      pdata.Count      = 1;            
      pdata.PolyCounts = &pointcount;
      pointcount       = *(data->PolyCounts) + 1;     

      // Нарисовать линию
      if ((imgPrepareImage(&pdata, func, parm, &contextd, test, border) != 0) &&
             (test == PREPARE_TEST))
        {
          return 1;
        }

      pdata.Points = (DRAWPOINT*)(((char*)data->Points) +
                          *(data->PolyCounts) * sizeof(DRAWPOINT));
      pdata.PolyCounts = (data->PolyCounts + 1);

      data = &pdata;                         
   }

 if (vectorfunc == IMG_VECTOREX)
   {
     gradientparm.Vector = (IMGVECTOREX*)vectorparm;

     gradientparm.Size = sizeof(gradientparm);

     gradientparm.Gradient.Color = 0xFF;

     if (imlDrawType(draw, 3) == IMG_COLOR)
       {
         parm = imlDrawParm(draw,3);
         if (parm)
         gradientparm.Gradient.Color = *((int*)parm);
       }

     gradientparm.Gradient.Left = 30;

     if (imlDrawType(draw, 4) == IMG_PERCENT)
       {
         parm = imlDrawParm(draw,4);
         if (parm)
         gradientparm.Gradient.Left = *((int*)parm);
       }

     gradientparm.Gradient.Right = 30;

     if (imlDrawType(draw, 5) == IMG_PERCENT)
       {
         parm = imlDrawParm(draw,5);
         if (parm)
         gradientparm.Gradient.Right = *((int*)parm);
       }

     gradientparm.Gradient.Bright = 30;

     if (imlDrawType(draw, 6) == IMG_PERCENT)
       {
         parm = imlDrawParm(draw,6);
         if (parm)
         gradientparm.Gradient.Bright = *((int*)parm);
       }

     vectorparm = (char*)&gradientparm;
     vectorfunc = IMG_VECTORGRADIENT;
   }

 // Нарисовать векторный знак
 return imgPrepareImage(data, vectorfunc, vectorparm, &contextd, test, border);
}
 
Спасибо, все понятно.
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности