Harmonic sequence of colors in the RGB

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:

Harmonic sequence of colors in the RGB

#1 Post by Eugene Lutsenko »

Anybody can lead source program in Alaska that draws a harmonic sequence of colors in the RGB of gradations N:
Image
Something like that:
https://translate.google.com/translate? ... t=&act=url

It would be nice to do this on the basis of a function that draws a pixel (X, Y, C) of a given color C in the coordinates X, Y. Color C in this function should be specified by a single number: the position in the spectrum, rather than using three beams the brightness RGB.

User avatar
Tom
Posts: 1234
Joined: Thu Jan 28, 2010 12:59 am
Location: Berlin, Germany

Re: Harmonic sequence of colors in the RGB

#2 Post by Tom »

RGB color values from {0,0,0} to {255,255,255} are translated with GraMakeRGBColor() into values from 16777216 to 33554431 (16777216 colors). If you do this:

Code: Select all

FOR i := 16777216 TO 33554431 
  * set color attributes for a line or box
  * paint a point, line or box at the next position
NEXT
you should get something like this. If you have a monitor which is able to show 16777216 pixels in one direction, which would be a really big one. ;)
Best regards,
Tom

"Did I offend you?"
"No."
"Okay, give me a second chance."

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

Re: Harmonic sequence of colors in the RGB

#3 Post by Auge_Ohr »

Eugene Lutsenko wrote:It would be nice to do this on the basis of a function that draws a pixel (X, Y, C) of a given color C in the coordinates X, Y.
Color C in this function should be specified by a single number: the position in the spectrum, rather than using three beams the brightness RGB.
so what is 10000 ?

Code: Select all

{100,100,0} 
{100,0,100} 
{0,100,100} 
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: Harmonic sequence of colors in the RGB

#4 Post by Eugene Lutsenko »

Tom wrote:RGB color values from {0,0,0} to {255,255,255} are translated with GraMakeRGBColor() into values from 16777216 to 33554431 (16777216 colors). If you do this:

Code: Select all

FOR i := 16777216 TO 33554431 
  * set color attributes for a line or box
  * paint a point, line or box at the next position
NEXT
you should get something like this. If you have a monitor which is able to show 16777216 pixels in one direction, which would be a really big one. ;)
I looked at closely at this function. It seems that I need not GraIsRGBColor, and the inverse function: GraGetRGBIntensity. I'll try to do it with the use of what he wanted.

User avatar
rdonnay
Site Admin
Posts: 4813
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: Harmonic sequence of colors in the RGB

#5 Post by rdonnay »

If you have an algorithm for how the harmonic sequence is created, I can write the screen for you.
The eXpress train is coming - and it has more cars.

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

Re: Harmonic sequence of colors in the RGB

#6 Post by Eugene Lutsenko »

rdonnay wrote:If you have an algorithm for how the harmonic sequence is created, I can write the screen for you.
The meaning of the algorithm is described here:
https://translate.google.com/translate? ... t=&act=url
In VBA, it looks like this:

Code: Select all

    
Sub printColumnsColors()
    Dim i As Integer
    Dim s As Slide
    Set s = ActivePresentation.Slides(1)
    For i = 0 To 71
        s.Shapes(i + 1).Fill.ForeColor.RGB = getClr(CLPrms.TextBox1, CLPrms.TextBox2, CLPrms.TextBox3, SingVal(CLPrms.TextBox4), SingVal(CLPrms.TextBox5), SingVal(CLPrms.TextBox6), CLPrms.TextBox7, CLPrms.TextBox8, CLPrms.TextBox9, SingVal(CLPrms.TextBox10.Value), SingVal(CLPrms.TextBox11.Value), SingVal(CLPrms.TextBox12.Value), i)
    Next i
    For i = 72 To 143
        s.Shapes(i + 1).Fill.ForeColor.RGB = getClr(CLPrms.TextBox1, CLPrms.TextBox2, CLPrms.TextBox3, SingVal(CLPrms.TextBox4), SingVal(CLPrms.TextBox5), SingVal(CLPrms.TextBox6), CLPrms.TextBox7, CLPrms.TextBox8, CLPrms.TextBox9, SingVal(CLPrms.TextBox10.Value) - 0.333, SingVal(CLPrms.TextBox11.Value) - 0.333, SingVal(CLPrms.TextBox12.Value) - 0.333, i)
    Next i
    For i = 144 To 215
        s.Shapes(i + 1).Fill.ForeColor.RGB = getClr(CLPrms.TextBox1, CLPrms.TextBox2, CLPrms.TextBox3, SingVal(CLPrms.TextBox4), SingVal(CLPrms.TextBox5), SingVal(CLPrms.TextBox6), CLPrms.TextBox7, CLPrms.TextBox8, CLPrms.TextBox9, SingVal(CLPrms.TextBox10.Value) - 0.667, SingVal(CLPrms.TextBox11.Value) - 0.667, SingVal(CLPrms.TextBox12.Value) - 0.667, i)
    Next i
