/*
To do Rhodes' enzyme kinetics, single substrate, competitive inhibition, Eadie-Hofstee plot
Modified - 07/2000 DR
*/

import java.awt.*;
import java.applet.Applet;

public class model extends Applet
{
float  Km0, Km1, Km2, Km3;
float Vmax0, Vmax1, Vmax2, Vmax3;
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;
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	  labelI0, labelI1, labelI2, labelI3;
Label     labelMX1, labelMX2, labelMY1, labelMY2;
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("32.90", 4);
Label labelV02 = new Label("V02:");
textV02 = new TextField("32.00", 4);
Label labelV03 = new Label("V03:");
textV03 = new TextField("30.00", 4);
Label labelV04 = new Label("V04:");
textV04 = new TextField("25.00", 4);
Label labelV05 = new Label("V05:");
textV05 = new TextField("20.00", 4);
Label labelV06 = new Label("V06:");
textV06 = new TextField("16.00", 4);

Label labelV11 = new Label("V11:");
textV11 = new TextField("31.50", 4);
Label labelV12 = new Label("V12:");
textV12 = new TextField("30.00", 4);
Label labelV13 = new Label("V13:");
textV13 = new TextField("26.00", 4);
Label labelV14 = new Label("V14:");
textV14 = new TextField("21.00", 4);
Label labelV15 = new Label("V15:");
textV15 = new TextField("15.30", 4);
Label labelV16 = new Label("V16:");
textV16 = new TextField("10.80", 4);

Label labelV21 = new Label("V21:");
textV21 = new TextField("28.00", 4);
Label labelV22 = new Label("V22:");
textV22 = new TextField("26.00", 4);
Label labelV23 = new Label("V23:");
textV23 = new TextField("21.50", 4);
Label labelV24 = new Label("V24:");
textV24 = new TextField("14.50", 4);
Label labelV25 = new Label("V25:");
textV25 = new TextField("11.00", 4);
Label labelV26 = new Label("V26:");
textV26 = new TextField("6.40", 4);

Label labelV31 = new Label("V31:");
textV31 = new TextField("24.00", 4);
Label labelV32 = new Label("V32:");
textV32 = new TextField("21.00", 4);
Label labelV33 = new Label("V33:");
textV33 = new TextField("14.50", 4);
Label labelV34 = new Label("V34:");
textV34 = new TextField("9.80", 4);
Label labelV35 = new Label("V35:");
textV35 = new TextField("6.20", 4);
Label labelV36 = new Label("V36:");
textV36 = new TextField("3.50", 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("250.00", 4);
Label labelI0 = new Label("I0");
Label labelI1 = new Label("I1");
Label labelI2 = new Label("I2");
Label labelI3 = new Label("I3");

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(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 = 11;
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 = 13;
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 q = 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 SX0 = 0;
float SX1 = 0;
float SX2 = 0;
float SX3 = 0;
float SY0 = 0;
float SY1 = 0;
float SY2 = 0;
float SY3 = 0;
float SXS0 = 0;
float SXS1 = 0;
float SXS2 = 0;
float SXS3 = 0;
float SYS0 = 0;
float SYS1 = 0;
float SYS2 = 0;
float SYS3 = 0;
float SXYS0 = 0;
float SXYS1 = 0;
float SXYS2 = 0;
float SXYS3 = 0;
float SXX0 = 0;
float SXX1 = 0;
float SXX2 = 0;
float SXX3 = 0;
float SXY0 = 0;
float SXY1 = 0;
float SXY2 = 0;
float SXY3 = 0;
float SYY0 = 0;
float SYY1 = 0;
float SYY2 = 0;
float SYY3 = 0;

SX0 = (V01 + V02 + V03 + V04 + V05 + V06);
SX1 = (V11 + V12 + V13 + V14 + V15 + V16);
SX2 = (V21 + V22 + V23 + V24 + V25 + V26);
SX3 = (V31 + V32 + V33 + V34 + V35 + V36);
SY0 = ((V01/S1) + (V02/S2) + (V03/S3) + (V04/S4) + (V05/S5) + (V06/S6));
SY1 = ((V11/S1) + (V12/S2) + (V13/S3) + (V14/S4) + (V15/S5) + (V16/S6));
SY2 = ((V21/S1) + (V22/S2) + (V23/S3) + (V24/S4) + (V25/S5) + (V26/S6));
SY3 = ((V31/S1) + (V32/S2) + (V33/S3) + (V34/S4) + (V35/S5) + (V36/S6));
SXS0 = ((V01 * V01) + (V02 * V02) + (V03 * V03) + (V04 * V04) + (V05 * V05) + (V06 * V06));
SXS1 = ((V11 * V11) + (V12 * V12) + (V13 * V13) + (V14 * V14) + (V15 * V15) + (V16 * V16));
SXS2 = ((V21 * V21) + (V22 * V22) + (V23 * V23) + (V24 * V24) + (V25 * V25) + (V26 * V26));
SXS3 = ((V31 * V31) + (V32 * V32) + (V33 * V33) + (V34 * V34) + (V35 * V35) + (V36 * V36));
SYS0 = (((V01/S1)*(V01/S1)) + ((V02/S2)*(V02/S2)) + ((V03/S3)*(V03/S3)) + ((V04/S4)*(V04/S4)) + ((V05/S5)*(V05/S5)) + ((V06/S6)*(V06/S6)));
SYS1 = (((V11/S1)*(V11/S1)) + ((V12/S2)*(V12/S2)) + ((V13/S3)*(V13/S3)) + ((V14/S4)*(V14/S4)) + ((V15/S5)*(V15/S5)) + ((V16/S6)*(V16/S6)));
SYS2 = (((V21/S1)*(V21/S1)) + ((V22/S2)*(V22/S2)) + ((V23/S3)*(V23/S3)) + ((V24/S4)*(V24/S4)) + ((V25/S5)*(V25/S5)) + ((V26/S6)*(V26/S6)));
SYS3 = (((V31/S1)*(V31/S1)) + ((V32/S2)*(V32/S2)) + ((V33/S3)*(V33/S3)) + ((V34/S4)*(V34/S4)) + ((V35/S5)*(V35/S5)) + ((V36/S6)*(V36/S6)));
SXYS0 = ((V01 * (V01/S1)) + (V02 * (V02/S2)) + (V03 * (V03/S3)) + (V04 * (V04/S4)) + (V05 * (V05/S5)) + (V06 * (V06/S6)));
SXYS1 = ((V11 * (V11/S1)) + (V12 * (V12/S2)) + (V13 * (V13/S3)) + (V14 * (V14/S4)) + (V15 * (V15/S5)) + (V16 * (V16/S6)));
SXYS2 = ((V21 * (V21/S1)) + (V22 * (V22/S2)) + (V23 * (V23/S3)) + (V24 * (V24/S4)) + (V25 * (V25/S5)) + (V26 * (V26/S6)));
SXYS3 = ((V31 * (V31/S1)) + (V32 * (V32/S2)) + (V33 * (V33/S3)) + (V34 * (V34/S4)) + (V35 * (V35/S5)) + (V36 * (V36/S6)));
SXX0 = (SXS0 - ((SX0 * SX0)/6));
SXX1 = (SXS1 - ((SX1 * SX1)/6));
SXX2 = (SXS2 - ((SX2 * SX2)/6));
SXX3 = (SXS3 - ((SX3 * SX3)/6));
SXY0 = (SXYS0 - ((SX0 * SY0)/6));
SXY1 = (SXYS1 - ((SX1 * SY1)/6));
SXY2 = (SXYS2 - ((SX2 * SY2)/6));
SXY3 = (SXYS3 - ((SX3 * SY3)/6));
SYY0 = (SYS0 - ((SY0 * SY0)/6));
SYY1 = (SYS1 - ((SY1 * SY1)/6));
SYY2 = (SYS2 - ((SY2 * SY2)/6));
SYY3 = (SYS3 - ((SY3 * SY3)/6));
b0 = (SXY0 / SXX0);
b1 = (SXY1 / SXX1);
b2 = (SXY2 / SXX2);
b3 = (SXY3 / SXX3);
a0 = ((SY0 / 6) - (b0 * (SX0/6)));
a1 = ((SY1 / 6) - (b1 * (SX1/6)));
a2 = ((SY2 / 6) - (b2 * (SX2/6)));
a3 = ((SY3 / 6) - (b3 * (SX3/6)));
Vmax0 = -(a0/b0);
Vmax1 = -(a1/b1);
Vmax2 = -(a2/b2);
Vmax3 = -(a3/b3);
Km0 = -(1/b0);
Km1 = -(1/b1);
Km2 = -(1/b2);
Km3 = -(1/b3);

float t = MX2/500;
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.black, 1, 1);
u = ((b1 * z) + a1);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((z / MX2) * GraphSize), GraphSize - ((int) ((u / MY2) * GraphSize)), Color.red, 1, 1);
u = ((b2 * z) + a2);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((z / MX2) * GraphSize), GraphSize - ((int) ((u / MY2) * GraphSize)), Color.blue, 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/500;
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.black, 1, 1);
w = ((Vmax1 * z) / (Km1 + z));
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((z / MX1) * GraphSize), GraphSize - ((int) ((w / MY1) * GraphSize)), Color.red, 1, 1);
w = ((Vmax2 * z) / (Km2 + z));
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((z / MX1) * GraphSize), GraphSize - ((int) ((w / MY1) * GraphSize)), Color.blue, 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.black, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S2 / MX1) * GraphSize), GraphSize - ((int) ((V02 / MY1) * GraphSize)), Color.black, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S3 / MX1) * GraphSize), GraphSize - ((int) ((V03 / MY1) * GraphSize)), Color.black, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S4 / MX1) * GraphSize), GraphSize - ((int) ((V04 / MY1) * GraphSize)), Color.black, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S5 / MX1) * GraphSize), GraphSize - ((int) ((V05 / MY1) * GraphSize)), Color.black, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S6 / MX1) * GraphSize), GraphSize - ((int) ((V06 / MY1) * GraphSize)), Color.black, 3, 3);

leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S1 / MX1) * GraphSize), GraphSize - ((int) ((V11 / MY1) * GraphSize)), Color.red, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S2 / MX1) * GraphSize), GraphSize - ((int) ((V12 / MY1) * GraphSize)), Color.red, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S3 / MX1) * GraphSize), GraphSize - ((int) ((V13 / MY1) * GraphSize)), Color.red, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S4 / MX1) * GraphSize), GraphSize - ((int) ((V14 / MY1) * GraphSize)), Color.red, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S5 / MX1) * GraphSize), GraphSize - ((int) ((V15 / MY1) * GraphSize)), Color.red, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S6 / MX1) * GraphSize), GraphSize - ((int) ((V16 / MY1) * GraphSize)), Color.red, 3, 3);

leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S1 / MX1) * GraphSize), GraphSize - ((int) ((V21 / MY1) * GraphSize)), Color.blue, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S2 / MX1) * GraphSize), GraphSize - ((int) ((V22 / MY1) * GraphSize)), Color.blue, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S3 / MX1) * GraphSize), GraphSize - ((int) ((V23 / MY1) * GraphSize)), Color.blue, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S4 / MX1) * GraphSize), GraphSize - ((int) ((V24 / MY1) * GraphSize)), Color.blue, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S5 / MX1) * GraphSize), GraphSize - ((int) ((V25 / MY1) * GraphSize)), Color.blue, 3, 3);
leftGraph.graphImage = addPoint(leftGraph.graphImage, (int) ((S6 / MX1) * GraphSize), GraphSize - ((int) ((V26 / MY1) * GraphSize)), Color.blue, 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.black, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V02 / MX2) * GraphSize), GraphSize - ((int) (((V02/S2) / MY2) * GraphSize)), Color.black, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V03 / MX2) * GraphSize), GraphSize - ((int) (((V03/S3) / MY2) * GraphSize)), Color.black, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V04 / MX2) * GraphSize), GraphSize - ((int) (((V04/S4) / MY2) * GraphSize)), Color.black, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V05 / MX2) * GraphSize), GraphSize - ((int) (((V05/S5) / MY2) * GraphSize)), Color.black, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V06 / MX2) * GraphSize), GraphSize - ((int) (((V06/S6) / MY2) * GraphSize)), Color.black, 3, 3);

rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V11 / MX2) * GraphSize), GraphSize - ((int) (((V11/S1) / MY2) * GraphSize)), Color.red, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V12 / MX2) * GraphSize), GraphSize - ((int) (((V12/S2) / MY2) * GraphSize)), Color.red, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V13 / MX2) * GraphSize), GraphSize - ((int) (((V13/S3) / MY2) * GraphSize)), Color.red, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V14 / MX2) * GraphSize), GraphSize - ((int) (((V14/S4) / MY2) * GraphSize)), Color.red, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V15 / MX2) * GraphSize), GraphSize - ((int) (((V15/S5) / MY2) * GraphSize)), Color.red, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V16 / MX2) * GraphSize), GraphSize - ((int) (((V16/S6) / MY2) * GraphSize)), Color.red, 3, 3);


rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V21 / MX2) * GraphSize), GraphSize - ((int) (((V21/S1) / MY2) * GraphSize)), Color.blue, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V22 / MX2) * GraphSize), GraphSize - ((int) (((V22/S2) / MY2) * GraphSize)), Color.blue, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V23 / MX2) * GraphSize), GraphSize - ((int) (((V23/S3) / MY2) * GraphSize)), Color.blue, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V24 / MX2) * GraphSize), GraphSize - ((int) (((V24/S4) / MY2) * GraphSize)), Color.blue, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V25 / MX2) * GraphSize), GraphSize - ((int) (((V25/S5) / MY2) * GraphSize)), Color.blue, 3, 3);
rightGraph.graphImage = addPoint(rightGraph.graphImage, (int) ((V26 / MX2) * GraphSize), GraphSize - ((int) (((V26/S6) / MY2) * GraphSize)), Color.blue, 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);
tempGr.setColor (Color.black);
tempGr.drawString("Km0 = " + (float)this.Km0, 40,25);
tempGr.drawString("Vmax0 = " + (float)this.Vmax0, 40,35);
tempGr.setColor (Color.red);
tempGr.drawString("Km1 = " + (float)this.Km1, 40,65);
tempGr.drawString("Vmax1 = " + (float)this.Vmax1, 40,75);
tempGr.setColor (Color.blue);
tempGr.drawString("Km2 = " + (float)this.Km2, 40,105);
tempGr.drawString("Vmax2 = " + (float)this.Vmax2, 40,115);
tempGr.setColor (Color.magenta);
tempGr.drawString("Km3 = " + (float)this.Km3, 40,145);
tempGr.drawString("Vmax3 = " + (float)this.Vmax3, 40,155);
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);

}
}	