Unique color gradient fill quadrangle

This forum is for eXpress++ general support.
Message
Author
User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Unique color gradient fill quadrangle

#1 Post by Eugene Lutsenko »

In Topic: http://bb.donnay-software.com/donnay/vi ... 8&start=20 Auge_Ohr I brought the image:
Image
I try to apply this function to a gradient color quadrangle
Image
for the vertices of which are known coordinates X,Y,Z, and Z coordinate of the displayed color.

Here's a snippet of my program:

Code: Select all

              ***** The calculation of the coordinates of the vertices of the quadrilateral ***************

              X1 := X0 + Ax * mMinGrInt1 * COS( aOpSc[mNOpSc,2]   * 3.14159265358979323846 / 180 )
              Y1 := Y0 - Ay * mMinGrInt1 * SIN( aOpSc[mNOpSc,2]   * 3.14159265358979323846 / 180 )
              Z1 := mInf1
 
              X2 := X0 + Ax * mMaxGrInt2 * COS( aOpSc[mNOpSc,2]   * 3.14159265358979323846 / 180 )
              Y2 := Y0 - Ay * mMaxGrInt2 * SIN( aOpSc[mNOpSc,2]   * 3.14159265358979323846 / 180 )
              Z2 := mInf2

              X3 := X0 + Ax * mMinGrInt3 * COS( aOpSc[mNOpSc+1,2] * 3.14159265358979323846 / 180 )
              Y3 := Y0 - Ay * mMinGrInt3 * SIN( aOpSc[mNOpSc+1,2] * 3.14159265358979323846 / 180 )
              Z3 := mInf3

              X4 := X0 + Ax * mMaxGrInt4 * COS( aOpSc[mNOpSc+1,2] * 3.14159265358979323846 / 180 )
              Y4 := Y0 - Ay * mMaxGrInt4 * SIN( aOpSc[mNOpSc+1,2] * 3.14159265358979323846 / 180 )
              Z4 := mInf4

              ******************************************************************************************
              ***** Calculation of coordinates of the intersection of the diagonals of the quadrilateral space: (x, y, z)
              ******************************************************************************************
              ***** В прямоугольнике:
              ***** --------------------------------
              ***** |2                            4|
              ***** |                              |
              ***** |                              |
              ***** |               0              |
              ***** |                              |
              ***** |                              |
              ***** |1                            3|
              ***** --------------------------------
              ***** Two diagonals:
              ***** 1st connects vertices 1-4;
              ***** 2nd connects vertices 2-3.
              ***** Accordingly canonical equations of the 1st and 2nd diagonals are of the form:
              ***** (x-x1)/(x4-x1)=(y-y1)/(y4-y1)=(z-z1)/(z4-z1)
              ***** (x-x2)/(x3-x2)=(y-y2)/(y3-y2)=(z-z2)/(z3-z2)
              ***** We write these equations in the form:
              ***** (x-x1)/p1=(y-y1)/q1=(z-z1)/r1
              ***** (x-x2)/p2=(y-y2)/q2=(z-z2)/r2
              ***** где:
              ***** p1=x4-x1, q1=y4-y1, r1=z4-z1
              ***** p2=x3-x2, q2=y3-y2, r2=z3-z2
              ***** Then the coordinates of the intersection point of the diagonals (x, y, z) would be:
              ***** x=(x1*q1*p2-x2*q2*p1-y1*p1*p2+y2*p1*p2)/(q1*p2-q2*p1)
              ***** y=(y1*p1*q2-y2*p2*q1-x1*q1*q2+x2*q1*q2)/(p1*q2-p2*q1)
              ***** z=(z1*q1*r2-z2*q2*r1-y1*r1*r2+y2*r1*r2)/(q1*r2-q2*r1)
              ******************************************************************************************

              p1=x4-x1;q1=y4-y1;r1=z4-z1
              p2=x3-x2;q2=y3-y2;r2=z3-z2
              x=(x1*q1*p2-x2*q2*p1-y1*p1*p2+y2*p1*p2)/(q1*p2-q2*p1)
              y=(y1*p1*q2-y2*p2*q1-x1*q1*q2+x2*q1*q2)/(p1*q2-p2*q1)
              z=(z1*q1*r2-z2*q2*r1-y1*r1*r2+y2*r1*r2)/(q1*r2-q2*r1)

              IF mFlagView

                 ********* Dimensioning gradient fill color for all triangles *****************

                 ma := 127
                 mb := 127
                 mc := 127
                 mU := 0
                 mV := 120
                 mW := 240

                 ****** Color 1st vertex of the quadrangle

                 mColor1 = ABS(INT( mDeltaSpectr + (360-mDeltaSpectr) * (mInf1 - mIntInfMin) / (mIntInfMax-mIntInfMin) ))
                 R := INT( ma * (1 + COS( ( mColor1 + mU ) * 3.14159265358979323846 / 180 ) ) )
                 G := INT( mb * (1 + COS( ( mColor1 + mV ) * 3.14159265358979323846 / 180 ) ) )
                 B := INT( mc * (1 + COS( ( mColor1 + mW ) * 3.14159265358979323846 / 180 ) ) )
                 fColor1 := GraMakeRGBColor({ R, G, B })
 
                 ****** Color 2nd vertex of the quadrilateral

                 mColor2 = ABS(INT( mDeltaSpectr + (360-mDeltaSpectr) * (mInf2 - mIntInfMin) / (mIntInfMax-mIntInfMin) ))
                 R := INT( ma * (1 + COS( ( mColor2 + mU ) * 3.14159265358979323846 / 180 ) ) )
                 G := INT( mb * (1 + COS( ( mColor2 + mV ) * 3.14159265358979323846 / 180 ) ) )
                 B := INT( mc * (1 + COS( ( mColor2 + mW ) * 3.14159265358979323846 / 180 ) ) )
                 fColor2 := GraMakeRGBColor({ R, G, B })

                 ****** The color of the top of the third quadrilateral

                 mColor3 = ABS(INT( mDeltaSpectr + (360-mDeltaSpectr) * (mInf3 - mIntInfMin) / (mIntInfMax-mIntInfMin) ))
                 R := INT( ma * (1 + COS( ( mColor3 + mU ) * 3.14159265358979323846 / 180 ) ) )
                 G := INT( mb * (1 + COS( ( mColor3 + mV ) * 3.14159265358979323846 / 180 ) ) )
                 B := INT( mc * (1 + COS( ( mColor3 + mW ) * 3.14159265358979323846 / 180 ) ) )
                 fColor3 := GraMakeRGBColor({ R, G, B })

                 ****** The color of the 4th vertex of the quadrilateral

                 mColor4 = ABS(INT( mDeltaSpectr + (360-mDeltaSpectr) * (mInf4 - mIntInfMin) / (mIntInfMax-mIntInfMin) ))
                 R := INT( ma * (1 + COS( ( mColor2 + mU ) * 3.14159265358979323846 / 180 ) ) )
                 G := INT( mb * (1 + COS( ( mColor2 + mV ) * 3.14159265358979323846 / 180 ) ) )
                 B := INT( mc * (1 + COS( ( mColor2 + mW ) * 3.14159265358979323846 / 180 ) ) )
                 fColor4 := GraMakeRGBColor({ R, G, B })

                 ****** The color of the points of intersection of the diagonals of the quadrilateral

                 mColor = ABS(INT( mDeltaSpectr + (360-mDeltaSpectr) * (Z - mIntInfMin) / (mIntInfMax-mIntInfMin) ))
                 R := INT( ma * (1 + COS( ( mColor + mU ) * 3.14159265358979323846 / 180 ) ) )
                 G := INT( mb * (1 + COS( ( mColor + mV ) * 3.14159265358979323846 / 180 ) ) )
                 B := INT( mc * (1 + COS( ( mColor + mW ) * 3.14159265358979323846 / 180 ) ) )
                 fColor := GraMakeRGBColor({ R, G, B })

                 ***** Blend the four triangles in the rectangle formed by the parties and the halves of the diagonals

                 aClrs := {}                // 1-й треугольник: 0, 1, 2
                 AADD(aClrs, fColor1);AADD(aClrs, fColor2);AADD(aClrs, fColor)
                 GraGradient(oPS, {X1,Y1}, {{X2,Y2}, {X,Y}}, aClrs, GRA_GRADIENT_TRIANGLE)

                 aClrs := {}                // 2-й треугольник: 0, 2, 4
                 AADD(aClrs, fColor2);AADD(aClrs, fColor4);AADD(aClrs, fColor)
                 GraGradient(oPS, {X2,Y2}, {{X4,Y4}, {X,Y}}, aClrs, GRA_GRADIENT_TRIANGLE)

                 aClrs := {}                // 3-й треугольник: 0, 3, 4
                 AADD(aClrs, fColor4);AADD(aClrs, fColor3);AADD(aClrs, fColor)
                 GraGradient(oPS, {X4,Y4}, {{X3,Y3}, {X,Y}}, aClrs, GRA_GRADIENT_TRIANGLE)

                 aClrs := {}                // 4-й треугольник: 0, 1, 3
                 AADD(aClrs, fColor3);AADD(aClrs, fColor1);AADD(aClrs, fColor)
                 GraGradient(oPS, {X3,Y3}, {{X1,Y1}, {X,Y}}, aClrs, GRA_GRADIENT_TRIANGLE)

              ENDIF