End Sub



Sub printColumnsColors2()
    Dim n As Integer
    Dim a As Single
    Dim b As Single
    Dim s As Slide
    a = 127.5
    b = 6.28
    Set s = ActivePresentation.Slides(1)
    For n = 0 To 71
        If n >= 0 And n < 24 Then s.Shapes(n + 1).Fill.ForeColor.RGB = RGB(2 * a * (1 - 3 * (n / 72)), Abs(2 * a * (3 * (n / 72 - 1 / 3))), 0)
        If n >= 24 And n < 48 Then s.Shapes(n + 1).Fill.ForeColor.RGB = RGB(0, 2 * a * (1 - 3 * (n / 72 - 1 / 3)), Abs(2 * a * 3 * (n / 72 - 2 / 3)))
        If n >= 48 And n < 72 Then s.Shapes(n + 1).Fill.ForeColor.RGB = RGB(2 * a * (3 * (n / 72)), 0, 2 * a * (1 - 3 * (n / 72 - 2 / 3)))
    Next n
End Sub

Sub allDone()
    Dim i As Integer
    Dim a As Single
    Dim b As Single
    Dim b As Single
    Dim s As Slide
    a = 127.5
    b = 6.28
    Set s = ActivePresentation.Slides(1)
    
    For n = 0 To 71
        If n >= 0 And n < 12 Then s.Shapes(n + 1).Fill.ForeColor.RGB = RGB(255, a * (1 + 2 * Cos(b * (n / 72 - 1 / 3))), 0)
        If n > 11 And n < 24 Then s.Shapes(n + 1).Fill.ForeColor.RGB = RGB(255, 255, a * (1 + 2 * Cos(b * (n / 72 - 1 / 2))))
        If n > 23 And n < 36 Then s.Shapes(n + 1).Fill.ForeColor.RGB = RGB(a * (1 + 2 * Cos(b * (n / 72 - 1 / 6))), 255, 255)
        If n > 35 And n < 48 Then s.Shapes(n + 1).Fill.ForeColor.RGB = RGB(0, a * (1 + 2 * Cos(b * (n / 72 - 1 / 3))), 255)
        If n > 47 And n < 60 Then s.Shapes(n + 1).Fill.ForeColor.RGB = RGB(0, 0, a * (1 + 2 * Cos(b * (n / 72 - 1 / 2))))
        If n > 59 And n < 72 Then s.Shapes(n + 1).Fill.ForeColor.RGB = RGB(a * (1 + 2 * Cos(b * (n / 72 - 1 / 6))), 0, 0)
    Next n
    
    For n = 0 To 71
        If n >= 0 And n < 18 Then s.Shapes(n + 1).Fill.ForeColor.RGB = RGB(255 - Abs(2 * a * (4 * (n / 72 - 1 / 4))), 0, 0)
        If n >= 18 And n < 36 Then s.Shapes(n + 1).Fill.ForeColor.RGB = RGB(255, 255 - Abs(2 * a * (4 * (n / 72 - 2 / 4))), 0)
        If n >= 36 And n < 54 Then s.Shapes(n + 1).Fill.ForeColor.RGB = RGB(255 - Abs(2 * a * (1 - 4 * (n / 72 - 1 / 4))), 255, 0)
        If n >= 54 And n < 72 Then s.Shapes(n + 1).Fill.ForeColor.RGB = RGB(0, 255 - Abs(2 * a * (1 - 4 * (n / 72 - 2 / 4))), 0)
    Next n
    
    
End Sub


Private Function getClr(a As Single, b As Single, c As Single, f As Single, g As Single, h As Single, K As Single, L As Single, M As Single, U As Single, V As Single, W As Single, n As Integer) As Long
    
    getClr = RGB(a * (1 + Cos(f * (n / K + U))), b * (1 + Cos(g * (n / L + V))), c * (1 + Cos(h * (n / M + W))))
    
End Function

Sub showCLParamenters()
    CLPrms.show
End Sub

Function SingVal(strVal As String) As Single
    Dim x As Integer
    Dim a As Integer
    Dim b As Integer
    x = InStr(strVal, "/")
    If x = 0 Then
        SingVal = CSng(strVal)
    Else
        a = Left(strVal, x - 1)
        b = Right(strVal, Len(strVal) - x)
        SingVal = a / b
    End If
