Nested foreach functioning unpredictably when drawing colored spheres in 3 dimensions

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP











up vote
7
down vote

favorite
3












I'm visualising color systems with TikZ to my students, and here I'm creating a 3D set of axes which represent red, green, blue and their combinations as shaded spheres.



RGB space



For some reason, the result looks alright on the Blue axis, but doesn't work as expected on Green and Red axes as when their values are increased the spheres stay gray. Where's the problem?



I've taken care that everything is represented in code in the same order, RGB. Code first sets up some variables about axes (x, y, z), then step size/distance between spheres and then the max value for assumed 8-bit color, 255.



The point is that the nested for eaches go through all integer values between 0–255 for red, green and blue (all combinations), the second tikzmath creates scaled variables to be used with color information, and then with every pass a shaded sphere is drawn with the proper color and positioning on the axes.



documentclassmemoir
usepackagetikz
usetikzlibrarymath

begindocument

begintikzpicture[scale=0.03]
tikzmathx = 300; y = x; z=x; step=51;maxvalue=255; %optimal step size 51
draw[->, very thick, red] (0,0,0) -- (x,0,0) node[right]R;
draw[->, very thick, green] (0,0,0) -- (0,y,0) node[above]G;
draw[->, very thick, blue] (0,0,0) -- (0,0,z) node[below left]B;

foreach red in 0,step,...,maxvalue
foreach green in 0,step,...,maxvalue
foreach blue in 0,step,...,maxvalue

tikzmathreds=red/maxvalue*100;greens=green/maxvalue*100;blues=blue/maxvalue*100;

shadedraw[ball color=red!reds!green!greens!blue!blues!] (red,green,blue) circle [radius=10cm];




endtikzpicture

enddocument