[/size]

Maybe it is possible to give an example of a source code program running?

I think I made a mess with the order of traversal of triangles in a quadrilateral or/and the order of traversal of vertices in triangles...

PS
1. The method which I expect the quadrilateral coordinates of the vertices in this case is not essential. The debug program would be most convenient to specify the vertex coordinates directly in the program or in the dialogue.
2. Actually, I really need to learn how to paint a gradient color krayneyi at least 9 contiguous quadrangles. In the simplest case, they may be located in both the number keys on the numeric keypad.

User avatar
Auge_Ohr
Posts: 1428
Joined: Wed Feb 24, 2010 3:44 pm

Re: Unique color gradient fill quadrangle

#2 Post by Auge_Ohr »

hi,
can you put some Color at some Point into your Picture ... just to understand how Triangle / Color fit to each other.
greetings by OHR
Jimmy

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Unique color gradient fill quadrangle

#3 Post by Eugene Lutsenko »

Image

Did the red diagonal line and immediately see where the wrong coordinates

User avatar
Auge_Ohr
Posts: 1428
Joined: Wed Feb 24, 2010 3:44 pm

Re: Unique color gradient fill quadrangle

#4 Post by Auge_Ohr »

hm ... you are using 2 Color (only) ... with 4 triangle ...
Eugene Lutsenko wrote:Did the red diagonal line and immediately see where the wrong coordinates
hm ... if i understand both Color should end at "red diagonal line" if all is OK ?

