/*
To do Rhodes' enzyme kinetics - single substrate, uncompetitive inhibition, Eadie-Hofstee plot
Modified - 07/2000 DR
*/

import java.awt.*;
import java.applet.Applet;

public class model extends Applet
{
TextField  textMX1, textMY1, textMX2, textMY2, textS1, textS2, textS3, textS4, textS5, textS6, textV01, textV02, textV03, textV04, textV05, textV06, textV11, textV12, textV13, textV14, textV15, textV16, textV21, textV22, textV23, textV24, textV25, textV26, textV31, textV32, textV33, textV34, textV35, textV36;
TextField  textKm0, textKm1, textKm2, textKm3, textVmax0, textVmax1, textVmax2, textVmax3;
Label 	 labelKm0, labelKm1, labelKm2, labelKm3, labelVmax0, labelVmax1, labelVmax2, labelVmax3;  
Label      endXAxis1, endXAxis2;
Label      endYAxis1, endYAxis2;
Label      startXAxis1, startXAxis2;
Label      startYAxis1, startYAxis2;
Label      gLabel1, gLabel2;
Label      xLabel1, xLabel2, yLabel1, yLabel2; 
Label     labelV01, labelV02, labelV03, labelV04, labelV05, labelV06;
Label     labelV11, labelV12, labelV13, labelV14, labelV15, labelV16;
Label     labelV21, labelV22, labelV23, labelV24, labelV25, labelV26;
Label     labelV31, labelV32, labelV33, labelV34, labelV35, labelV36;
Label     labelS1, labelS2, labelS3, labelS4, labelS5, labelS6;
Label     labelMX1, labelMX2, labelMY1, labelMY2;
Label     labelI0, labelI1, labelI2, labelI3;
Button     bDoGraph;
Graph		leftGraph, rightGraph;
static final int GraphSize = 200;

public void init() {

// Arrange the user interface using a gridbag.
GridBagConstraints gbc;
GridBagLayout  gb;
gb = new GridBagLayout();
setLayout(gb); // set the layout for the whole applet

// add the data entry fields
Label labelS1 = new Label("S1:");
textS1 = new TextField("1.500", 4);
Label labelS2 = new Label("S2:");
textS2 = new TextField("1.000", 4);
Label labelS3 = new Label("S3:");
textS3 = new TextField("0.500", 4);
Label labelS4 = new Label("S4:");
textS4 = new TextField("0.250", 4);
Label labelS5 = new Label("S5:");
textS5 = new TextField("0.150", 4);
Label labelS6 = new Label("S6:");
textS6 = new TextField("0.075", 4);


Label labelV01 = new Label("V01:");
textV01 = new TextField("24.00", 4);
Label labelV02 = new Label("V02:");
textV02 = new TextField("21.00", 4);
Label labelV03 = new Label("V03:");
textV03 = new TextField("15.00", 4);
Label labelV04 = new Label("V04:");
textV04 = new TextField("10.5", 4);
Label labelV05 = new Label("V05:");
textV05 = new TextField("7.00", 4);
Label labelV06 = new Label("V06:");
textV06 = new TextField("4.00", 4);

Label labelV11 = new Label("V11:");
textV11 = new TextField("7.04", 4);
Label labelV12 = new Label("V12:");
textV12 = new TextField("6.78", 4);
Label labelV13 = new Label("V13:");
textV13 = new TextField("5.99", 4);
Label labelV14 = new Label("V14:");
textV14 = new TextField("5.13", 4);
Label labelV15 = new Label("V15:");
textV15 = new TextField("4.17", 4);
Label labelV16 = new Label("V16:");
textV16 = new TextField("2.86", 4);

Label labelV21 = new Label("V21:");
textV21 = new TextField("4.13", 4);
Label labelV22 = new Label("V22:");
textV22 = new TextField("4.03", 4);
Label labelV23 = new Label("V23:");
textV23 = new TextField("3.75", 4);
Label labelV24 = new Label("V24:");
textV24 = new TextField("3.39", 4);
Label labelV25 = new Label("V25:");
textV25 = new TextField("2.94", 4);
Label labelV26 = new Label("V26:");
textV26 = new TextField("2.22", 4);

Label labelV31 = new Label("V31:");
textV31 = new TextField("2.26", 4);
Label labelV32 = new Label("V32:");
textV32 = new TextField("2.32", 4);
Label labelV33 = new Label("V33:");
textV33 = new TextField("2.14", 4);
Label labelV34 = new Label("V34:");
textV34 = new TextField("2.02", 4);
Label labelV35 = new Label("V35:");
textV35 = new TextField("1.85", 4);
Label labelV36 = new Label("V36:");
textV36 = new TextField("1.54", 4);

Label labelMX1 = new Label("MX1:");
textMX1 = new TextField("2.000", 4);
Label labelMY1 = new Label("MY1:");
textMY1 = new TextField("40.00", 4);
Label labelMX2 = new Label("MX2:");
textMX2 = new TextField("40.00", 4);
Label labelMY2 = new Label("MY2:");
textMY2 = new TextField("60.00", 4);
Label labelI0 = new Label("I0");
Label labelI1 = new Label("I1");
Label labelI2 = new Label("I2");
Label labelI3 = new Label("I3");

Label labelKm0 = new Label("Km0");
Label labelKm1 = new Label("Km1");
Label labelKm2 = new Label("Km2");
Label labelKm3 = new Label("Km3");

Label labelVmax0 = new Label("Vmax0");
Label labelVmax1 = new Label("Vmax1");
Label labelVmax2 = new Label("Vmax2");
Label labelVmax3 = new Label("Vmax3");

textKm0 = new TextField("0.800", 4);
textKm1 = new TextField("0.130", 4);
textKm2 = new TextField("0.090", 4);
textKm3 = new TextField("0.070", 4);

textVmax0 = new TextField("35.00", 4);
textVmax1 = new TextField("10.00", 4);
textVmax2 = new TextField("6.00", 4);
textVmax3 = new TextField("4.00", 4);

Label gLabel1 = new Label("V versus S");
Label xLabel1 = new Label("[S]");
Label yLabel1 = new Label("V");
Label startXAxis1 = new Label ("0");
Label startYAxis1 = new Label ("0");
endXAxis1 = new Label (textMX1.getText());
endYAxis1 = new Label (textMY1.getText());
leftGraph = new Graph(GraphSize, GraphSize);
leftGraph.graphImage = blankGraph(GraphSize, GraphSize);
bDoGraph = new Button ("Start");
Label gLabel2 = new Label("V/[S] versus V");
Label xLabel2 = new Label("V");
Label yLabel2 = new Label("V/[S]");
Label startXAxis2 = new Label ("0");
Label startYAxis2 = new Label ("0");
endXAxis2 = new Label (textMX2.getText());
endYAxis2 = new Label (textMY2.getText());
rightGraph = new Graph(GraphSize, GraphSize);
rightGraph.graphImage = blankGraph(GraphSize, GraphSize);

gbc = new GridBagConstraints();
gbc.gridx = gbc.gridy = 0;
gb.setConstraints(labelS1,  gbc);
add(labelS1);
gbc.gridy = 1;
gb.setConstraints(labelS2,  gbc);
add(labelS2);
gbc.gridy = 2;
gb.setConstraints(labelS3,  gbc);
add(labelS3);
gbc.gridy = 3;
gb.setConstraints(labelS4,  gbc);
add(labelS4);
gbc.gridy = 4;
gb.setConstraints(labelS5,  gbc);
add(labelS5);
gbc.gridy = 5;
gb.setConstraints(labelS6,  gbc);
add(labelS6);

gbc.gridy = 9;
gbc.anchor = GridBagConstraints.NORTHEAST;
gb.setConstraints(endYAxis1,  gbc);
add(endYAxis1);
gbc.gridy = 11;
gbc.anchor = GridBagConstraints.CENTER;
gbc.gridheight = 3;
gb.setConstraints(yLabel1,  gbc);
add(yLabel1);
gbc.gridy = 13;
gbc.gridheight = 1;
gbc.anchor = GridBagConstraints.SOUTHEAST;
gb.setConstraints(startYAxis1,  gbc);
add(startYAxis1);

gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
gb.setConstraints(textS1,  gbc);
add(textS1);
gbc.gridy = 1;
gb.setConstraints(textS2,  gbc);
add(textS2);
gbc.gridy = 2;
gb.setConstraints(textS3,  gbc);
add(textS3);
gbc.gridy = 3;
gb.setConstraints(textS4,  gbc);
add(textS4);
gbc.gridy = 4;
gb.setConstraints(textS5,  gbc);
add(textS5);
gbc.gridy = 5;
gb.setConstraints(textS6,  gbc);
add(textS6);

gbc.gridy = 8;
gbc.gridwidth = 5;
gb.setConstraints(gLabel1,  gbc);
add(gLabel1);
gbc.gridy = 9;
gbc.gridheight = 5;
gb.setConstraints(leftGraph,  gbc);
add(leftGraph);
gbc.gridy = 14;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.anchor = GridBagConstraints.NORTHWEST;
gb.setConstraints(startXAxis1,  gbc);
add(startXAxis1);

gbc = new GridBagConstraints();
gbc.gridx = 2;
gbc.gridy = 0;
gb.setConstraints(labelV01,  gbc);
add(labelV01);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV02,  gbc);
add(labelV02);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV03,  gbc);
add(labelV03);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV04,  gbc);
add(labelV04);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV05,  gbc);
add(labelV05);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV06,  gbc);
add(labelV06);