End Function

Sub setFs()
    Dim i As Integer
    For i = 1 To 72
        ActivePresentation.Slides(1).Shapes(i).ActionSettings(ppMouseClick).Run = "showCLParamenters"
    Next i
End Sub
[/size]
Image
The file itself is a PowerPoint presentation for this macro is:
http://lc.kubagro.ru/Dima/ColorLine_72x3.ppt
Perhaps it is easier to write a program, based on these figures:
Image
Image

User avatar
rdonnay
Site Admin
Posts: 4813
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: Harmonic sequence of colors in the RGB

#7 Post by rdonnay »

The VB code helps a lot.
I'll try to get to this in a week or 2 after I get back home.
The eXpress train is coming - and it has more cars.

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

Re: Harmonic sequence of colors in the RGB

#8 Post by Eugene Lutsenko »

rdonnay wrote:The VB code helps a lot.
I'll try to get to this in a week or 2 after I get back home.
Perhaps it might be useful to many developers, not just me. I would then be able to encode the color of any size, including the map visualization. There is a machine translation of the description of the algorithm (reduced screenshot):
Image
This source file is more significant wild clarity.
http://lc.kubagro.ru/Dima/RGB1.jpg
I tried (a little) to do something, and give Tom, but it is something I'm doing wrong:
Image

Code: Select all

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

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

LOCAL  GetList[0], GetOptions, nColor, oMessageBox, oMenuWords, oDlg, ;
       oMenuBar,oMenu1,oMenu2,oMenu3,oMenu4,oMenu5,oMenu6,oMenu7,;
       oMenu3_3, nKey := 0

DC_IconDefault(1000)


mNGrad = 16

@0,0 DCGROUP oGroup1 CAPTION 'Задайте число градаций:' SIZE 47.0, 3.5
@1,4 DCSAY "" GET mNGrad PARENT oGroup1 

DCREAD GUI;
      TO lExit ;
      FIT;
      ADDBUTTONS;
      MODAL;
      TITLE "Рисование спектра в системе ЭЙДОС-X++"

********************************************************************
      IF lExit
         ** Button Ok
      ELSE
         QUIT
      ENDIF
********************************************************************

DrawSpectr(mNGrad)

RETURN NIL


*******************************************************************************
* Calculates a RGB color value from RGB color intensities
*******************************************************************************
FUNCTION GraMakeRGBColor( aRGB )

   IF Valtype( aRGB ) <> "A" .OR. ;
      Len( aRGB )     <   3  .OR. ;
      AScan( aRGB, {|n| Valtype(n) <> "N" }, 1, 3 ) > 0
      RETURN NIL
   ENDIF

   aRGB[1] := Max( 0, Min( aRGB[1], 255 ) )
   aRGB[2] := Max( 0, Min( aRGB[2], 255 ) )
   aRGB[3] := Max( 0, Min( aRGB[3], 255 ) )

RETURN (aRGB[1] + (aRGB[2] * 256) + (aRGB[3] * 65536) + 16777216) 


*******************************************************************************
* Check if a numeric value is equivalent to a RGB-color value
*******************************************************************************
FUNCTION GraIsRGBColor( nRGBColor )

   IF Valtype( nRGBColor ) <> "N"
      RETURN .F.
   ENDIF

RETURN ( nRGBColor > GRA_NUMCLR_RESERVED .AND. nRGBColor - 16777216 >= 0  ) 


*******************************************************************************
* Check if a numeric value is equivalent to a RGB-color value
*******************************************************************************
FUNCTION GraGetRGBIntensity( nRGBColor )

   LOCAL aRGB[3]

   IF .NOT. GraIsRGBColor( nRGBColor )
      RETURN NIL
   ENDIF

   aRGB[1] := nRGBColor - 16777216     
   aRGB[3] := Int(aRGB[1] / 65536)

   aRGB[1] -= aRGB[3] * 65536    
   aRGB[2] := Int(aRGB[1] / 256)  

   aRGB[1] -= aRGB[2] * 256 

RETURN aRGB


**********************************************
******** ВИЗУАЛИЗАЦИЯ СПЕКТРА ****************
**********************************************
FUNCTION DrawSpectr(mNGrad)

   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 {|| _PresSpaceSpectr(oStatic, mNGrad) }

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

RETURN NIL
*************************************************
STATIC FUNCTION _PresSpaceSpectr( oStatic, mNGrad )

   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_DrawSpectr( oPS, mNGrad ) }

RETURN NIL

