We can use the Processing function: get( x, y); to find the HSB color of any pixel on the canvas. If we combine that with our color-wheel, we can make a simple version of the Adobe Color Theme tool.
For any selected pixel, which we identify as having the current color, we can find the complimentary color by finding a hue value on the opposite side of the color-wheel.
Find complimentary color by adding 180 degrees to _hue, and use modulus 360 to constrain color values to 0-359 range
float _complimentHue = (_hue + 180) % 360;
Finally, create a set of rectangles filled with sat, bright variations of the curColor and complimentHue
Color Palette Program
////Global Variablesfloat sat, bright;///for initializationvoidsetup() {size( 800,800);colorMode(HSB,360,100,100);background(0); sat =100; //initialize to full value saturation bright =100;noStroke();}voiddraw() {if (mousePressed) { //when mousePressed, show Saturation versionsatGradientColorWheel(600); } else { //otherwise show brightness variation versionbrightGradientColorWheel(600); }//create complimentary colorPalette using get( ) function to find color of pixel at mouse position color curColor =get( mouseX, mouseY);createColorPalette( curColor,0,0); //createColorPalette with currentColor under mouse, at 0,0}voidcreateColorPalette(color curColor,int x,int y) {float _hue =hue(curColor);float _sat =saturation(curColor);float complimentHue = (_hue +180)%360;fill(_hue, _sat *.6,70); //first one darkest, dullestrect( x, y,100,100);fill(_hue, _sat *.7,100 );//second one, brighter than firstrect( x +100, y,100,100);fill(curColor);rect( x+200, y,100,100); //current one in the middlefill( complimentHue, _sat,70); //darker complimentrect( x+300, y,100,100);fill( complimentHue, _sat*.8,100); //lighter complimentrect( x+400, y,100,100);} //end colorPalettevoidsatGradientColorWheel( float size) { bright=100; //make sure bright and sat start at full values for outer circlefor ( int i=100; i>0; i -=5) { sat=i;drawColorWheel(size * i /100.0 ); }}voidbrightGradientColorWheel(float size) { sat=100; //make sure bright and sat start at full values for outer circlefor ( int i=100; i>0; i -=5) { bright=i;drawColorWheel(size * i /100.0 ); }}//draws a full color wheelvoiddrawColorWheel( float size ) {float angleSize=10; //declare and intialize local variablesfloat startDegree=0; //used for drawing arc, value changes in loop after each arc is drawnint numSlices =int(360/angleSize); ///loop maximum value: how many slices to draw?for (int i=0; i < numSlices; i++) {float endDegree = startDegree + angleSize;float hue = startDegree + ( angleSize /2); //calculate hue for middle of arcfill( hue, sat, bright); //set fillarc( width/2, height/2, size, size, radians(startDegree), radians( endDegree)); startDegree += angleSize; //change startDegree for each new slice to be drawn }}