not sure if you can "measure" this Way ...
you have a Start Point / Color and an End Point / Color but you have no Influence how Color look like between those Points.
let say you have to Triangle with same Start / End Color but different Distance of Start / End Point.
where is your "red diagonal line" now and how Color will look like ?

not sure if it will fit into your Concept but what about a "Color-Wheel" using Triangle ?
all Triangle will have same lengh in "red diagonal line" and cross in Center of the Wheel
Snap shot use "uni Color" for each Segment but can use GraGradiant too
ColorWheel.JPG
ColorWheel.JPG (13.19 KiB) Viewed 12145 times
greetings by OHR
Jimmy

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Unique color gradient fill quadrangle

#5 Post by Eugene Lutsenko »

The concept is correct. Well all turns out. Soon the show. It would have more time ...

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Unique color gradient fill quadrangle

#6 Post by Eugene Lutsenko »

Image

Image

Code: Select all

PROCEDURE AppSys
// Рабочий стол остается окном приложения
RETURN

********************************************************************************
FUNCTION Main()

PUBLIC mDeltaSpectr := 90

DC_IconDefault(1000)

ERASE('_Regim.txt');StrFile('Трианг', '_Regim.txt')          // Режим отладки триангуляции
DrawOpScGrDebug('Трианг')

CLOSE ALL

RETURN NIL


*************************************************************************************************
****** Нарисовать систему описательных шкал и градаций в форме четырехугольников ОТЛАДОЧНЫЙ РЕЖИМ
*************************************************************************************************
FUNCTION DrawOpScGrDebug()

   LOCAL GetList := {}, oStatic

   PRIVATE nEvent, mp1, mp2, oXbp                      // Переменные анализа событий

   PUBLIC X_MaxW := 1313, Y_MaxW := 640                // Размер графического окна для самого графика в пикселях

   @ 2,1 DCSTATIC TYPE XBPSTATIC_TYPE_RECESSEDBOX SIZE X_MaxW+11, Y_MaxW+20 PIXEL; // Размер окна в пикселях (от Тома)
         OBJECT oStatic;
         EVAL {|| _PresSpaceOpScGrD( oStatic ) }

   DCREAD GUI ;
      TITLE "Визуализация информационного портрета символа в системе ЭЙДОС-X++";   // Надпись на окне графика
      FIT ;
      BUTTONS DCGUI_BUTTON_EXIT

RETURN NIL

*************************************************
STATIC FUNCTION _PresSpaceOpScGrD( oStatic )

   LOCAL oPS, oDevice

   PUBLIC X_MaxW := 1313, Y_MaxW := 640                // Размер графического окна для самого графика в пикселях

   oPS := XbpPresSpace():new()         // Create a PS
   oDevice := oStatic:winDevice()      // Get the device context
   oPS:create( oDevice )               // Link device context to PS
   oPS:SetViewPort( { 0, 0, X_MaxW, Y_MaxW } )
   oStatic:paint := {|mp1,mp2,obj| mp1 := LC_DrawOpScGrD( oPS, oStatic ) }

RETURN NIL