gbc.gridy = 14;
gbc.gridwidth = 3;
gb.setConstraints(xLabel1,  gbc);
add(xLabel1);

gbc = new GridBagConstraints();
gbc.gridx = 3;
gbc.gridy = 0;
gb.setConstraints(textV01,  gbc);
add(textV01);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV02,  gbc);
add(textV02);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV03,  gbc);
add(textV03);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV04,  gbc);
add(textV04);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV05,  gbc);
add(textV05);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV06,  gbc);
add(textV06);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelI0,  gbc);
add(labelI0);

gbc = new GridBagConstraints();
gbc.gridx = 4;
gbc.gridy = 0;
gb.setConstraints(labelV11,  gbc);
add(labelV11);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV12,  gbc);
add(labelV12);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV13,  gbc);
add(labelV13);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV14,  gbc);
add(labelV14);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV15,  gbc);
add(labelV15);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV16,  gbc);
add(labelV16);

gbc = new GridBagConstraints();
gbc.gridx = 5;
gbc.gridy = 0;
gb.setConstraints(textV11,  gbc);
add(textV11);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV12,  gbc);
add(textV12);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV13,  gbc);
add(textV13);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV14,  gbc);
add(textV14);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV15,  gbc);
add(textV15);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV16,  gbc);
add(textV16);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelI1,  gbc);
add(labelI1);
gbc.gridy = 14;
gbc.anchor = GridBagConstraints.NORTHEAST;
gb.setConstraints(endXAxis1,  gbc);
add(endXAxis1);

