Board Logo
« color picker »

Welcome Guest. Please Login or Register.
Aug 17th, 2017, 06:27am


Conforums Terms of Service | Membership Rules | Home | Search | Recent Posts | Notification | Format Your Message | Installation FAQ

Please use the forums Search feature before asking.
Please post code using the code box described in Format Your Messages.
This will keep indentation, separate it better form the message and prevent gibberish.
If the code is too long for one post or additional files are needed, upload a ZIP archive to the Just BASIC Files Archive Site.

« Previous Topic | Next Topic »
Pages: 1  Notify Send Topic Print
 thread  Author  Topic: color picker  (Read 313 times)
zzz000abc
Full Member
ImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 245
xx color picker
« Thread started on: May 16th, 2017, 05:11am »

hi,
here is the code for basic model of color picker:
Code:
             nomainwin
             pi=3.14159265
      ww=DisplayWidth/2
      wh=DisplayHeight/2
        WindowWidth=ww
        WindowHeight=wh
      graphicbox #1.gb 0,10,ww/2,ww/2
         textbox #1.tb1 ww/2+10,40,100,30
         textbox #1.tb2 ww/2+10+100+10,40,100,30
         textbox #1.tb3 ww/2+10+200+20,40,100,30
        textbox #1.tb4 ww/2+10,150,300,40
        textbox #1.tb5 ww/2+10,150+70,300,40
        textbox #1.tb6 ww/2+10,150+140,300,40
      open"JB color pick"for window as#1
      #1 "trapclose [quit]"
          dc=(atn(1))/45
          xx=ww/4:yy=wh/3'centre
          leg=ww/6:stk=20 'leg and stroke lengths
           clr1$="blue":clr2$="white"
          leg=100
        call cring xx,yy,leg,0,0
          leg=leg-20
        call try60 xx,yy,i,leg,stk,clr1$,sclr$
        sktclr$(1)=" 255 0 0"
            #1.tb1 "!font tahoma 12":#1.tb1 "  red"
            #1.tb2 "!font tahoma 12":#1.tb2 " green"
            #1.tb3 "!font tahoma 12":#1.tb3 "  blue"

               #1.tb4 "!font tahoma 15"
               #1.tb5 "!font tahoma 15"
               #1.tb6 "!font tahoma 15"
         #1.gb "when leftButtonUp [mup] "
        wait
     [mup]
        mx=MouseX:my=MouseY
        Dy=yy-my:Dx=mx-xx
        ang=atan2(Dy,Dx)
        r1=Dx/cos(ang)
        if ang<0 then ang=2*pi+ang
      if r1>=leg and r1<=leg+stk then
            sclr$=sktclr$(1)
            call cring xx,yy,leg,1,(360-ang/dc)
            call try60 xx,yy,i,leg,stk,clr2$,sclr$
            sclr$="black"
            call try60 xx,yy,ang/dc,leg,stk,clr1$,sclr$
            i=ang/dc
           tbclr$=sktclr$(1)
           r=int(val(word$(tbclr$,1)))
           g=int(val(word$(tbclr$,2)))
           b=int(val(word$(tbclr$,3)))
           #1.gb "color ";abs(240-r);" ";abs(240-g);" ";abs(240-b)
            #1.gb "backcolor ";sktclr$(1)
            #1.gb "up;goto 300 300;down;circlefilled 20;flush"
            #1.gb  "backcolor white"

                #1.tb1 "   ";r
                #1.tb2 "   ";g
                #1.tb3 "   ";b
             #1.tb4 "color ";tbclr$
             #1.tb5 "backcolor ";tbclr$
             #1.tb6 "fill ";tbclr$
      end if
        wait
      [quit]
      close #1
      end
      sub try60 x0,y0,ang0,leg,stk,clr$,sclr$
              dc=(atn(1))/45  :pi=4*atn(1)
            rd1=(ang0)*dc
            rd2=(ang0+60)*dc
            rd3=(ang0+120)*dc
                 x1=x0+leg*cos(rd1)
                 y1=y0-leg*sin(rd1)
              x2=x0-leg*cos(rd2)
              y2=y0+leg*sin(rd2)
                x3=x0+leg*cos(rd3)
                y3=y0-leg*sin(rd3)
             x11=x0+(leg+stk)*cos(rd1)
             y11=y0-(leg+stk)*sin(rd1)
               #1.gb "discard;color ";clr$
               #1.gb "down;size 2;line ";x1;" ";y1;" ";x2;" ";y2
               #1.gb "line ";x1;" ";y1;" ";x3;" ";y3
               #1.gb "line ";x2;" ";y2;" ";x3;" ";y3
            if sclr$<>"" then #1.gb "size 3;color ";sclr$
              #1.gb "line ";x11;" ";y11;" ";x1;" ";y1;"; flush"
              #1.gb "color ";clr$
      end sub

      sub cring x0,y0,rd,s,ang
            f=24:t=1/f:k=255/120:k=k/f
            r=255:dc=atn(1)/45:rd2=rd-22
          for i=0 to 360 step t
              x=x0+rd*cos(i*dc):y=y0+rd*sin(i*dc)
              xx=x0+rd2*cos(i*dc):yy=y0+rd2*sin(i*dc)
                if i>0 and i<60 then r=r-0.5*k: g=g+1.5*k
                if i>60 and i<120 then r=r-1.5*k:g=g+0.5*k
                if i>120 and i<180 then g=g-0.5*k: b=b+1.5*k
                if i>180 and i<240 then g=g-1.5*k:b=b+0.5*k
                if i>240 and i<300 then b=b-0.5*k: r=r+1.5*k
                if i>300 and i<360 then b=b-1.5*k:r=r+0.5*k
                    if s=1 then goto[skip1]
                #1.gb "discard;down"
                #1.gb "size 2;color ";r;" ";g;" ";b
                #1.gb "line ";x0;" ";y0;" ";x;" ";y
                #1.gb "color white;size 4;line ";x0;" ";y0;" ";xx;" ";yy;";flush"
                   goto[skip2]
             [skip1]
                sktclr$(1)=using("###",r)+" "+using("###",g)+" "+using("###",b)
                if abs(ang-i)<0.03 then exit for
             [skip2]
          next
      end sub
      Function atan2(y,x)
            'atan2 is a function which determines the angle between points
            'x1, y1 and x2, y2. The angle returned is in radians
            'The angle returned is always in the range of
            '-PI to PI radians (-180 to 180 degrees)
            '==============================================================
            'NOTE the position of Y and X arguments
            'This keeps atan2 function same as other language versions
            '==============================================================
          If x = 0 Then
              If y < 0 Then
                    atan2 = -1.5707963267948967
              Else
                    atan2 = 1.5707963267948967
              End If
          Else
                chk = atn(y/x)
              If x < 0 Then
                  If y < 0 Then
                        chk = chk - 3.1415926535897932
                  Else
                        chk = chk + 3.1415926535897932
                  End If
              End If
                atan2 = chk
          End If
            'thanks Andy Amaya
      End Function

 


