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