Applet Code -- Mixing Colors Algebraically



import java.awt.*;
import java.applet.*;
import java.lang.*;

public class ColorTriangle extends Applet
{
       Graphics    sG;

       Graphics    bG;
       Image       bI;

       Color       red      = new Color(255, 0, 0);
       Color       blue     = new Color(0, 0, 255);
       Color       green    = new Color(0, 255, 0);
       Color       black    = new Color(0, 0, 0);
       Color       pick     = new Color(255, 255, 255);

       Polygon     triangle = new Polygon();

       int         redx     = 20;
       int         redy     = 194;

       int         greenx   = 120;
       int         greeny   = 20;

       int         bluex    = 220;
       int         bluey    = 194;

       public void init()
       {
              bI = createImage(this.size().width, this.size().height);
              bG = bI.getGraphics();
              triangle.addPoint(redx, redy);
              triangle.addPoint(bluex, bluey);
              triangle.addPoint(greenx, greeny);
              triangle.addPoint(redx, redy);
              drawscreen();
       }

       public void paint(Graphics g)
       {
              g.drawImage(bI, 0, 0, this);
              sG = getGraphics();
       }

       public void update(Graphics g)
       {
              g.drawImage(bI, 0, 0, this);
       }

       public void drawscreen()
       {
              bG.setColor(black);
              bG.fillRect(0, 0, 240, 213);
              bG.setColor(pick);
              bG.fillPolygon(triangle);
              bG.setColor(red);
              bG.fillOval(redx - 5, redy - 5, 11, 11);
              bG.setColor(blue);
              bG.fillOval(bluex - 5, bluey - 5, 11, 11);
              bG.setColor(green);
              bG.fillOval(greenx - 5, greeny - 5, 11, 11);
              
       }

       public boolean mouseDrag(Event evt, int mx, int my)
       {
              mouseDown(evt, mx, my);
              return true;
       }

       public boolean mouseDown(Event evt, int mx, int my)
       {
              double      x, y, work;
              double      cred, cblue, cgreen;
              int         ired, iblue, igreen;

              if((mx - redx) * (mx - redx) + (my - redy) * (my - redy) < 8)
              {
                     mx = redx;
                     my = redy;
              }
              if((mx - bluex) * (mx - bluex) + (my - bluey) * (my - bluey) < 8)
              {
                     mx = bluex;
                     my = bluey;
              }
              if((mx - greenx) * (mx - greenx) + (my - greeny) * (my - greeny) < 8)
              {
                     mx = greenx;
                     my = greeny;
              }

              x = 1.0 * mx;
              y = 1.0 * my;

              cred = 1 + ((greeny - redy) * (redx - x) - 
                         (greenx - redx) * (redy - y)) / 
                         (-(bluey * greenx) + bluex * greeny + bluey * redx - 
                         greeny * redx - bluex * redy + greenx * redy) - 
                         ((bluey - redy) * ((greeny - redy) * (redx - x) - 
                         (greenx - redx) * (redy - y))) / 
                         ((greeny - redy) * (-(bluey * greenx) + bluex * greeny + 
                         bluey * redx - greeny * redx - bluex * redy + 
                         greenx * redy)) + (redy - y)/(greeny - redy);

             cgreen = ((bluey - redy) *  ((greeny - redy) * (redx - x) - 
                      (greenx - redx) * (redy - y))) / 
                      ((greeny - redy) * (-(bluey * greenx) + bluex * greeny + 
                      bluey * redx - greeny * redx - bluex * redy + 
                      greenx * redy)) + (redy - y)/(greeny - redy);

             cblue =  -(((greeny - redy) * (redx - x) - 
                      (greenx - redx) * (redy - y)) / 
                      (-(bluey * greenx) + bluex * greeny + bluey * redx - 
                      greeny * redx - bluex * redy + greenx * redy));

             cgreen = -cgreen;

             if((cred < 0)   || (cred > 1)  ||
                (cblue < 0)  || (cblue > 1) ||
                (cgreen < 0) || (cgreen > 1))
             {
                 return true;
             }
                 

              ired = (int) java.lang.Math.round(255 * cred);
              iblue = (int) java.lang.Math.round(255 * cblue);
              igreen = (int) java.lang.Math.round(255 * cgreen);
              pick = new Color(ired, igreen, iblue); 

              drawscreen();
              bG.setColor(black);
              bG.fillOval(mx - 3, my - 3, 7, 7);
              sG.drawImage(bI, 0, 0, this);
              return true;
       }

}


Copyright c 1995 by Frank Wattenberg, Department of Mathematics, Montana State University, Bozeman, MT 59717