* it is gtk+ imitation but lacking many features compared to that.
not all color combinations included only 2 color combinations taken 3
color combinations not considered .
* code for selecting shades(triangle part) not written.
thanks to andy amaya for providing simple yet powerful function
atan2 to forum .
* if I were not aware of that function certainly I would have knocked my
head a few times (nay many times) to write a similar function to find
the angle made by a line.
* thanks to B+ for introducing me atan2 function. :D
User IP Logged

tsh73
JB-Supporter


member is offline

Avatar




PM

Gender: Male
Posts: 3545
xx Re: color picker
« Reply #1 on: May 16th, 2017, 09:22am »

It looks like drawing circle is slow
so then you click it tried to draw it again
resulting in slow reaction in click?

Probably you can reuse once drawn circle with getbmp/drawbmp.
User IP Logged

Q: "And if I took your codes and compile them, and sell them for a profit"?
A: Go ahead. I had my share of good then I coded it for fun, if you can make better use of it - please do.
(enjoying JB 1.01 on WinXP, netbook and desktop)
Valentin
Junior Member
ImageImageImage


member is offline

Avatar




PM


Posts: 108
xx Re: color picker
« Reply #2 on: May 17th, 2017, 01:55am »

If the data were displayed in a texteditor, this would allow them to be copied / pasted
User IP Logged

bplus
Senior Member
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 1132
xx Re: color picker
« Reply #3 on: May 17th, 2017, 03:29am »

I confess, I had/have many questions when I first saw this.

I think many would be cleared up if I knew what gtk+ was.

I bet tk stands for tool kit, g ?

+ stands for me ;-))

Is this a Liberty thing?
User IP Logged

B+
tsh73
JB-Supporter


member is offline

Avatar




PM

Gender: Male
Posts: 3545
xx Re: color picker
« Reply #4 on: May 17th, 2017, 04:08am »

looks like:
http://gcolor2.sourceforge.net/

(GTK is "GIMP ToolKit"
https://www.gtk.org/
https://en.wikipedia.org/wiki/GTK%2B
If you have Gimp installed, you have this color picker)
« Last Edit: May 17th, 2017, 04:10am by tsh73 » User IP Logged

Q: "And if I took your codes and compile them, and sell them for a profit"?
A: Go ahead. I had my share of good then I coded it for fun, if you can make better use of it - please do.
(enjoying JB 1.01 on WinXP, netbook and desktop)
zzz000abc
Full Member
ImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 245
xx Re: color picker
« Reply #5 on: May 17th, 2017, 08:02am »

tsh,
Quote:
Probably you can reuse once drawn circle with getbmp/drawbmp.

I will consider that in next version. But still didn't get how to make triangle part/and how to make it faster.

Valentin,
Quote:
If the data were displayed in a texteditor, this would allow them to be copied / pasted