share|improve this question
























    up vote
    7
    down vote

    favorite
    3












    I'm visualising color systems with TikZ to my students, and here I'm creating a 3D set of axes which represent red, green, blue and their combinations as shaded spheres.



    RGB space



    For some reason, the result looks alright on the Blue axis, but doesn't work as expected on Green and Red axes as when their values are increased the spheres stay gray. Where's the problem?



    I've taken care that everything is represented in code in the same order, RGB. Code first sets up some variables about axes (x, y, z), then step size/distance between spheres and then the max value for assumed 8-bit color, 255.



    The point is that the nested for eaches go through all integer values between 0–255 for red, green and blue (all combinations), the second tikzmath creates scaled variables to be used with color information, and then with every pass a shaded sphere is drawn with the proper color and positioning on the axes.



    documentclassmemoir
    usepackagetikz
    usetikzlibrarymath

    begindocument

    begintikzpicture[scale=0.03]
    tikzmathx = 300; y = x; z=x; step=51;maxvalue=255; %optimal step size 51
    draw[->, very thick, red] (0,0,0) -- (x,0,0) node[right]R;
    draw[->, very thick, green] (0,0,0) -- (0,y,0) node[above]G;
    draw[->, very thick, blue] (0,0,0) -- (0,0,z) node[below left]B;

    foreach red in 0,step,...,maxvalue
    foreach green in 0,step,...,maxvalue
    foreach blue in 0,step,...,maxvalue

    tikzmathreds=red/maxvalue*100;greens=green/maxvalue*100;blues=blue/maxvalue*100;

    shadedraw[ball color=red!reds!green!greens!blue!blues!] (red,green,blue) circle [radius=10cm];




    endtikzpicture

    enddocument






    share|improve this question






















      up vote
      7
      down vote

      favorite
      3









      up vote
      7
      down vote

      favorite
      3






      3





      I'm visualising color systems with TikZ to my students, and here I'm creating a 3D set of axes which represent red, green, blue and their combinations as shaded spheres.



      RGB space



      For some reason, the result looks alright on the Blue axis, but doesn't work as expected on Green and Red axes as when their values are increased the spheres stay gray. Where's the problem?



      I've taken care that everything is represented in code in the same order, RGB. Code first sets up some variables about axes (x, y, z), then step size/distance between spheres and then the max value for assumed 8-bit color, 255.



      The point is that the nested for eaches go through all integer values between 0–255 for red, green and blue (all combinations), the second tikzmath creates scaled variables to be used with color information, and then with every pass a shaded sphere is drawn with the proper color and positioning on the axes.



      documentclassmemoir
      usepackagetikz
      usetikzlibrarymath

      begindocument

      begintikzpicture[scale=0.03]
      tikzmathx = 300; y = x; z=x; step=51;maxvalue=255; %optimal step size 51
      draw[->, very thick, red] (0,0,0) -- (x,0,0) node[right]R;
      draw[->, very thick, green] (0,0,0) -- (0,y,0) node[above]G;
      draw[->, very thick, blue] (0,0,0) -- (0,0,z) node[below left]B;

      foreach red in 0,step,...,maxvalue
      foreach green in 0,step,...,maxvalue
      foreach blue in 0,step,...,maxvalue

      tikzmathreds=red/maxvalue*100;greens=green/maxvalue*100;blues=blue/maxvalue*100;

      shadedraw[ball color=red!reds!green!greens!blue!blues!] (red,green,blue) circle [radius=10cm];




      endtikzpicture

      enddocument






      share|improve this question












      I'm visualising color systems with TikZ to my students, and here I'm creating a 3D set of axes which represent red, green, blue and their combinations as shaded spheres.



      RGB space



      For some reason, the result looks alright on the Blue axis, but doesn't work as expected on Green and Red axes as when their values are increased the spheres stay gray. Where's the problem?



      I've taken care that everything is represented in code in the same order, RGB. Code first sets up some variables about axes (x, y, z), then step size/distance between spheres and then the max value for assumed 8-bit color, 255.



      The point is that the nested for eaches go through all integer values between 0–255 for red, green and blue (all combinations), the second tikzmath creates scaled variables to be used with color information, and then with every pass a shaded sphere is drawn with the proper color and positioning on the axes.



      documentclassmemoir
      usepackagetikz
      usetikzlibrarymath

      begindocument

      begintikzpicture[scale=0.03]
      tikzmathx = 300; y = x; z=x; step=51;maxvalue=255; %optimal step size 51
      draw[->, very thick, red] (0,0,0) -- (x,0,0) node[right]R;
      draw[->, very thick, green] (0,0,0) -- (0,y,0) node[above]G;
      draw[->, very thick, blue] (0,0,0) -- (0,0,z) node[below left]B;

      foreach red in 0,step,...,maxvalue
      foreach green in 0,step,...,maxvalue
      foreach blue in 0,step,...,maxvalue

      tikzmathreds=red/maxvalue*100;greens=green/maxvalue*100;blues=blue/maxvalue*100;

      shadedraw[ball color=red!reds!green!greens!blue!blues!] (red,green,blue) circle [radius=10cm];




      endtikzpicture

      enddocument








      share|improve this question











      share|improve this question




      share|improve this question










      asked Aug 26 at 4:41









      JoonasD6

      937




      937




















          1 Answer
          1






          active

          oldest

          votes

















          up vote
          8
          down vote



          accepted










          I do not know precisely what went wrong but I guess that there is some sort of unitarity problem when the fractions do not add up to 100. Here is some other method that does what I think you want.



          documentclassmemoir
          usepackagetikz
          usetikzlibrarymath

          begindocument

          begintikzpicture[scale=0.03]
          tikzmathx = 300; y = x; z=x; step=51;maxvalue=255; %optimal step size 51
          draw[->, very thick, red] (0,0,0) -- (x,0,0) node[right]R;
          draw[->, very thick, green] (0,0,0) -- (0,y,0) node[above]G;
          draw[->, very thick, blue] (0,0,0) -- (0,0,z) node[below left]B;

          foreach red in 0,step,...,maxvalue
          foreach green in 0,step,...,maxvalue
          foreach blue in 0,step,...,maxvalue

          tikzmathreds=(red/maxvalue)*255;
          greens=(green/maxvalue)*255;blues=(blue/maxvalue)*255;
          definecolormycolorRGBreds,greens,blues

          shadedraw[ball color=mycolor] (red,green,blue) circle [radius=10cm];




          endtikzpicture
          enddocument


          enter image description here



          EDIT: Appended a version with unique color names. With all these different viewers around one never knows. The output is the same.



          documentclassmemoir
          usepackagetikz
          usetikzlibrarymath

          begindocument

          begintikzpicture[scale=0.03]
          tikzmathx = 300; y = x; z=x; step=51;maxvalue=255; %optimal step size 51
          draw[->, very thick, red] (0,0,0) -- (x,0,0) node[right]R;
          draw[->, very thick, green] (0,0,0) -- (0,y,0) node[above]G;
          draw[->, very thick, blue] (0,0,0) -- (0,0,z) node[below left]B;

          foreach red in 0,step,...,maxvalue
          foreach green in 0,step,...,maxvalue
          foreach blue in 0,step,...,maxvalue

          tikzmathreds=(red/maxvalue)*255;
          greens=(green/maxvalue)*255;blues=(blue/maxvalue)*255;
          definecolormycolor-reds-greens-bluesRGBreds,greens,blues

          shadedraw[ball color=mycolor-reds-greens-blues] (red,green,blue) circle [radius=10cm];




          endtikzpicture
          enddocument





          share|improve this answer






















          • That is very close to how I initially tried to color the spheres; I thought definecolor didn't work for redefining as well? I'll give this one a shot (and might remove the maxvalue stuff altogether if I end up doing this completely in 8 bit anyway); thank you very much!
            – JoonasD6
            Aug 26 at 15:36






          • 1




            Did before I read your plea. You deserve it. Just had to test a bit further first. :)
            – JoonasD6
            Aug 26 at 15:43











          • @JoonasD6 Thanks! I added a second version with unique color names.
            – marmot
            Aug 26 at 15:52










          Your Answer







          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "85"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          convertImagesToLinks: false,
          noModals: false,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













           

          draft saved


          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f447747%2fnested-foreach-functioning-unpredictably-when-drawing-colored-spheres-in-3-dime%23new-answer', 'question_page');

          );

          Post as a guest






























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          8
          down vote



          accepted










          I do not know precisely what went wrong but I guess that there is some sort of unitarity problem when the fractions do not add up to 100. Here is some other method that does what I think you want.



          documentclassmemoir
          usepackagetikz
          usetikzlibrarymath

          begindocument

          begintikzpicture[scale=0.03]
          tikzmathx = 300; y = x; z=x; step=51;maxvalue=255; %optimal step size 51
          draw[->, very thick, red] (0,0,0) -- (x,0,0) node[right]R;
          draw[->, very thick, green] (0,0,0) -- (0,y,0) node[above]G;
          draw[->, very thick, blue] (0,0,0) -- (0,0,z) node[below left]B;

          foreach red in 0,step,...,maxvalue
          foreach green in 0,step,...,maxvalue
          foreach blue in 0,step,...,maxvalue

          tikzmathreds=(red/maxvalue)*255;
          greens=(green/maxvalue)*255;blues=(blue/maxvalue)*255;
          definecolormycolorRGBreds,greens,blues

          shadedraw[ball color=mycolor] (red,green,blue) circle [radius=10cm];




          endtikzpicture
          enddocument


          enter image description here



          EDIT: Appended a version with unique color names. With all these different viewers around one never knows. The output is the same.



          documentclassmemoir
          usepackagetikz
          usetikzlibrarymath

          begindocument

          begintikzpicture[scale=0.03]
          tikzmathx = 300; y = x; z=x; step=51;maxvalue=255; %optimal step size 51
          draw[->, very thick, red] (0,0,0) -- (x,0,0) node[right]R;
          draw[->, very thick, green] (0,0,0) -- (0,y,0) node[above]G;
          draw[->, very thick, blue] (0,0,0) -- (0,0,z) node[below left]B;

          foreach red in 0,step,...,maxvalue
          foreach green in 0,step,...,maxvalue
          foreach blue in 0,step,...,maxvalue

          tikzmathreds=(red/maxvalue)*255;
          greens=(green/maxvalue)*255;blues=(blue/maxvalue)*255;
          definecolormycolor-reds-greens-bluesRGBreds,greens,blues

          shadedraw[ball color=mycolor-reds-greens-blues] (red,green,blue) circle [radius=10cm];




          endtikzpicture
          enddocument





          share|improve this answer






















          • That is very close to how I initially tried to color the spheres; I thought definecolor didn't work for redefining as well? I'll give this one a shot (and might remove the maxvalue stuff altogether if I end up doing this completely in 8 bit anyway); thank you very much!
            – JoonasD6
            Aug 26 at 15:36






          • 1




            Did before I read your plea. You deserve it. Just had to test a bit further first. :)
            – JoonasD6
            Aug 26 at 15:43











          • @JoonasD6 Thanks! I added a second version with unique color names.
            – marmot
            Aug 26 at 15:52














          up vote
          8
          down vote



          accepted










          I do not know precisely what went wrong but I guess that there is some sort of unitarity problem when the fractions do not add up to 100. Here is some other method that does what I think you want.



          documentclassmemoir
          usepackagetikz
          usetikzlibrarymath

          begindocument

          begintikzpicture[scale=0.03]
          tikzmathx = 300; y = x; z=x; step=51;maxvalue=255; %optimal step size 51
          draw[->, very thick, red] (0,0,0) -- (x,0,0) node[right]R;
          draw[->, very thick, green] (0,0,0) -- (0,y,0) node[above]G;
          draw[->, very thick, blue] (0,0,0) -- (0,0,z) node[below left]B;

          foreach red in 0,step,...,maxvalue
          foreach green in 0,step,...,maxvalue
          foreach blue in 0,step,...,maxvalue

          tikzmathreds=(red/maxvalue)*255;
          greens=(green/maxvalue)*255;blues=(blue/maxvalue)*255;
          definecolormycolorRGBreds,greens,blues

          shadedraw[ball color=mycolor] (red,green,blue) circle [radius=10cm];




          endtikzpicture
          enddocument


          enter image description here



          EDIT: Appended a version with unique color names. With all these different viewers around one never knows. The output is the same.



          documentclassmemoir
          usepackagetikz
          usetikzlibrarymath

          begindocument

          begintikzpicture[scale=0.03]
          tikzmathx = 300; y = x; z=x; step=51;maxvalue=255; %optimal step size 51
          draw[->, very thick, red] (0,0,0) -- (x,0,0) node[right]R;
          draw[->, very thick, green] (0,0,0) -- (0,y,0) node[above]G;
          draw[->, very thick, blue] (0,0,0) -- (0,0,z) node[below left]B;

          foreach red in 0,step,...,maxvalue
          foreach green in 0,step,...,maxvalue
          foreach blue in 0,step,...,maxvalue

          tikzmathreds=(red/maxvalue)*255;
          greens=(green/maxvalue)*255;blues=(blue/maxvalue)*255;
          definecolormycolor-reds-greens-bluesRGBreds,greens,blues

          shadedraw[ball color=mycolor-reds-greens-blues] (red,green,blue) circle [radius=10cm];




          endtikzpicture
          enddocument





          share|improve this answer






















          • That is very close to how I initially tried to color the spheres; I thought definecolor didn't work for redefining as well? I'll give this one a shot (and might remove the maxvalue stuff altogether if I end up doing this completely in 8 bit anyway); thank you very much!
            – JoonasD6
            Aug 26 at 15:36






          • 1




            Did before I read your plea. You deserve it. Just had to test a bit further first. :)
            – JoonasD6
            Aug 26 at 15:43











          • @JoonasD6 Thanks! I added a second version with unique color names.
            – marmot
            Aug 26 at 15:52












          up vote
          8
          down vote



          accepted







          up vote
          8
          down vote



          accepted






          I do not know precisely what went wrong but I guess that there is some sort of unitarity problem when the fractions do not add up to 100. Here is some other method that does what I think you want.



          documentclassmemoir
          usepackagetikz
          usetikzlibrarymath

          begindocument

          begintikzpicture[scale=0.03]
          tikzmathx = 300; y = x; z=x; step=51;maxvalue=255; %optimal step size 51
          draw[->, very thick, red] (0,0,0) -- (x,0,0) node[right]R;
          draw[->, very thick, green] (0,0,0) -- (0,y,0) node[above]G;
          draw[->, very thick, blue] (0,0,0) -- (0,0,z) node[below left]B;

          foreach red in 0,step,...,maxvalue
          foreach green in 0,step,...,maxvalue
          foreach blue in 0,step,...,maxvalue

          tikzmathreds=(red/maxvalue)*255;
          greens=(green/maxvalue)*255;blues=(blue/maxvalue)*255;
          definecolormycolorRGBreds,greens,blues

          shadedraw[ball color=mycolor] (red,green,blue) circle [radius=10cm];




          endtikzpicture
          enddocument


          enter image description here



          EDIT: Appended a version with unique color names. With all these different viewers around one never knows. The output is the same.



          documentclassmemoir
          usepackagetikz
          usetikzlibrarymath

          begindocument

          begintikzpicture[scale=0.03]
          tikzmathx = 300; y = x; z=x; step=51;maxvalue=255; %optimal step size 51
          draw[->, very thick, red] (0,0,0) -- (x,0,0) node[right]R;
          draw[->, very thick, green] (0,0,0) -- (0,y,0) node[above]G;
          draw[->, very thick, blue] (0,0,0) -- (0,0,z) node[below left]B;

          foreach red in 0,step,...,maxvalue
          foreach green in 0,step,...,maxvalue
          foreach blue in 0,step,...,maxvalue

          tikzmathreds=(red/maxvalue)*255;
          greens=(green/maxvalue)*255;blues=(blue/maxvalue)*255;
          definecolormycolor-reds-greens-bluesRGBreds,greens,blues

          shadedraw[ball color=mycolor-reds-greens-blues] (red,green,blue) circle [radius=10cm];




          endtikzpicture
          enddocument





          share|improve this answer














          I do not know precisely what went wrong but I guess that there is some sort of unitarity problem when the fractions do not add up to 100. Here is some other method that does what I think you want.



          documentclassmemoir
          usepackagetikz
          usetikzlibrarymath

          begindocument

          begintikzpicture[scale=0.03]
          tikzmathx = 300; y = x; z=x; step=51;maxvalue=255; %optimal step size 51
          draw[->, very thick, red] (0,0,0) -- (x,0,0) node[right]R;
          draw[->, very thick, green] (0,0,0) -- (0,y,0) node[above]G;
          draw[->, very thick, blue] (0,0,0) -- (0,0,z) node[below left]B;

          foreach red in 0,step,...,maxvalue
          foreach green in 0,step,...,maxvalue
          foreach blue in 0,step,...,maxvalue

          tikzmathreds=(red/maxvalue)*255;
          greens=(green/maxvalue)*255;blues=(blue/maxvalue)*255;
          definecolormycolorRGBreds,greens,blues

          shadedraw[ball color=mycolor] (red,green,blue) circle [radius=10cm];




          endtikzpicture
          enddocument


          enter image description here



          EDIT: Appended a version with unique color names. With all these different viewers around one never knows. The output is the same.



          documentclassmemoir
          usepackagetikz
          usetikzlibrarymath

          begindocument

          begintikzpicture[scale=0.03]
          tikzmathx = 300; y = x; z=x; step=51;maxvalue=255; %optimal step size 51
          draw[->, very thick, red] (0,0,0) -- (x,0,0) node[right]R;
          draw[->, very thick, green] (0,0,0) -- (0,y,0) node[above]G;
          draw[->, very thick, blue] (0,0,0) -- (0,0,z) node[below left]B;

          foreach red in 0,step,...,maxvalue
          foreach green in 0,step,...,maxvalue
          foreach blue in 0,step,...,maxvalue

          tikzmathreds=(red/maxvalue)*255;
          greens=(green/maxvalue)*255;blues=(blue/maxvalue)*255;
          definecolormycolor-reds-greens-bluesRGBreds,greens,blues

          shadedraw[ball color=mycolor-reds-greens-blues] (red,green,blue) circle [radius=10cm];




          endtikzpicture
          enddocument






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Aug 26 at 15:51

























          answered Aug 26 at 8:40









          marmot

          55.7k461121




          55.7k461121











          • That is very close to how I initially tried to color the spheres; I thought definecolor didn't work for redefining as well? I'll give this one a shot (and might remove the maxvalue stuff altogether if I end up doing this completely in 8 bit anyway); thank you very much!
            – JoonasD6
            Aug 26 at 15:36






          • 1




            Did before I read your plea. You deserve it. Just had to test a bit further first. :)
            – JoonasD6
            Aug 26 at 15:43











          • @JoonasD6 Thanks! I added a second version with unique color names.
            – marmot
            Aug 26 at 15:52
















          • That is very close to how I initially tried to color the spheres; I thought definecolor didn't work for redefining as well? I'll give this one a shot (and might remove the maxvalue stuff altogether if I end up doing this completely in 8 bit anyway); thank you very much!
            – JoonasD6
            Aug 26 at 15:36






          • 1




            Did before I read your plea. You deserve it. Just had to test a bit further first. :)
            – JoonasD6
            Aug 26 at 15:43











          • @JoonasD6 Thanks! I added a second version with unique color names.
            – marmot
            Aug 26 at 15:52















          That is very close to how I initially tried to color the spheres; I thought definecolor didn't work for redefining as well? I'll give this one a shot (and might remove the maxvalue stuff altogether if I end up doing this completely in 8 bit anyway); thank you very much!
          – JoonasD6
          Aug 26 at 15:36




          That is very close to how I initially tried to color the spheres; I thought definecolor didn't work for redefining as well? I'll give this one a shot (and might remove the maxvalue stuff altogether if I end up doing this completely in 8 bit anyway); thank you very much!
          – JoonasD6
          Aug 26 at 15:36




          1




          1




          Did before I read your plea. You deserve it. Just had to test a bit further first. :)
          – JoonasD6
          Aug 26 at 15:43





          Did before I read your plea. You deserve it. Just had to test a bit further first. :)
          – JoonasD6
          Aug 26 at 15:43













          @JoonasD6 Thanks! I added a second version with unique color names.
          – marmot
          Aug 26 at 15:52




          @JoonasD6 Thanks! I added a second version with unique color names.
          – marmot
          Aug 26 at 15:52

















           

          draft saved


          draft discarded















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f447747%2fnested-foreach-functioning-unpredictably-when-drawing-colored-spheres-in-3-dime%23new-answer', 'question_page');

          );

          Post as a guest













































































          Comments

          Popular posts from this blog

          Long meetings (6-7 hours a day): Being “babysat” by supervisor

          What does second last employer means? [closed]

          One-line joke