*******************************************************
STATIC FUNCTION LC_DrawSpectr(oPS, mNGrad )

   PRIVATE X0 := 25
   PRIVATE Y0 := 25                                    // Начало координат по осям X и Y с учетом места для легенды

   PRIVATE W_Wind := X_MaxW - X0                       // Ширина окна для самого графика
   PRIVATE H_Wind := Y_MaxW - Y0                       // Высота окна для самого графика

   PRIVATE Kx := W_Wind / ( mNGrad )                   // Коэффициент масштабирования по оси X: преобразует аргумент функции в номер пикселя по оси X
   PRIVATE Ky := H_Wind / ( 100 )                      // Коэффициент масштабирования по оси Y: преобразует значение функции в номер пикселя по оси Y

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

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

   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(mNGrad))+' ЦВЕТОВ'
   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)

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

   Delta = INT( 16777216 / mNGrad )

   C = 0

   FOR nRGBColor = 16777216 TO 33554431 STEP Delta

       IF .NOT. GraIsRGBColor( nRGBColor )

          MsgBox(ALLTRIM(STR(nRGBColor)))

       ELSE

          ++C
          X1 := X0 + (C-1) * Kx
          Y1 := Y0
          X2 := X0 +  C    * Kx
          Y2 := Y0 +  100  * Ky

          aRGB = GraGetRGBIntensity( nRGBColor )

          fColor := GraMakeRGBColor({ aRGB[1], aRGB[2], aRGB[3] })

          ***** Закрасить фон прямоугольника ***************
          GraSetColor( oPS, fColor, fColor )
          GraBox( oPS, { X1, Y1 }, { X2, Y2 }, GRA_FILL) 

       ENDIF

   NEXT

RETURN NIL
[/size]

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

Re: Harmonic sequence of colors in the RGB

#9 Post by Eugene Lutsenko »

Like something sensible out. Tolok colors appear dull. In PhotoShop increased saturation, then it became clear that, in principle, that it turns out.
Image
Image

Code: Select all


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

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

LOCAL  GetList[0], GetOptions, nColor, oMessageBox, oMenuWords, oDlg, ;
       oMenuBar,oMenu1,oMenu2,oMenu3,oMenu4,oMenu5,oMenu6,oMenu7,;
       oMenu3_3, nKey := 0

DC_IconDefault(1000)


mNGrad = 72

@0,0 DCGROUP oGroup1 CAPTION 'Задайте число градаций:' SIZE 47.0, 3.5
@1,4 DCSAY "" GET mNGrad PARENT oGroup1 

DCREAD GUI;
      TO lExit ;
      FIT;
      ADDBUTTONS;
      MODAL;
      TITLE "Рисование спектра в системе ЭЙДОС-X++"

********************************************************************
      IF lExit
         ** Button Ok
      ELSE
         QUIT
      ENDIF
********************************************************************

DrawSpectr(mNGrad)

RETURN NIL


*******************************************************************************
* Calculates a RGB color value from RGB color intensities
*******************************************************************************
FUNCTION GraMakeRGBColor( aRGB )

   IF Valtype( aRGB ) <> "A" .OR. ;
      Len( aRGB )     <   3  .OR. ;
      AScan( aRGB, {|n| Valtype(n) <> "N" }, 1, 3 ) > 0
      RETURN NIL
   ENDIF

   aRGB[1] := Max( 0, Min( aRGB[1], 255 ) )
   aRGB[2] := Max( 0, Min( aRGB[2], 255 ) )
   aRGB[3] := Max( 0, Min( aRGB[3], 255 ) )

RETURN (aRGB[1] + (aRGB[2] * 256) + (aRGB[3] * 65536) + 16777216) 


*******************************************************************************
* Check if a numeric value is equivalent to a RGB-color value
*******************************************************************************
FUNCTION GraIsRGBColor( nRGBColor )

   IF Valtype( nRGBColor ) <> "N"
      RETURN .F.
   ENDIF

RETURN ( nRGBColor > GRA_NUMCLR_RESERVED .AND. nRGBColor - 16777216 >= 0  ) 


*******************************************************************************
* Check if a numeric value is equivalent to a RGB-color value
*******************************************************************************
FUNCTION GraGetRGBIntensity( nRGBColor )

   LOCAL aRGB[3]

   IF .NOT. GraIsRGBColor( nRGBColor )
      RETURN NIL
   ENDIF

   aRGB[1] := nRGBColor - 16777216     
   aRGB[3] := Int(aRGB[1] / 65536)

   aRGB[1] -= aRGB[3] * 65536    
   aRGB[2] := Int(aRGB[1] / 256)  

   aRGB[1] -= aRGB[2] * 256 