*****************************************************
****** Рисование системы описательных шкал и градаций
*****************************************************
STATIC FUNCTION LC_DrawOpScGrD( oPS, oStatic )

      ***** Поиск минимальных и максимальных значений, масштабирование изображения

      CLOSE ALL
      USE Inp_data EXCLUSIVE NEW

      Xmin = +99999999
      Xmax = -99999999

      Ymin = +99999999
      Ymax = -99999999

      mIntInfMin = +99999999
      mIntInfMax = -99999999

      SELECT Inp_data
      DBGOTOP()
      DO WHILE .NOT. EOF()

         Xmin = MIN(Xmin, X1)
         Xmin = MIN(Xmin, X2)
         Xmin = MIN(Xmin, X3)
         Xmin = MIN(Xmin, X4)

         Xmax = MAX(Xmax, X1)
         Xmax = MAX(Xmax, X2)
         Xmax = MAX(Xmax, X3)
         Xmax = MAX(Xmax, X4)

         Ymin = MIN(Ymin, Y1)
         Ymin = MIN(Ymin, Y2)
         Ymin = MIN(Ymin, Y3)
         Ymin = MIN(Ymin, Y4)

         Ymax = MAX(Ymax, Y1)
         Ymax = MAX(Ymax, Y2)
         Ymax = MAX(Ymax, Y3)
         Ymax = MAX(Ymax, Y4)

         mIntInfMin = MIN(mIntInfMin, Z1)
         mIntInfMin = MIN(mIntInfMin, Z2)
         mIntInfMin = MIN(mIntInfMin, Z3)
         mIntInfMin = MIN(mIntInfMin, Z4)

         mIntInfMax = MAX(mIntInfMax, Z1)
         mIntInfMax = MAX(mIntInfMax, Z2)
         mIntInfMax = MAX(mIntInfMax, Z3)
         mIntInfMax = MAX(mIntInfMax, Z4)

         DBSKIP(1)
      ENDDO


   *** Расчет коэффициентов масштабирования изображения

   PRIVATE Dx := 10
   PRIVATE Dy := 35                                    // Отступ области рисунка со всех сторон по X и Y

   PRIVATE X0 := Dx - 60                               // Начало координат по осям X и Y
   PRIVATE Y0 := Dy - 15

   PRIVATE W_Wind := X_MaxW - 2*Dx - 30                // Ширина окна для самого графика
   PRIVATE H_Wind := Y_MaxW - 2*Dy - 20                // Высота окна для самого графика

   mSizeX = Xmax - Xmin
   mSizeY = Ymax - Ymin

   Ax = W_Wind / mSizeX
   Ay = H_Wind / mSizeY

   RS = 3

   ****** Рисование изображений


      **** Написать заголовок диаграммы

      aFonts := XbpFont():new():list()                    // Все доступные шрифты

      oFont := XbpFont():new():create('22.Arial Bold')
      GraSetFont(oPS , oFont)                             // установить шрифт
      aAttrF := ARRAY( GRA_AS_COUNT ) 
      aAttrF [ GRA_AS_COLOR      ] := GRA_CLR_BLACK 
      aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_CENTER   // Выравнивание символов по горизонтали по центру относительно точки начала вывода
      aAttrF [ GRA_AS_VERTALIGN  ] := GRA_VALIGN_HALF     // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
      GraSetAttrString( oPS, aAttrF )                     // Установить символьные атрибуты

      mTitle = 'СИСТЕМА ОПИСАТЕЛЬНЫХ ШКАЛ И ГРАДАЦИЙ'
      aTxtPar = DC_GraQueryTextbox(mTitle, oFont)         // {101,16} Определяет длину и высоту текста в пикселях для некоторых шрифтов
*     MsgBox("Длина текста в пикселях="+ALLTRIM(STR(aTxtPar[1]))+". Высота текста в пикселях="+ALLTRIM(STR(aTxtPar[2])))
      GraStringAt( oPS, { X_MaxW/2, Y_MaxW+aTxtPar[2]+5 }, mTitle)

      oFont := XbpFont():new():create('14.Arial Bold')
      GraSetFont(oPS , oFont)                             // установить шрифт
      aAttrF := ARRAY( GRA_AS_COUNT ) 
      aAttrF [ GRA_AS_COLOR      ] := GRA_CLR_BLACK 
      aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_CENTER   // Выравнивание символов по горизонтали по центру относительно точки начала вывода
      aAttrF [ GRA_AS_VERTALIGN  ] := GRA_VALIGN_HALF     // Выравнивание символов по вертикали по средней линии относительно точки начала вывода
      GraSetAttrString( oPS, aAttrF )                     // Установить символьные атрибуты

*     mTitle = 'Стиль: "Триангуляция." Показаны градации со значимостью не менее '+ALLTRIM(STR(aWorkInf[11]))+'% от максимальной. Модель: "'+M_Inf+'"'
      mTitle = 'Стиль: "Триангуляция." Показаны градации со значимостью не менее '+ALLTRIM(STR(0))+'% от максимальной. Модель: "M_Inf"'
      aTxtPar = DC_GraQueryTextbox(mTitle, oFont)         // {101,16} Определяет длину и высоту текста в пикселях для некоторых шрифтов