that part you can extend easily without changing the original code.
even though I am providing it for you.
Code:
             nomainwin
             pi=3.14159265
      ww=DisplayWidth/2
      wh=DisplayHeight/2
        WindowWidth=ww
        WindowHeight=wh
      graphicbox #1.gb 0,0,ww/2,ww/2
         textbox #1.tb1 ww/2+10,0,100,30
         textbox #1.tb2 ww/2+10+100+10,0,100,30
         textbox #1.tb3 ww/2+10+200+20,0,100,30
        texteditor #1.te1 ww/2+10,80,ww/3,50
        button #1.bt1 "save",[save],UR,20,80

        textbox #1.tb4 ww/2+10,150,300,40
        textbox #1.tb5 ww/2+10,150+70,300,40
        textbox #1.tb6 ww/2+10,150+140,300,40
      open"JB color pick"for window as#1
      #1 "trapclose [quit]"
          dc=(atn(1))/45
          xx=ww/4:yy=wh/3-20'centre
          leg=ww/6:stk=25 'leg and stroke lengths
           clr1$="blue":clr2$="white"
          leg=100
        call cring xx,yy,leg,0,0
          leg=leg-25
        call try60 xx,yy,i,leg,stk,clr1$,sclr$
        sktclr$(1)=" 255 0 0"
            #1.tb1 "!font tahoma 12":#1.tb1 "  red"
            #1.tb2 "!font tahoma 12":#1.tb2 " green"
            #1.tb3 "!font tahoma 12":#1.tb3 "  blue"

               #1.tb4 "!font tahoma 15"
               #1.tb5 "!font tahoma 15"
               #1.tb6 "!font tahoma 15"
               #1.te1 "!font tahoma 15"
         #1.gb "when leftButtonUp [mup] "
        wait
     [mup]
        mx=MouseX:my=MouseY
        Dy=yy-my:Dx=mx-xx
        ang=atan2(Dy,Dx)
        r1=Dx/cos(ang)
        if ang<0 then ang=2*pi+ang
      if r1>=leg and r1<=leg+stk then
            sclr$=sktclr$(1)
            call cring xx,yy,leg,1,(360-ang/dc)
            call try60 xx,yy,i,leg,stk,clr2$,sclr$
            sclr$="black"
            call try60 xx,yy,ang/dc,leg,stk,clr1$,sclr$
            i=ang/dc
           tbclr$=sktclr$(1)
           r=int(val(word$(tbclr$,1)))
           g=int(val(word$(tbclr$,2)))
           b=int(val(word$(tbclr$,3)))
           #1.gb "color ";abs(240-r);" ";abs(240-g);" ";abs(240-b)
            #1.gb "backcolor ";sktclr$(1)
            #1.gb "up;goto 300 300;down;circlefilled 20;flush"
            #1.gb  "backcolor white"

                #1.tb1 "   ";r
                #1.tb2 "   ";g
                #1.tb3 "   ";b
             #1.tb4 "color ";tbclr$
             #1.tb5 "backcolor ";tbclr$
             #1.tb6 "fill ";tbclr$
      end if
        wait
        [save]
        #1.te1 " ";r;"  ";g;"  ";b
        wait
      [quit]
      close #1
      end
      sub try60 x0,y0,ang0,leg,stk,clr$,sclr$
              dc=(atn(1))/45  :pi=4*atn(1)
            rd1=(ang0)*dc
            rd2=(ang0+60)*dc
            rd3=(ang0+120)*dc
                 x1=x0+leg*cos(rd1)
                 y1=y0-leg*sin(rd1)
              x2=x0-leg*cos(rd2)
              y2=y0+leg*sin(rd2)
                x3=x0+leg*cos(rd3)
                y3=y0-leg*sin(rd3)
             x11=x0+(leg+stk)*cos(rd1)
             y11=y0-(leg+stk)*sin(rd1)
             x22=x0+(leg+6)*cos(rd1)
             y22=y0-(leg+6)*sin(rd1)
               #1.gb "discard;color ";clr$
               #1.gb "down;size 2;line ";x1;" ";y1;" ";x2;" ";y2
               #1.gb "line ";x1;" ";y1;" ";x3;" ";y3
               #1.gb "line ";x2;" ";y2;" ";x3;" ";y3
            if sclr$<>"" then #1.gb "size 3;color ";sclr$
              #1.gb "line ";x11;" ";y11;" ";x22;" ";y22;"; flush"
              #1.gb "color ";clr$
      end sub

      sub cring x0,y0,rd,s,ang
            f=24:t=1/f:k=255/120:k=k/f
            r=255:dc=atn(1)/45:rd2=rd-22
          for i=0 to 360 step t
              x=x0+rd*cos(i*dc):y=y0+rd*sin(i*dc)
              xx=x0+rd2*cos(i*dc):yy=y0+rd2*sin(i*dc)
                if i>0 and i<60 then r=r-0.5*k: g=g+1.5*k
                if i>60 and i<120 then r=r-1.5*k:g=g+0.5*k
                if i>120 and i<180 then g=g-0.5*k: b=b+1.5*k
                if i>180 and i<240 then g=g-1.5*k:b=b+0.5*k
                if i>240 and i<300 then b=b-0.5*k: r=r+1.5*k
                if i>300 and i<360 then b=b-1.5*k:r=r+0.5*k
                    if s=1 then goto[skip1]
                #1.gb "discard;down"
                #1.gb "size 2;color ";r;" ";g;" ";b
                #1.gb "line ";x0;" ";y0;" ";x;" ";y
                #1.gb "color white;size 4;line ";x0;" ";y0;" ";xx;" ";yy;";flush"
                   goto[skip2]
             [skip1]
                sktclr$(1)=using("###",r)+" "+using("###",g)+" "+using("###",b)
                if abs(ang-i)<0.03 then exit for
             [skip2]
          next
      end sub
      Function atan2(y,x)
            'atan2 is a function which determines the angle between points
            'x1, y1 and x2, y2. The angle returned is in radians
            'The angle returned is always in the range of
            '-PI to PI radians (-180 to 180 degrees)
            '==============================================================
            'NOTE the position of Y and X arguments
            'This keeps atan2 function same as other language versions
            '==============================================================
          If x = 0 Then
              If y < 0 Then
                    atan2 = -1.5707963267948967
              Else
                    atan2 = 1.5707963267948967
              End If
          Else
                chk = atn(y/x)
              If x < 0 Then
                  If y < 0 Then
                        chk = chk - 3.1415926535897932
                  Else
                        chk = chk + 3.1415926535897932
                  End If
              End If
                atan2 = chk
          End If
            'thanks Andy Amaya
      End Function

 