RETURN aRGB


**********************************************
******** ВИЗУАЛИЗАЦИЯ СПЕКТРА ****************
**********************************************
FUNCTION DrawSpectr(mNGrad)

   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 {|| _PresSpaceSpectr(oStatic, mNGrad) }

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

RETURN NIL
*************************************************
STATIC FUNCTION _PresSpaceSpectr( oStatic, mNGrad )

   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_DrawSpectr( oPS, mNGrad ) }

RETURN NIL

*******************************************************
STATIC FUNCTION LC_DrawSpectr(oPS, mNGrad )

*  mNGrad = 16

   PRIVATE X0 := 25
   PRIVATE Y0 := 25                                    // Начало координат по осям X и Y с учетом места для легенды

   PRIVATE W_Wind := X_MaxW - X0                       // Ширина окна для самого графика
   PRIVATE H_Wind := Y_MaxW - Y0                       // Высота окна для самого графика

   PRIVATE Kx := W_Wind / ( mNGrad )                   // Коэффициент масштабирования по оси X: преобразует аргумент функции в номер пикселя по оси X
   PRIVATE Ky := H_Wind / ( 100 )                      // Коэффициент масштабирования по оси Y: преобразует значение функции в номер пикселя по оси Y

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

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

   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(mNGrad))+' ЦВЕТОВ'
   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)

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

*  Delta = INT( 16777216 / mNGrad )
*  C = 0
*  FOR nRGBColor = 16777216 TO 33554431 STEP Delta
*      IF .NOT. GraIsRGBColor( nRGBColor )
*         MsgBox(ALLTRIM(STR(nRGBColor)))
*      ELSE
*         ++C
*         X1 := X0 + (C-1) * Kx
*         Y1 := Y0
*         X2 := X0 +  C    * Kx
*         Y2 := Y0 +  90   * Ky
*         aRGB = GraGetRGBIntensity( nRGBColor )
*         fColor := GraMakeRGBColor({ aRGB[1], aRGB[2], aRGB[3] })
*         ***** Закрасить фон прямоугольника ***************
*         GraSetColor( oPS, fColor, fColor )
*         GraBox( oPS, { X1, Y1 }, { X2, Y2 }, GRA_FILL) 
*      ENDIF
*  NEXT

   ******* Гармонические последовательности цветов

   Delta = INT( 360 / mNGrad )

   Column = 0

   FOR n = 0 TO 359 STEP Delta

       a = 127.5
       b = 127.5
       c = 127.5

*      f = 6.28
*      g = 6.28
*      h = 6.28

       f = 1
       g = 1
       h = 1

       K = mNGrad
       L = mNGrad
       M = mNGrad

*      U = 1/3
*      V = 2/3
*      W = 0/3

       U = 0
       V = 120
       W = 240

*      R = INT( a * ( 1 + COS( f * ( n / K + U )) * 3.14159265358979323846 / 180 ))
*      G = INT( b * ( 1 + COS( g * ( n / L + V )) * 3.14159265358979323846 / 180 ))
*      B = INT( c * ( 1 + COS( h * ( n / M + W )) * 3.14159265358979323846 / 180 ))

       R = INT( a * ( 1 + COS( f * ( n + U )) * 3.14159265358979323846 / 180 ))
       G = INT( b * ( 1 + COS( g * ( n + V )) * 3.14159265358979323846 / 180 ))
       B = INT( c * ( 1 + COS( h * ( n + W )) * 3.14159265358979323846 / 180 ))

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

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

       GraSetColor( oPS, fColor, fColor )

       ++Column
       X1 := X0 + (Column-1) * Kx
       Y1 := Y0
       X2 := X0 +  Column    * Kx
       Y2 := Y0 +       100  * Ky

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

   NEXT

RETURN NIL
[/size]
Last edited by Eugene Lutsenko on Tue May 19, 2015 11:30 pm, edited 1 time in total.

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

Re: Harmonic sequence of colors in the RGB

#10 Post by Auge_Ohr »

as i see you use a FOR / NEXT to paint these Colors ... how long does it take ?

if you just want that shown Colors it does not make Sence to "calculate" Color between
RED/PINK - PINK/BLUE - BLUE/CYAN - CYAN/GREEN - GREEN/YELLOW - YELLOW-RED.

this Sample use GraGradient
HS_RGB_Gradient.JPG
HS_RGB_Gradient.JPG (18.91 KiB) Viewed 13663 times
HS_RGB.ZIP
(1.39 KiB) Downloaded 687 times
greetings by OHR
Jimmy

Post Reply