gbc = new GridBagConstraints();
gbc.gridx = 6;
gbc.gridy = 0;
gb.setConstraints(labelV21,  gbc);
add(labelV21);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV22,  gbc);
add(labelV22);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV23,  gbc);
add(labelV23);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV24,  gbc);
add(labelV24);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV25,  gbc);
add(labelV25);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV26,  gbc);
add(labelV26);

gbc = new GridBagConstraints();
gbc.gridx = 7;
gbc.gridy = 0;
gb.setConstraints(textV21,  gbc);
add(textV21);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV22,  gbc);
add(textV22);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV23,  gbc);
add(textV23);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV24,  gbc);
add(textV24);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV25,  gbc);
add(textV25);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV26,  gbc);
add(textV26);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelI2,  gbc);
add(labelI2);

gbc = new GridBagConstraints();
gbc.gridx = 8;
gbc.gridy = 0;
gb.setConstraints(labelV31,  gbc);
add(labelV31);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV32,  gbc);
add(labelV32);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV33,  gbc);
add(labelV33);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV34,  gbc);
add(labelV34);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV35,  gbc);
add(labelV35);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelV36,  gbc);
add(labelV36);

gbc = new GridBagConstraints();
gbc.gridx = 9;
gbc.gridy = 0;
gb.setConstraints(textV31,  gbc);
add(textV31);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV32,  gbc);
add(textV32);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV33,  gbc);
add(textV33);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV34,  gbc);
add(textV34);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV35,  gbc);
add(textV35);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textV36,  gbc);
add(textV36);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelI3,  gbc);
add(labelI3);