Edit1. If you want text editor bigger then quote all the lines with #1.tb
in the code and and increase the height of text editor. for example you can write 150 or 300 in place of 50(text editor height in the code. See the
line starting with text editor #1.te1)

B+,
Quote:
I think many would be cleared up if I knew what gtk+ was.

tsh is right , it stands for 'Gimp tool kit'
if you enjoy compiling on linux then download it from

http://gcolor2.sourceforge.net/
it works without Gimp also.
If you have any linux you are more likely to find it preinstalled.

If you like to install Linux on cd/pendrive/memory card the send me a message so that i can send you a link and guide you how to install it on a memorycard/pen drive(it requires less than 300Mb)
« Last Edit: May 17th, 2017, 08:21am by zzz000abc » User IP Logged

tsh73
JB-Supporter


member is offline

Avatar




PM

Gender: Male
Posts: 3545
xx Re: color picker
« Reply #6 on: May 17th, 2017, 09:45am »

Went for triangle
Upright standing, simple color (red).
I have no idea about how it goes for other hews,
(need to make/find somewhere HSL/HSV color)
but for red it looks similar
- and takes about 2 second on my machine just to do color changing/point setting
(and there is no way around color changing!)
Code:
nomainwin
open "test" for graphics as #gr
#gr "down"
#gr "trapclose [quit]"
t0=time$("ms")
Jmax = 100*sqr(3)/2
for i = 1 to 100    'horiz
    y=abs(i-50)*sqr(3)
    '#gr "set ";i;" ";y
    cmd$ = ""
    for j = y to Jmax   'vert, up is most saturated (255 0 0)
        '#gr "color ";int(rnd(0)*255);" ";int(rnd(0)*255);" ";int(rnd(0)*255)
        '#gr "set ";int(i);" ";int(j)
        'for red color
        'r is distance from lower left corner, here 0..100
        'g, b from lower right
        r= sqr(i^2+(j-Jmax)^2)
        g= sqr((i-100)^2+(j-Jmax)^2)
        'but no more then r
        g = g/100*r
        'b is the same
        b= g
        'scale to 0..255
        r = int(r/100*255)
        g = int(g/100*255)
        b = int(b/100*255)
        'build long string
        cmd$ = cmd$;";";"color ";r;" ";g;" ";b
        cmd$ = cmd$;";";"set ";int(i);" ";int(j)
    next
    'print left$(cmd$, 1000)
    #gr mid$(cmd$,2)
next
#gr "flush"

dt = time$("ms")-t0
notice "dt"; dt    '422 ms without color change, 2096 with random colors

wait

[quit]
    close #gr
    end
 


EDIT some discussion on HSL and RGB on LB forum
RGB to HSL converter
« Last Edit: May 17th, 2017, 09:56am by tsh73 » User IP Logged

Q: "And if I took your codes and compile them, and sell them for a profit"?
A: Go ahead. I had my share of good then I coded it for fun, if you can make better use of it - please do.
(enjoying JB 1.01 on WinXP, netbook and desktop)
bplus
Senior Member
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 1132
xx Re: color picker
« Reply #7 on: May 17th, 2017, 09:54am »

Thanks tsh,

zzz000abc Quote:
If you like to install Linux on cd/pendrive/memory card the send me a message so that i can send you a link and guide you how to install it on a memorycard/pen drive(it requires less than 300Mb)


Oh Good BOT above!

I have ANOTHER Linux friend.

To get this joke, you have to know I don't have Linux (but I have looked into possibly getting it and overwhelmed by the choices and the tech talk, Yikes!)

But I keep making these friends who do cool stuff with BASIC and, I don't know, maybe 9 times out of 10 they use Linux.

zzz000abc, I might take you up on your offer, I like the flash drive idea. I am wearing out trying not to be taken by the conspiracy.
"Resistance is futile.", they keep coming back like space invaders.

cheesy
« Last Edit: May 17th, 2017, 09:57am by bplus » User IP Logged

B+
bplus
Senior Member
ImageImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 1132
xx Re: color picker
« Reply #8 on: May 17th, 2017, 10:14am »

Ah, while thanking the great BOT above, IT sends another one of IT's angels. wink

tsh, I see another elegant solution in how the triangle might be worked into zzz's picker.

That was fast work, unless you were waiting for my comment to continue. I will check it out.
User IP Logged

B+
tsh73
JB-Supporter


member is offline

Avatar




PM

Gender: Male
Posts: 3545
xx Re: color picker
« Reply #9 on: May 17th, 2017, 3:25pm »

zzz000abc,
I indented your code so I can read it
and speed color circle part about 20x
* by decreasing "f" from 24 to 2 (parts single degree splitted by)
- test shows that 1 leaves some gaps but 2 is enogh for smooth picture
* and by removing part that clears part of line be overprinting it with white (just draw only part that needed).

Nothing else changed.
Code:
nomainwin

 pi=3.14159265
ww=DisplayWidth/2
wh=DisplayHeight/2

WindowWidth=ww
WindowHeight=wh

graphicbox #1.gb 0,0,ww/2,ww/2
textbox #1.tb1 ww/2+10,0,100,30
textbox #1.tb2 ww/2+10+100+10,0,100,30
textbox #1.tb3 ww/2+10+200+20,0,100,30
texteditor #1.te1 ww/2+10,80,ww/3,50
button #1.bt1 "save",[save],UR,20,80

textbox #1.tb4 ww/2+10,150,300,40
textbox #1.tb5 ww/2+10,150+70,300,40
textbox #1.tb6 ww/2+10,150+140,300,40

open "JB color pick"for window as #1
    #1 "trapclose [quit]"
    dc=(atn(1))/45
    xx=ww/4:yy=wh/3-20'centre
    leg=ww/6:stk=25 'leg and stroke lengths
    clr1$="blue":clr2$="white"
    leg=100
    t0=time$("ms")
    call cring xx,yy,leg,0,0
    t1=time$("ms")
    'notice "cring time";t1-t0    'src: 81xx
        'decreased 10x by changing f from 24 to 2
        '2x mode by removing white middle part
        '(if needed, circlefilled will do that instantly)
    leg=leg-25
    call try60 xx,yy,i,leg,stk,clr1$,sclr$
    sktclr$(1)=" 255 0 0"
    #1.tb1 "!font tahoma 12":#1.tb1 "  red"
    #1.tb2 "!font tahoma 12":#1.tb2 " green"
    #1.tb3 "!font tahoma 12":#1.tb3 "  blue"

    #1.tb4 "!font tahoma 15"
    #1.tb5 "!font tahoma 15"
    #1.tb6 "!font tahoma 15"
    #1.te1 "!font tahoma 15"
    #1.gb "when leftButtonUp [mup] "
    wait

[mup]
    mx=MouseX:my=MouseY
    Dy=yy-my:Dx=mx-xx
    ang=atan2(Dy,Dx)
    r1=Dx/cos(ang)
    if ang<0 then ang=2*pi+ang
    if r1>=leg and r1<=leg+stk then
        sclr$=sktclr$(1)
        call cring xx,yy,leg,1,(360-ang/dc)
        call try60 xx,yy,i,leg,stk,clr2$,sclr$
        sclr$="black"
        call try60 xx,yy,ang/dc,leg,stk,clr1$,sclr$
        i=ang/dc
        tbclr$=sktclr$(1)
        r=int(val(word$(tbclr$,1)))
        g=int(val(word$(tbclr$,2)))
        b=int(val(word$(tbclr$,3)))
        #1.gb "color ";abs(240-r);" ";abs(240-g);" ";abs(240-b)
        #1.gb "backcolor ";sktclr$(1)
        #1.gb "up;goto 300 300;down;circlefilled 20;flush"
        #1.gb  "backcolor white"

        #1.tb1 "   ";r
        #1.tb2 "   ";g
        #1.tb3 "   ";b
        #1.tb4 "color ";tbclr$
        #1.tb5 "backcolor ";tbclr$
        #1.tb6 "fill ";tbclr$
    end if
    wait

[save]
    #1.te1 " ";r;"  ";g;"  ";b
    wait

[quit]
    close #1
    end

sub try60 x0,y0,ang0,leg,stk,clr$,sclr$
    dc=(atn(1))/45  :pi=4*atn(1)
    rd1=(ang0)*dc
    rd2=(ang0+60)*dc
    rd3=(ang0+120)*dc
    x1=x0+leg*cos(rd1)
    y1=y0-leg*sin(rd1)
    x2=x0-leg*cos(rd2)
    y2=y0+leg*sin(rd2)
    x3=x0+leg*cos(rd3)
    y3=y0-leg*sin(rd3)
    x11=x0+(leg+stk)*cos(rd1)
    y11=y0-(leg+stk)*sin(rd1)
    x22=x0+(leg+6)*cos(rd1)
    y22=y0-(leg+6)*sin(rd1)
    #1.gb "discard;color ";clr$
    #1.gb "down;size 2;line ";x1;" ";y1;" ";x2;" ";y2
    #1.gb "line ";x1;" ";y1;" ";x3;" ";y3
    #1.gb "line ";x2;" ";y2;" ";x3;" ";y3
    if sclr$<>"" then #1.gb "size 3;color ";sclr$
    #1.gb "line ";x11;" ";y11;" ";x22;" ";y22;"; flush"
    #1.gb "color ";clr$
end sub

sub cring x0,y0,rd,s,ang
    'f=24    '2 is enough, and 10x faster
    f=2:t=1/f:k=255/120:k=k/f
    r=255:dc=atn(1)/45:rd2=rd-22
    #1.gb "discard;down"
    #1.gb "size 2"
    for i=0 to 360 step t
        x=x0+rd*cos(i*dc):y=y0+rd*sin(i*dc)
        xx=x0+rd2*cos(i*dc):yy=y0+rd2*sin(i*dc)
        if i>0 and i<60 then r=r-0.5*k: g=g+1.5*k
        if i>60 and i<120 then r=r-1.5*k:g=g+0.5*k
        if i>120 and i<180 then g=g-0.5*k: b=b+1.5*k
        if i>180 and i<240 then g=g-1.5*k:b=b+0.5*k
        if i>240 and i<300 then b=b-0.5*k: r=r+1.5*k
        if i>300 and i<360 then b=b-1.5*k:r=r+0.5*k
        if s=1 then goto[skip1]
        #1.gb "color ";r;" ";g;" ";b
        #1.gb "line ";xx;" ";yy;" ";x;" ";y
        goto[skip2]
[skip1]
        sktclr$(1)=using("###",r)+" "+using("###",g)+" "+using("###",b)
        'if abs(ang-i)<0.03 then exit for
        if abs(ang-i)<2/f then exit for
[skip2]
    next
    #1.gb "flush"
end sub

Function atan2(y,x)
    'atan2 is a function which determines the angle between points
    'x1, y1 and x2, y2. The angle returned is in radians
    'The angle returned is always in the range of
    '-PI to PI radians (-180 to 180 degrees)
    '==============================================================
    'NOTE the position of Y and X arguments
    'This keeps atan2 function same as other language versions
    '==============================================================
  If x = 0 Then
      If y < 0 Then
            atan2 = -1.5707963267948967
      Else
            atan2 = 1.5707963267948967
      End If
  Else
        chk = atn(y/x)
      If x < 0 Then
          If y < 0 Then
                chk = chk - 3.1415926535897932
          Else
                chk = chk + 3.1415926535897932
          End If
      End If
        atan2 = chk
  End If
    'thanks Andy Amaya
End Function
 

User IP Logged

Q: "And if I took your codes and compile them, and sell them for a profit"?
A: Go ahead. I had my share of good then I coded it for fun, if you can make better use of it - please do.
(enjoying JB 1.01 on WinXP, netbook and desktop)
tsh73
JB-Supporter


member is offline

Avatar




PM

Gender: Male
Posts: 3545
xx Re: color picker
« Reply #10 on: May 17th, 2017, 3:52pm »

Found old code of mine doing HSV_2_RGB
Inserted it into color triangle - looks good
Takes about same amount of time (2 sec)

(as to how make rotated triangle, I have no idea )
Code:
nomainwin

'random hew
h = int(rnd(0)*360)
'h=0    'for red

open "Random hew=";h for graphics as #gr
#gr "down"
#gr "trapclose [quit]"

t0=time$("ms")
Jmax = 100*sqr(3)/2
for i = 1 to 100    'horiz
    SCAN
    y=int(abs(i-50)*sqr(3)) 'prevents jagged bottom
    '#gr "set ";i;" ";y
    cmd$ = ""
    for j = y to Jmax   'vert, up is most saturated (255 0 0)
        '#gr "color ";int(rnd(0)*255);" ";int(rnd(0)*255);" ";int(rnd(0)*255)
        '#gr "set ";int(i);" ";int(j)
        's is distance from lower right corner, here 0..100
        'v from lower left
        'should be 0..1
        s= sqr((i-100)^2+(j-Jmax)^2)/100
        v= sqr(i^2+(j-Jmax)^2)/100
        gosub [HSV_2_RGB]
        'build long string - no speed up for JB/LB (but 1.5x faster for LBB)
        'cmd$ = cmd$;";";"color ";RGB$
        'cmd$ = cmd$;";";"set ";int(i);" ";int(j)
        #gr "color ";RGB$
        #gr "set ";int(i);" ";int(j)
    next
    'print left$(cmd$, 1000)
    '#gr mid$(cmd$,2)
next
#gr "flush"

dt = time$("ms")-t0
notice "Time taken";chr$(13); dt;" ms"    '422 ms without color change, 2096 with random colors

wait

[quit]
    close #gr
    end

[HSV_2_RGB]
'ref from Wikipedia
'http://en.wikipedia.org/wiki/HSL_and_HSV
    'Input: (h,s,v)
    'h in the range [0, 360), indicating the angle, in degrees of the hue
    's and v varying between 0 and 1, representing the saturation and value, respectively
    'Output: r,g,b  [0,1]
    'and to be useful, R G B [0 255]
    'or to JB RGB$ as "R G B" string.

    hi = int(h/60) mod 6
    f = h/60 -  int(h/60)
    p = v*(1-s)
    q= v*(1-f*s)
    t = v*(1-(1-f)*s)
'    print hi,
    select case hi
    case 0
        r = v: g = t: b = p
    case 1
        r = q: g = v: b = p
    case 2
        r = p: g = v: b = t
    case 3
        r = p: g = q: b = v
    case 4
        r = t: g = p: b = v
    case 5
        r = v: g = p: b = q
    end select
    R = int(r*255)
    G = int(g*255)
    B = int(b*255)
    RGB$= R;" ";G;" ";B
return
 
User IP Logged

Q: "And if I took your codes and compile them, and sell them for a profit"?
A: Go ahead. I had my share of good then I coded it for fun, if you can make better use of it - please do.
(enjoying JB 1.01 on WinXP, netbook and desktop)
zzz000abc
Full Member
ImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 245
xx Re: color picker
« Reply #11 on: May 18th, 2017, 12:32am »

Quote:
and speed color circle part about 20x
* by decreasing "f" from 24 to 2 (parts single degree splitted by)
- test shows that 1 leaves some gaps but 2 is enogh for smooth picture

thank you tsh,
for your swift moves.
that part I have taken from my code for color circle as it is. I made the fine divisions (f=24)to maximize the color variation there and it kept it aside to work on it again later.

Quote:
I have no idea about how it goes for other hews,
(need to make/find somewhere HSL/HSV color)

I went through wiki on hsv and after that again ran gtk program learnt some thing.
here are my observations:
we have three colors combination always say A,B,C with variable values.
I call most dominating one(with largest value among three) A ,less dominant C ,remaining one B.
we have a traingle with 3 vertices the one with pointer I call CV,bright one
BV,dark one DV and the small circle movable over triangle cp.
now keeping cp over CV and rotate the traingle you find Saturation always 100%.Hue is angle described by CV.when cp is BV Value is 100% and when it is on DV it is 0.
with cp on CV when trinagle is rotated you can notice always the color C is zero.AB change their values.
to increase Value(to brighten) increase the value of C but it should not go over B .to darken decrease the value of AB but it should not under C.
so
1.C is zero saturataion 100%. C is non zero it less than 100%.
2.when A=B=C=255 Value is 100%. When A=B=C=0 Value is 0.
3.Hue is simply angle made by the triangle.

Quote:
(as to how make rotated triangle, I have no idea )


we have an equilateral (equiangular triangle),having same centre of the circle.
being symmetric the lines drawn to it's vertices from the centre(say r1,r2,r3; r1=r2=r3) trisect the circle.
if r1,makes x degrees the remaing two make x+60 and x+120.
just run the loop from x=0 to 360 to rotate.
the leg in my code actually not the leg of the triangle but refers to radius ( proportional to leg)
« Last Edit: May 18th, 2017, 12:34am by zzz000abc » User IP Logged

zzz000abc
Full Member
ImageImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 245
xx Re: color picker
« Reply #12 on: May 18th, 2017, 06:48am »

here is version 2A.
Code:
             nomainwin
             pi=3.14159265:ex=0
      ww=DisplayWidth/2
      wh=DisplayHeight/2
        WindowWidth=ww
        WindowHeight=wh
      graphicbox #1.gb 0,0,ww/2,ww/2
         textbox #1.tb1 ww/2+10,0,100,30
         textbox #1.tb2 ww/2+10+100+10,0,100,30
         textbox #1.tb3 ww/2+10+200+20,0,100,30
        texteditor #1.te1 ww/2+10,80,ww/3,50
        button #1.bt1 "save",[save],UR,20,80

        textbox #1.tb4 ww/2+10,150,300,40
        textbox #1.tb5 ww/2+10,150+70,300,40
        textbox #1.tb6 ww/2+10,150+140,300,40
      open"JB color pick"for window as#1
      #1 "trapclose [quit]"
          dc=(atn(1))/45
          xx=ww/4:yy=wh/3-20'centre
          leg=ww/6:stk=25 'leg and stroke lengths
           clr1$="blue":clr2$="white"
          leg=100
        call cring xx,yy,leg,0,0
          leg=leg-25
        call try60 xx,yy,i,leg,stk,clr1$,sclr$
        sktclr$(1)=" 255 0 0"
            #1.tb1 "!font tahoma 12":#1.tb1 "  red"
            #1.tb2 "!font tahoma 12":#1.tb2 " green"
            #1.tb3 "!font tahoma 12":#1.tb3 "  blue"

               #1.tb4 "!font tahoma 15"
               #1.tb5 "!font tahoma 15"
               #1.tb6 "!font tahoma 15"
               #1.te1 "!font tahoma 15"
         #1.gb "when leftButtonUp [mup] "
        wait
     [mup]
        mx=MouseX:my=MouseY
        Dy=yy-my:Dx=mx-xx
        ang=atan2(Dy,Dx)
        r1=Dx/cos(ang)
        if ang<0 then ang=2*pi+ang
      if r1>=leg and r1<=leg+stk then
            sclr$=sktclr$(1)
            call cring xx,yy,leg,1,(360-ang/dc)
            call try60 xx,yy,i,leg,stk,clr2$,sclr$
            sclr$="black"
            call try60 xx,yy,ang/dc,leg,stk,clr1$,sclr$
            i=ang/dc
           tbclr$=sktclr$(1)
           end if
           r=int(val(word$(tbclr$,1)))
           g=int(val(word$(tbclr$,2)))
           b=int(val(word$(tbclr$,3)))
           mf=255/max(r,g,b)
           rb=mf*r:gb=mf*g:bb=mf*b:rd=r/2:gd=g/2:bd=b/2
            #1.gb "color ";abs(240-r);" ";abs(240-g);" ";abs(240-b)
            #1.gb "backcolor ";rb;" ";gb;" ";bb
            #1.gb "up;goto 80 300;down;circlefilled 20;flush"
            #1.gb "backcolor ";r;" ";g;" ";b
            #1.gb "up;goto 180 290;down;circlefilled 40;flush"
            #1.gb "backcolor ";rd;" ";gd;" ";bd
            #1.gb "up;goto 280 300;down;circlefilled 20;flush"
            #1.gb  "backcolor white"
if 60<mx and mx<100 and 280<my and my<320 then r=rb:g=gb:b=bb
if 260<mx and mx<300 and 280<my and my<320 then r=rd:g=gd:b=bd
                r=int(r):g=int(g):b=int(b)
                #1.tb1 "   ";r
                #1.tb2 "   ";g
                #1.tb3 "   ";b
             #1.tb4 "color ";r;"  ";g;"  ";b
             #1.tb5 "backcolor ";r;"  ";g;"  ";b
             #1.tb6 "fill ";r;"  ";g;"  ";b

      'end if
        wait
        [save]
        #1.te1 " ";r;"  ";g;"  ";b
        wait
      [quit]
      close #1
      end
      sub try60 x0,y0,ang0,leg,stk,clr$,sclr$
              dc=(atn(1))/45  :pi=4*atn(1)
            rd1=(ang0)*dc
            rd2=(ang0+60)*dc
            rd3=(ang0+120)*dc
                 x1=x0+leg*cos(rd1)
                 y1=y0-leg*sin(rd1)
              x2=x0-leg*cos(rd2)
              y2=y0+leg*sin(rd2)
                x3=x0+leg*cos(rd3)
                y3=y0-leg*sin(rd3)
             x11=x0+(leg+stk)*cos(rd1)
             y11=y0-(leg+stk)*sin(rd1)
             x22=x0+(leg+6)*cos(rd1)
             y22=y0-(leg+6)*sin(rd1)
               #1.gb "discard;color ";clr$
               #1.gb "down;size 2;line ";x1;" ";y1;" ";x2;" ";y2
               #1.gb "line ";x1;" ";y1;" ";x3;" ";y3
               #1.gb "line ";x2;" ";y2;" ";x3;" ";y3
            if sclr$<>"" then #1.gb "size 3;color ";sclr$
              #1.gb "line ";x11;" ";y11;" ";x22;" ";y22;"; flush"
              #1.gb "color ";clr$
      end sub

      sub cring x0,y0,rd,s,ang
            f=24:t=1/f:k=255/120:k=k/f
            r=255:dc=atn(1)/45:rd2=rd-22
          for i=0 to 360 step t
              x=x0+rd*cos(i*dc):y=y0+rd*sin(i*dc)
              xx=x0+rd2*cos(i*dc):yy=y0+rd2*sin(i*dc)
                if i>0 and i<60 then r=r-0.5*k: g=g+1.5*k
                if i>60 and i<120 then r=r-1.5*k:g=g+0.5*k
                if i>120 and i<180 then g=g-0.5*k: b=b+1.5*k
                if i>180 and i<240 then g=g-1.5*k:b=b+0.5*k
                if i>240 and i<300 then b=b-0.5*k: r=r+1.5*k
                if i>300 and i<360 then b=b-1.5*k:r=r+0.5*k
                    if s=1 then goto[skip1]
                #1.gb "discard;down"
                #1.gb "size 2;color ";r;" ";g;" ";b
                #1.gb "line ";x0;" ";y0;" ";x;" ";y
                #1.gb "color white;size 4;line ";x0;" ";y0;" ";xx;" ";yy;";flush"
                   goto[skip2]
             [skip1]
                sktclr$(1)=using("###",r)+" "+using("###",g)+" "+using("###",b)
                if abs(ang-i)<0.03 then exit for
             [skip2]
          next
      end sub
      Function atan2(y,x)
            'atan2 is a function which determines the angle between points
            'x1, y1 and x2, y2. The angle returned is in radians
            'The angle returned is always in the range of
            '-PI to PI radians (-180 to 180 degrees)
            '==============================================================
            'NOTE the position of Y and X arguments
            'This keeps atan2 function same as other language versions
            '==============================================================
          If x = 0 Then
              If y < 0 Then
                    atan2 = -1.5707963267948967
              Else
                    atan2 = 1.5707963267948967
              End If
          Else
                chk = atn(y/x)
              If x < 0 Then
                  If y < 0 Then
                        chk = chk - 3.1415926535897932
                  Else
                        chk = chk + 3.1415926535897932
                  End If
              End If
                atan2 = chk
          End If
            'thanks Andy Amaya
      End Function
      function max(rr,gg,bb)
      if rr>=gg and rr>=bb then mm=rr
      if gg>=rr and gg>=bb then mm=gg
      if bb>=rr and bb>=gg then mm=bb
      max=mm
      end function
 

click on color ring to select a color.
click one of the circles to select shade.

Edit1.
a note about version . for shading part I thought of 3 ways.A.using circles
as shown in the above code. B.using a second color ring. C.gtk triangle method. so here 2A means(atleast for me) version 2 following method A for shading.
« Last Edit: May 18th, 2017, 07:02am by zzz000abc » User IP Logged

tsh73
JB-Supporter


member is offline

Avatar




PM

Gender: Male
Posts: 3545
xx Re: color picker
« Reply #13 on: May 18th, 2017, 3:46pm »

Ok I made shaded triangle rotate
I used size 2 points to speed it up
User Image
Code:
nomainwin

sq32=sqr(3)/2
pi = acs(-1)

open "Any hue" for graphics as #gr
#gr "down"
#gr "trapclose [quit]"
#gr "size 2"    'size 2: to speed up

cx=150
cy=100+50/sq32
Jmax = 100*sq32

for h = 0 to 360
    'color circle
    a=0-h*pi/180
    cc=cos(a)
    ss=sin(a)
    s=1:v=1
    gosub [HSV_2_RGB]
    #gr "color ";RGB$
    #gr "line ";cx+cc*rr;" ";cy+ss*rr;"  ";cx+cc*(rr+12);" ";cy+ss*(rr+12)

    if h mod 30 <>0 then goto [skip1]    'only every 30 degrees
    'color triangle
    'clear old triangle
    #gr "place ";cx;" ";cy
    rr=int(50/sq32)
    #gr "color white"
    #gr "circlefilled ";rr
    'draw new one
    a=0-h*pi/180+pi/2
    cc=cos(a)
    ss=sin(a)
    for i = 0-rr to rr step 2    'step 2: size 2: to speed up
        for j = 0-rr to rr step 2    '--//--
            'rotate and see if it goes into triangle
            x=i+cx
            y=j+cy
            gosub [rotate]  'rotate backwards
            'check if rotated point is in triangle
            if (abs(xn-cx)<=50) and (yn-100 <= Jmax) and (yn-100 >= int(abs(xn-cx)*sqr(3))) then
                'then calculate color by xn yn and plot it
                s= sqr(((xn-cx)-50)^2+(yn-100-Jmax)^2)/100
                v= sqr(((xn-cx)+50)^2+(yn-100-Jmax)^2)/100
                gosub [HSV_2_RGB]
                #gr "color ";RGB$
                #gr "set ";int(x);" ";int(y)
            end if
        next
    next
    #gr "flush"

    timer 1000, [www]    'wait a second
    wait
    [www] timer 0

[skip1]
next

wait

[quit]
    close #gr
    end

[HSV_2_RGB]
'ref from Wikipedia
'http://en.wikipedia.org/wiki/HSL_and_HSV
    'Input: (h,s,v)
    'h in the range [0, 360), indicating the angle, in degrees of the hue
    's and v varying between 0 and 1, representing the saturation and value, respectively
    'Output: r,g,b  [0,1]
    'and to be useful, R G B [0 255]
    'or to JB RGB$ as "R G B" string.

    hi = int(h/60) mod 6
    f = h/60 -  int(h/60)
    p = v*(1-s)
    q= v*(1-f*s)
    t = v*(1-(1-f)*s)
'    print hi,
    select case hi
    case 0
        r = v: g = t: b = p
    case 1
        r = q: g = v: b = p
    case 2
        r = p: g = v: b = t
    case 3
        r = p: g = q: b = v
    case 4
        r = t: g = p: b = v
    case 5
        r = v: g = p: b = q
    end select
    R = int(r*255)
    G = int(g*255)
    B = int(b*255)
    RGB$= R;" ";G;" ";B
return

[rotate]
    'rot (x,y) by a around (cx, cy)
    'cc=cos(a)
    'ss=sin(a)
    xn=(x-cx)*cc+(y-cy)*ss+cx
    yn=0-((x-cx)*ss-(y-cy)*cc)+cy
return
 
User IP Logged

Q: "And if I took your codes and compile them, and sell them for a profit"?
A: Go ahead. I had my share of good then I coded it for fun, if you can make better use of it - please do.
(enjoying JB 1.01 on WinXP, netbook and desktop)
Pages: 1  Notify Send Topic Print
« Previous Topic | Next Topic »

Conforums Terms of Service | Membership Rules | Home | Search | Recent Posts | Notification | Format Your Message | Installation FAQ

Donate $6.99 for 50,000 Ad-Free Pageviews!


This forum powered for FREE by Conforums ©
Sign up for your own Free Message Board today!
Terms of Service | Privacy Policy | Conforums Support | Parental Controls