*     MsgBox("Длина текста в пикселях="+ALLTRIM(STR(aTxtPar[1]))+". Высота текста в пикселях="+ALLTRIM(STR(aTxtPar[2])))
      GraStringAt( oPS, { X_MaxW/2, Y_MaxW+aTxtPar[2]-25 }, mTitle)


      ****** Визуализация описательных шкал и градаций в стиле: "Витраж" ********************************************
      ****** Отображать просто сетку и с цветовым кодированием инт.инфорамативности просто по сетке и с триангуляцией

      *********************
      **** Д Е Л О Н Е ****
      *********************

      ****** 1. Создать БД четырехугольников и треугольников: 2 смежные шкалы, 2 смежные градации

      ****** Цикл по четырехугольникам

      SELECT Inp_data
      DBGOTOP()

      DO WHILE .NOT. EOF()

              ******************************************************************************************
              ***** Расчет координат точки пересечения диагоналей четырехугольника в пространстве: (x,y,z)
              ******************************************************************************************
              ***** В прямоугольнике:
              ***** --------------------------------
              ***** |2                            4|
              ***** |                              |
              ***** |                              |
              ***** |Шкала 1        0       Шкала 2|
              ***** |                              |
              ***** |                              |
              ***** |1                            3|
              ***** --------------------------------
              ***** две диагонали:
              ***** 1-я соединяет вершины 1-4;
              ***** 2-я соединяет вершины 2-3.
              ***** Соответственно канонические уравнения 1-й и 2-й диагоналей имеют вид:
              ***** (x-x1)/(x4-x1)=(y-y1)/(y4-y1)=(z-z1)/(z4-z1)
              ***** (x-x2)/(x3-x2)=(y-y2)/(y3-y2)=(z-z2)/(z3-z2)
              ***** Запишем эти уравнения в виде:
              ***** (x-x1)/p1=(y-y1)/q1=(z-z1)/r1
              ***** (x-x2)/p2=(y-y2)/q2=(z-z2)/r2
              ***** где:
              ***** p1=x4-x1, q1=y4-y1, r1=z4-z1
              ***** p2=x3-x2, q2=y3-y2, r2=z3-z2
              ***** Тогда координаты точки пересечения диагоналей (x,y,z) будут:
              ***** x=(x1*q1*p2-x2*q2*p1-y1*p1*p2+y2*p1*p2)/(q1*p2-q2*p1)
              ***** y=(y1*p1*q2-y2*p2*q1-x1*q1*q2+x2*q1*q2)/(p1*q2-p2*q1)
              ***** z=(z1*q1*r2-z2*q2*r1-y1*r1*r2+y2*r1*r2)/(q1*r2-q2*r1)
              ******************************************************************************************

              p1=x4-x1;q1=y4-y1;r1=z4-z1
              p2=x3-x2;q2=y3-y2;r2=z3-z2
              x=(x1*q1*p2-x2*q2*p1-y1*p1*p2+y2*p1*p2)/(q1*p2-q2*p1)
              y=(y1*p1*q2-y2*p2*q1-x1*q1*q2+x2*q1*q2)/(p1*q2-p2*q1)
              z=(z1*q1*r2-z2*q2*r1-y1*r1*r2+y2*r1*r2)/(q1*r2-q2*r1)

                 ********* Расчет параметров заливки градиентным цветом для всех треугольников *****************

                 ma := 127
                 mb := 127
                 mc := 127
                 mU := 0
                 mV := 120
                 mW := 240

                 ****** Цвет 1-й вершины четырехугольника

                 mColor1 = ABS(INT( mDeltaSpectr + (360-mDeltaSpectr) * (Z1 - mIntInfMin) / (mIntInfMax-mIntInfMin) ))
                 R := INT( ma * (1 + COS( ( mColor1 + mU ) * 3.14159265358979323846 / 180 ) ) )
                 G := INT( mb * (1 + COS( ( mColor1 + mV ) * 3.14159265358979323846 / 180 ) ) )
                 B := INT( mc * (1 + COS( ( mColor1 + mW ) * 3.14159265358979323846 / 180 ) ) )
                 fColor1 := GraMakeRGBColor({ R, G, B })
 
                 ****** Цвет 2-й вершины четырехугольника

                 mColor2 = ABS(INT( mDeltaSpectr + (360-mDeltaSpectr) * (Z2 - mIntInfMin) / (mIntInfMax-mIntInfMin) ))
                 R := INT( ma * (1 + COS( ( mColor2 + mU ) * 3.14159265358979323846 / 180 ) ) )
                 G := INT( mb * (1 + COS( ( mColor2 + mV ) * 3.14159265358979323846 / 180 ) ) )
                 B := INT( mc * (1 + COS( ( mColor2 + mW ) * 3.14159265358979323846 / 180 ) ) )
                 fColor2 := GraMakeRGBColor({ R, G, B })

                 ****** Цвет 3-й вершины четырехугольника

                 mColor3 = ABS(INT( mDeltaSpectr + (360-mDeltaSpectr) * (Z3 - mIntInfMin) / (mIntInfMax-mIntInfMin) ))
                 R := INT( ma * (1 + COS( ( mColor3 + mU ) * 3.14159265358979323846 / 180 ) ) )
                 G := INT( mb * (1 + COS( ( mColor3 + mV ) * 3.14159265358979323846 / 180 ) ) )
                 B := INT( mc * (1 + COS( ( mColor3 + mW ) * 3.14159265358979323846 / 180 ) ) )
                 fColor3 := GraMakeRGBColor({ R, G, B })

                 ****** Цвет 4-й вершины четырехугольника

                 mColor4 = ABS(INT( mDeltaSpectr + (360-mDeltaSpectr) * (Z4 - mIntInfMin) / (mIntInfMax-mIntInfMin) ))
                 R := INT( ma * (1 + COS( ( mColor2 + mU ) * 3.14159265358979323846 / 180 ) ) )
                 G := INT( mb * (1 + COS( ( mColor2 + mV ) * 3.14159265358979323846 / 180 ) ) )
                 B := INT( mc * (1 + COS( ( mColor2 + mW ) * 3.14159265358979323846 / 180 ) ) )
                 fColor4 := GraMakeRGBColor({ R, G, B })

                 ****** Цвет точки пересечения диагоналей четырехугольника

                 mColor = ABS(INT( mDeltaSpectr + (360-mDeltaSpectr) * (Z - mIntInfMin) / (mIntInfMax-mIntInfMin) ))
                 R := INT( ma * (1 + COS( ( mColor + mU ) * 3.14159265358979323846 / 180 ) ) )
                 G := INT( mb * (1 + COS( ( mColor + mV ) * 3.14159265358979323846 / 180 ) ) )
                 B := INT( mc * (1 + COS( ( mColor + mW ) * 3.14159265358979323846 / 180 ) ) )
                 fColor := GraMakeRGBColor({ R, G, B })

                 ***** Градиентная заливка четырех треугольников в прямоугольнике, образуемых сторонами и половинками диагоналей

                 ***** Позиционирование и масштабирование

                 Px = -0    // Поправки для позиционирования изображения
                 Py = -0

                 mX  = X0 + X  * Ax + Px
                 mY  = Y0 + Y  * Ay + Py

                 mX1 = X0 + X1 * Ax + Px
                 mX2 = X0 + X2 * Ax + Px
                 mX3 = X0 + X3 * Ax + Px
                 mX4 = X0 + X4 * Ax + Px

                 mY1 = Y0 + Y1 * Ay + Py
                 mY2 = Y0 + Y2 * Ay + Py
                 mY3 = Y0 + Y3 * Ay + Py
                 mY4 = Y0 + Y4 * Ay + Py


                 aClrs := {}                // 1-й треугольник: 0, 1, 2
                 AADD(aClrs, fColor);AADD(aClrs, fColor1);AADD(aClrs, fColor2)
                 GraGradient(oPS, {mX,mY}, {{mX1,mY1}, {mX2,mY2}}, aClrs, GRA_GRADIENT_TRIANGLE)

                 aClrs := {}                // 2-й треугольник: 0, 2, 4
                 AADD(aClrs, fColor);AADD(aClrs, fColor2);AADD(aClrs, fColor4)
                 GraGradient(oPS, {mX,mY}, {{mX2,mY2}, {mX4,mY4}}, aClrs, GRA_GRADIENT_TRIANGLE)

                 aClrs := {}                // 3-й треугольник: 0, 3, 4
                 AADD(aClrs, fColor);AADD(aClrs, fColor3);AADD(aClrs, fColor4)
                 GraGradient(oPS, {mX,mY}, {{mX3,mY3}, {mX4,mY4}}, aClrs, GRA_GRADIENT_TRIANGLE)

                 aClrs := {}                // 4-й треугольник: 0, 1, 3
                 AADD(aClrs, fColor);AADD(aClrs, fColor1);AADD(aClrs, fColor3)
                 GraGradient(oPS, {mX,mY}, {{mX1,mY1}, {mX3,mY3}}, aClrs, GRA_GRADIENT_TRIANGLE)

              *** Нарисовать четырехугольник

              GraSetColor( oPS, GRA_CLR_BLACK, GRA_CLR_BLACK )

              GraLine( oPS, { mX1, mY1 }, { mX2, mY2 } )              // Нарисовать отрезок прямой линии
              GraLine( oPS, { mX1, mY1 }, { mX3, mY3 } )              // Нарисовать отрезок прямой линии
              GraLine( oPS, { mX3, mY3 }, { mX4, mY4 } )              // Нарисовать отрезок прямой линии
              GraLine( oPS, { mX2, mY2 }, { mX4, mY4 } )              // Нарисовать отрезок прямой линии

              *** Нарисовать диагонали

              GraSetColor( oPS, GRA_CLR_RED, GRA_CLR_RED )

              GraLine( oPS, { mX1, mY1 }, { mX4, mY4 } )              // Нарисовать отрезок прямой линии
              GraLine( oPS, { mX2, mY2 }, { mX3, mY3 } )              // Нарисовать отрезок прямой линии
              GraStringAt( oPS, { mX, mY }, ALLTRIM(STR(RECNO(),1)))  // Отобразить номер четырехугольника

              // Отобразить номер вершин 1-го четырехугольника

              GraSetColor( oPS, GRA_CLR_BLACK, GRA_CLR_BLACK )

              GraStringAt( oPS, { mX1+10, mY1+10 }, "1")                 // Отобразить номер вершины четырехугольника
              GraStringAt( oPS, { mX2+10, mY2-10 }, "2")                 // Отобразить номер вершины четырехугольника
              GraStringAt( oPS, { mX3-10, mY3+10 }, "3")                 // Отобразить номер вершины четырехугольника
              GraStringAt( oPS, { mX4-10, mY4-10 }, "4")                 // Отобразить номер вершины четырехугольника

         DBSKIP(1)
      ENDDO

      CLOSE ALL

      ****** Визуализация спектра - легенды ************************

      N_Line = 360                                               // Число линий в спектре

      D = 100
      Z =  60
 
      Delta = INT(360/ N_Line )
      Kx    = (X_MaxW-2*D) / N_Line                              // Коэффициент масштабирования по оси X: преобразует аргумент функции в номер пикселя по оси X

      mColorZer = ABS(INT( mDeltaSpectr + (360-mDeltaSpectr) * (0 - mIntInfMin) / (mIntInfMax-mIntInfMin) ))      // Сделать нормировку значений по цветам спектра: MAX=Красный, MIN-фиолетовый ##############################
      ma := 255/2
      mb := 255/2
      mc := 255/2
      mU := 0
      mV := 120
      mW := 240
      R := INT( ma * (1 + COS( ( mColorZer + mU ) * 3.14159265358979323846 / 180 ) ) )
      G := INT( mb * (1 + COS( ( mColorZer + mV ) * 3.14159265358979323846 / 180 ) ) )
      B := INT( mc * (1 + COS( ( mColorZer + mW ) * 3.14159265358979323846 / 180 ) ) )
      fColorZer := GraMakeRGBColor({ R, G, B })

      Column = 0

      mMinZer = +99999999
      X1zer = 0
      X2zer = 0

      FOR n = 359 TO mDeltaSpectr STEP -Delta

          ma := 255/2
          mb := 255/2
          mc := 255/2

          mU := 0
          mV := 120
          mW := 240

          R := INT( ma * (1 + COS( ( n + mU ) * 3.14159265358979323846 / 180 ) ) )
          G := INT( mb * (1 + COS( ( n + mV ) * 3.14159265358979323846 / 180 ) ) )
          B := INT( mc * (1 + COS( ( n + mW ) * 3.14159265358979323846 / 180 ) ) )

          fColor := GraMakeRGBColor({ R, G, B })

          ***** Закрасить фон прямоугольника ***************

          GraSetColor( oPS, fColor, fColor )

          ++Column

          X1 := D + (Column-1) * Kx + mDeltaSpectr + Z
          X2 := D +  Column    * Kx + mDeltaSpectr + Z
          Y1 := 0
          Y2 := 0 + 30

          GraBox( oPS, { X1, Y1 }, { X2, Y2 }, GRA_FILL) 

          mZer = ABS( fColor - fColorZer )
          IF mZer < mMinZer
             mMinZer = mZer
             X1zer = X1
             X2zer = X2
          ENDIF

      NEXT

      ** Еще сделать надпись нуля, если он не совпадает с минимумом ################