gbc = new GridBagConstraints();
gbc.gridx = 10;
gbc.gridy = 0;
gb.setConstraints(labelKm0,  gbc);
add(labelKm0);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelKm1,  gbc);
add(labelKm1);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelKm2,  gbc);
add(labelKm2);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelKm3,  gbc);
add(labelKm3);

gbc = new GridBagConstraints();
gbc.gridx = 11;
gbc.gridy = 0;
gb.setConstraints(textKm0,  gbc);
add(textKm0);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textKm1,  gbc);
add(textKm1);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textKm2,  gbc);
add(textKm2);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textKm3,  gbc);
add(textKm3);

gbc = new GridBagConstraints();
gbc.gridx = 12;
gbc.gridy = 0;
gb.setConstraints(labelVmax0,  gbc);
add(labelVmax0);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelVmax1,  gbc);
add(labelVmax1);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelVmax2,  gbc);
add(labelVmax2);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelVmax3,  gbc);
add(labelVmax3);

gbc = new GridBagConstraints();
gbc.gridx = 13;
gbc.gridy = 0;
gb.setConstraints(textVmax0,  gbc);
add(textVmax0);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textVmax1,  gbc);
add(textVmax1);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textVmax2,  gbc);
add(textVmax2);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textVmax3,  gbc);
add(textVmax3);

gbc = new GridBagConstraints();
gbc.gridx = 14;
gbc.gridy = 0;
gb.setConstraints(labelMX1,  gbc);
add(labelMX1);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelMY1,  gbc);
add(labelMY1);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelMX2,  gbc);
add(labelMX2);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(labelMY2,  gbc);
add(labelMY2);

gbc = new GridBagConstraints();
gbc.gridx = 15;
gbc.gridy = 0;
gb.setConstraints(textMX1,  gbc);
add(textMX1);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textMY1,  gbc);
add(textMY1);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textMX2,  gbc);
add(textMX2);
gbc.gridy = GridBagConstraints.RELATIVE;
gb.setConstraints(textMY2,  gbc);
add(textMY2);

gbc = new GridBagConstraints();
gbc.gridx = 7;
gbc.gridy = 9;
gbc.anchor = GridBagConstraints.NORTHEAST;
gb.setConstraints(endYAxis2,  gbc);
add(endYAxis2);
gbc.gridy = 11;
gbc.anchor = GridBagConstraints.CENTER;
gbc.gridheight = 3;
gb.setConstraints(yLabel2,  gbc);
add(yLabel2);
gbc.gridheight = 1;
gbc.gridy = 13;
gbc.anchor = GridBagConstraints.SOUTHEAST;
gb.setConstraints(startYAxis2,  gbc);
add(startYAxis2);


gbc = new GridBagConstraints();
gbc.gridx = 8;
gbc.gridy = 8;
gbc.gridwidth = 5;
gb.setConstraints(gLabel2,  gbc);
add(gLabel2);
gbc.gridy = 9;
gbc.gridheight = 5;
gb.setConstraints(rightGraph,  gbc);
add(rightGraph);
gbc.gridy = 14;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.anchor = GridBagConstraints.NORTHWEST;
gb.setConstraints(startXAxis2,  gbc);
add(startXAxis2);

gbc = new GridBagConstraints();
gbc.gridx = 9;
gbc.gridy = 14;
gbc.gridwidth = 3;
gb.setConstraints(xLabel2,  gbc);
add(xLabel2);

gbc = new GridBagConstraints();
gbc.gridx = 6;
gbc.gridy = 13;
gbc.gridwidth = 1;
gb.setConstraints(bDoGraph,  gbc);
add(bDoGraph);

gbc = new GridBagConstraints();
gbc.gridx = 12;
gbc.gridy = 14;
gbc.anchor = GridBagConstraints.NORTHEAST;
gb.setConstraints(endXAxis2,  gbc);
add(endXAxis2);


}

/*
public void update (Graphics g) { paint(g); }

public void paint (Graphics g) {
g.drawImage (graphImage, 0, 0, this);
}

public void run () {
repaint();
}*/

public boolean action(Event e, Object arg) {
if (e.target == bDoGraph) {
doGraph();
}
else
System.out.println("Unrecognized event");

return super.action(e, arg);
}