*     IF mMinZer <> +99999999

*        GraSetColor( oPS, GRA_CLR_BLACK, GRA_CLR_BLACK )
*        GraStringAt( oPS, { X1zer, Y2+10 }, ALLTRIM(STR(0,15,3)))
*        GraBox( oPS, { X1zer, Y1 }, { X2zer, Y2 }, GRA_OUTLINE ) 

*     ENDIF

      ****** Надписи на легенде

      GraSetColor( oPS, GRA_CLR_BLACK, GRA_CLR_BLACK )

      oFont := XbpFont():new():create('10.Arial')
      aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_LEFT            // Выравнивание символов по горизонтали по левому краю относительно точки начала вывода
      aAttrF [ GRA_AS_COLOR      ] := GRA_CLR_BLACK 
      GraSetAttrString( oPS, aAttrF )                            // Установить символьные атрибуты

      Column = 0
      FOR n = 359 TO mDeltaSpectr STEP -Delta
          ++Column
      NEXT

      X1 := D + mDeltaSpectr + Z
      X2 := D + mDeltaSpectr + Column * Kx + Z

      GraStringAt( oPS, { X1, Y2+10 }, ALLTRIM(STR(mIntInfMax,15,3)))

      aAttrF [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_RIGHT           // Выравнивание символов по горизонтали по правому краю относительно точки начала вывода
      GraSetAttrString( oPS, aAttrF )                            // Установить символьные атрибуты
      GraStringAt( oPS, { X2, Y2+10 }, ALLTRIM(STR(mIntInfMin,15,3)))


      ******** Запись изображения символа в папку с именем: "InpPortCHR" в виде файла с имененем: "Код и наименование класса"

*     IF FILEDATE("InpPortCHR",16) = CTOD("//")
*        DIRMAKE("InpPortCHR")
*        Mess = 'В папке текущего приложения: "#" не было директории "InpPortCHR" для графических диаграмм нейронов и она была создана!'
*        Mess = STRTRAN(Mess, "#", UPPER(ALLTRIM(M_PathAppl)))
*        LB_Warning(Mess, 'АСК-анализ изображений в системе "ЭЙДОС-X++"' )
*     ENDIF

*     cFileName = M_PathAppl+"\InpPortCHR\"+ConvToAnsiCP("Сист.оп.шк.и гр.-Триангуляция (отладка)-")+".bmp"       // Чтобы в именах файлов можно было использовать русские символы
      cFileName = ConvToAnsiCP("Сист.оп.шк.и гр.-Триангуляция (отладка).bmp")                                     // Чтобы в именах файлов можно было использовать русские символы
      ERASE(cFileName)
      DC_Scrn2ImageFile( oStatic, cFileName )

RETURN NIL
[/size]
A working example of the original data and the source code has here:
http://lc.kubagro.ru/Dima/tr.zip
The triangles are numbered from left to right and from the bottom up. As quadrangles numbered peaks shown in each of these black figures. Junction boxes vertices are numbered from left to right and from the bottom up:
Image
Last edited by Eugene Lutsenko on Sun Dec 06, 2015 11:15 am, edited 2 times in total.

User avatar
Auge_Ohr
Posts: 1428
Joined: Wed Feb 24, 2010 3:44 pm

Re: Unique color gradient fill quadrangle

#7 Post by Auge_Ohr »

WOW ... a lot of work :clap:

did you have a Picture where Data / Color are "wrong" to see what is different to "right" ?
on what Type of Data will you use this Technique ?
greetings by OHR
Jimmy

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Unique color gradient fill quadrangle

#8 Post by Eugene Lutsenko »

I want to improve the capabilities of Eidos, described in my article: http://ej.kubagro.ru/2015/08/pdf/64.pdf, in particular, to provide another display style (triangulation) figures, such as 25, 26, 27, 28.

I want to draw these pictures in the style of triangulation. Now there is only overflow colors largest angle, and I want to do and the length of the radius vector:
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
PS
Maybe I somehow do not quite understand your question

While not very successful, but you can see what happens:
Image

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Unique color gradient fill quadrangle

#9 Post by Eugene Lutsenko »

Applying the above-described method of partition of quadrangles into triangles and gradient shading. But as long as something I do not like. I will try other options.
Image
Image
Last edited by Eugene Lutsenko on Mon Jan 04, 2016 5:16 am, edited 2 times in total.

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Unique color gradient fill quadrangle

#10 Post by Eugene Lutsenko »

With 4 vertices and 4 colors GraGradient is unfortunately not working and 2 you work, and I have not. Perhaps drawGradientFill() it allows?

Code: Select all

         aColors   := {fColor1, fColor2, fColor3, fColor4}
         aVertices := {{X1,Y1}, {X2,Y2}, {X3,Y3}, {X4,Y4}}
         GraGradient(oPS,,aVertices, aColors, GRA_GRADIENT_HORIZONTAL)

         GraGradient(oPS, {X1,Y1}, {{X1,Y1}, {X4,Y4}}, {fColor1, fColor4}, GRA_GRADIENT_HORIZONTAL)

Post Reply