public void doGraph () {
bDoGraph.disable();

float S1 = floatFromTextField(textS1);
float S2 = floatFromTextField(textS2);
float S3 = floatFromTextField(textS3);
float S4 = floatFromTextField(textS4);
float S5 = floatFromTextField(textS5);
float S6 = floatFromTextField(textS6);

float V01 = floatFromTextField(textV01);
float V02 = floatFromTextField(textV02);
float V03 = floatFromTextField(textV03);
float V04 = floatFromTextField(textV04);
float V05 = floatFromTextField(textV05);
float V06 = floatFromTextField(textV06);

float V11 = floatFromTextField(textV11);
float V12 = floatFromTextField(textV12);
float V13 = floatFromTextField(textV13);
float V14 = floatFromTextField(textV14);
float V15 = floatFromTextField(textV15);
float V16 = floatFromTextField(textV16);

float V21 = floatFromTextField(textV21);
float V22 = floatFromTextField(textV22);
float V23 = floatFromTextField(textV23);
float V24 = floatFromTextField(textV24);
float V25 = floatFromTextField(textV25);
float V26 = floatFromTextField(textV26);

float V31 = floatFromTextField(textV31);
float V32 = floatFromTextField(textV32);
float V33 = floatFromTextField(textV33);
float V34 = floatFromTextField(textV34);
float V35 = floatFromTextField(textV35);
float V36 = floatFromTextField(textV36);

float MX1 = floatFromTextField(textMX1);
float MX2 = floatFromTextField(textMX2);
float MY1 = floatFromTextField(textMY1);
float MY2 = floatFromTextField(textMY2);

endXAxis1.setText(textMX1.getText());
endXAxis2.setText(textMX2.getText());
endYAxis1.setText(textMY1.getText());
endYAxis2.setText(textMY2.getText());

leftGraph.graphImage = blankGraph(GraphSize, GraphSize);
rightGraph.graphImage = blankGraph(GraphSize, GraphSize);

float z = 0;
float u = 0;
float w = 0;
float a0 = 0;
float a1 = 0;
float a2 = 0;
float a3 = 0;
float b0 = 0;
float b1 = 0;
float b2 = 0;
float b3 = 0;
float Vmax0 = floatFromTextField(textVmax0);
float Vmax1 = floatFromTextField(textVmax1);
float Vmax2 = floatFromTextField(textVmax2);
float Vmax3 = floatFromTextField(textVmax3);
float Km0 = floatFromTextField(textKm0);
float Km1 = floatFromTextField(textKm1);
float Km2 = floatFromTextField(textKm2);
float Km3 = floatFromTextField(textKm3);

b0 = -(1/Km0);
b1 = -(1/Km1);
b2 = -(1/Km2);
b3 = -(1/Km3);
a0 = -(b0*Vmax0);
a1 = -(b1*Vmax1);
a2 = -(b2*Vmax2);
a3 = -(b3*Vmax3);

float t = MX2/1000;
for (z=0; z <= MX2; z = z + t) {
u = ((b0 * z) + a0);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((z / MX2) * GraphSize), GraphSize - ((int) ((u / MY2) * GraphSize)), Color.red, 1, 1);
u = ((b1 * z) + a1);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((z / MX2) * GraphSize), GraphSize - ((int) ((u / MY2) * GraphSize)), Color.blue, 1, 1);
u = ((b2 * z) + a2);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((z / MX2) * GraphSize), GraphSize - ((int) ((u / MY2) * GraphSize)), Color.green, 1, 1);
u = ((b3 * z) + a3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((z / MX2) * GraphSize), GraphSize - ((int) ((u / MY2) * GraphSize)), Color.magenta, 1, 1);
}


float c = MX1/1000;
for (z=0; z <= MX1; z = z + c) {
w = ((Vmax0 * z) / (Km0 + z));
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((z / MX1) * GraphSize), GraphSize - ((int) ((w / MY1) * GraphSize)), Color.red, 1, 1);
w = ((Vmax1 * z) / (Km1 + z));
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((z / MX1) * GraphSize), GraphSize - ((int) ((w / MY1) * GraphSize)), Color.blue, 1, 1);
w = ((Vmax2 * z) / (Km2 + z));
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((z / MX1) * GraphSize), GraphSize - ((int) ((w / MY1) * GraphSize)), Color.green, 1, 1);
w = ((Vmax3 * z) / (Km3 + z));
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((z / MX1) * GraphSize), GraphSize - ((int) ((w / MY1) * GraphSize)), Color.magenta, 1, 1);
}


leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S1 / MX1) * GraphSize), GraphSize - ((int) ((V01 / MY1) * GraphSize)), Color.red, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S2 / MX1) * GraphSize), GraphSize - ((int) ((V02 / MY1) * GraphSize)), Color.red, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S3 / MX1) * GraphSize), GraphSize - ((int) ((V03 / MY1) * GraphSize)), Color.red, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S4 / MX1) * GraphSize), GraphSize - ((int) ((V04 / MY1) * GraphSize)), Color.red, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S5 / MX1) * GraphSize), GraphSize - ((int) ((V05 / MY1) * GraphSize)), Color.red, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S6 / MX1) * GraphSize), GraphSize - ((int) ((V06 / MY1) * GraphSize)), Color.red, 3, 3);

leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S1 / MX1) * GraphSize), GraphSize - ((int) ((V11 / MY1) * GraphSize)), Color.blue, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S2 / MX1) * GraphSize), GraphSize - ((int) ((V12 / MY1) * GraphSize)), Color.blue, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S3 / MX1) * GraphSize), GraphSize - ((int) ((V13 / MY1) * GraphSize)), Color.blue, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S4 / MX1) * GraphSize), GraphSize - ((int) ((V14 / MY1) * GraphSize)), Color.blue, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S5 / MX1) * GraphSize), GraphSize - ((int) ((V15 / MY1) * GraphSize)), Color.blue, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S6 / MX1) * GraphSize), GraphSize - ((int) ((V16 / MY1) * GraphSize)), Color.blue, 3, 3);

leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S1 / MX1) * GraphSize), GraphSize - ((int) ((V21 / MY1) * GraphSize)), Color.green, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S2 / MX1) * GraphSize), GraphSize - ((int) ((V22 / MY1) * GraphSize)), Color.green, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S3 / MX1) * GraphSize), GraphSize - ((int) ((V23 / MY1) * GraphSize)), Color.green, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S4 / MX1) * GraphSize), GraphSize - ((int) ((V24 / MY1) * GraphSize)), Color.green, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S5 / MX1) * GraphSize), GraphSize - ((int) ((V25 / MY1) * GraphSize)), Color.green, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S6 / MX1) * GraphSize), GraphSize - ((int) ((V26 / MY1) * GraphSize)), Color.green, 3, 3);

leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S1 / MX1) * GraphSize), GraphSize - ((int) ((V31 / MY1) * GraphSize)), Color.magenta, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S2 / MX1) * GraphSize), GraphSize - ((int) ((V32 / MY1) * GraphSize)), Color.magenta, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S3 / MX1) * GraphSize), GraphSize - ((int) ((V33 / MY1) * GraphSize)), Color.magenta, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S4 / MX1) * GraphSize), GraphSize - ((int) ((V34 / MY1) * GraphSize)), Color.magenta, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S5 / MX1) * GraphSize), GraphSize - ((int) ((V35 / MY1) * GraphSize)), Color.magenta, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S6 / MX1) * GraphSize), GraphSize - ((int) ((V36 / MY1) * GraphSize)), Color.magenta, 3, 3);

rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V01 / MX2) * GraphSize), GraphSize - ((int) (((V01/S1) / MY2) * GraphSize)), Color.red, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V02 / MX2) * GraphSize), GraphSize - ((int) (((V02/S2) / MY2) * GraphSize)), Color.red, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V03 / MX2) * GraphSize), GraphSize - ((int) (((V03/S3) / MY2) * GraphSize)), Color.red, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V04 / MX2) * GraphSize), GraphSize - ((int) (((V04/S4) / MY2) * GraphSize)), Color.red, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V05 / MX2) * GraphSize), GraphSize - ((int) (((V05/S5) / MY2) * GraphSize)), Color.red, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V06 / MX2) * GraphSize), GraphSize - ((int) (((V06/S6) / MY2) * GraphSize)), Color.red, 3, 3);

rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V11 / MX2) * GraphSize), GraphSize - ((int) (((V11/S1) / MY2) * GraphSize)), Color.blue, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V12 / MX2) * GraphSize), GraphSize - ((int) (((V12/S2) / MY2) * GraphSize)), Color.blue, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V13 / MX2) * GraphSize), GraphSize - ((int) (((V13/S3) / MY2) * GraphSize)), Color.blue, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V14 / MX2) * GraphSize), GraphSize - ((int) (((V14/S4) / MY2) * GraphSize)), Color.blue, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V15 / MX2) * GraphSize), GraphSize - ((int) (((V15/S5) / MY2) * GraphSize)), Color.blue, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V16 / MX2) * GraphSize), GraphSize - ((int) (((V16/S6) / MY2) * GraphSize)), Color.blue, 3, 3);


rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V21 / MX2) * GraphSize), GraphSize - ((int) (((V21/S1) / MY2) * GraphSize)), Color.green, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V22 / MX2) * GraphSize), GraphSize - ((int) (((V22/S2) / MY2) * GraphSize)), Color.green, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V23 / MX2) * GraphSize), GraphSize - ((int) (((V23/S3) / MY2) * GraphSize)), Color.green, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V24 / MX2) * GraphSize), GraphSize - ((int) (((V24/S4) / MY2) * GraphSize)), Color.green, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V25 / MX2) * GraphSize), GraphSize - ((int) (((V25/S5) / MY2) * GraphSize)), Color.green, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V26 / MX2) * GraphSize), GraphSize - ((int) (((V26/S6) / MY2) * GraphSize)), Color.green, 3, 3);


rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V31 / MX2) * GraphSize), GraphSize - ((int) (((V31/S1) / MY2) * GraphSize)), Color.magenta, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V32 / MX2) * GraphSize), GraphSize - ((int) (((V32/S2) / MY2) * GraphSize)), Color.magenta, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V33 / MX2) * GraphSize), GraphSize - ((int) (((V33/S3) / MY2) * GraphSize)), Color.magenta, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V34 / MX2) * GraphSize), GraphSize - ((int) (((V34/S4) / MY2) * GraphSize)), Color.magenta, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V35 / MX2) * GraphSize), GraphSize - ((int) (((V35/S5) / MY2) * GraphSize)), Color.magenta, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V36 / MX2) * GraphSize), GraphSize - ((int) (((V36/S6) / MY2) * GraphSize)), Color.magenta, 3, 3);


leftGraph.repaint();
rightGraph.repaint();
bDoGraph.enable();
repaint();

}


float floatFromTextField (TextField tf) {
String s;
float value;

s = tf.getText();

try {
value = Float.valueOf(s).floatValue();
} catch (Exception e) {
value = (float) 0.0;
}
return value;
}

Image blankGraph (int width, int height) {
Image tempImage;
Graphics tempGr;

tempImage = createImage(width, height);
tempGr = tempImage.getGraphics();



// draw a box around the graph
tempGr.setColor (Color.white);
tempGr.fillRect (0, 0, width, height);
tempGr.setColor (Color.black);
tempGr.drawRect (0, 0, width - 1, height - 1);
// draw ticks marks around edges
int i;
int hinterval = width / 5;
int vinterval = height / 5;
int TickLength = 2;
for (i = 0; i < 4; i++) {
tempGr.drawLine (hinterval * (i + 1), 0, hinterval * (i + 1), TickLength);
tempGr.drawLine (0, vinterval * (i + 1), TickLength, vinterval * (i + 1));
tempGr.drawLine (width - TickLength - 1, hinterval * (i + 1), height - 1, vinterval * (i + 1));
tempGr.drawLine (hinterval * (i + 1), height - TickLength - 1, hinterval * (i + 1), height);
}

return (tempImage);
}


Image addPoint (Image tempImage, int x, int y, Color pointColor, int size1, int size2) {
Graphics tempGr;

tempGr = tempImage.getGraphics();
tempGr.setColor (pointColor);
tempGr.fillRect (x, y, size1, size2);

return (tempImage);
}

}
class Graph extends Canvas {
public Image graphImage;
public int width;
public int height;
public Dimension preferredSize() {
return new Dimension (width, height);
}

Graph (int width, int height) {
this.width = width;
this.height = height;
resize(preferredSize());
}

public void update (Graphics g) { paint(g); }

public void paint (Graphics g) {
g.drawImage (graphImage, 0, 0, this);

}
}	