User:Gizmo/GizmoConstructor1

From Sodawiki

< User:Gizmo
Revision as of 02:04, 5 June 2007 by Gizmo (Talk | contribs)
   import java.awt.*;
   import java.awt.geom.*;
   import javax.swing.*;
   import javax.swing.event.*;
   import java.applet.*;
   import java.awt.event.*;
   import java.math.*;
   import java.util.Hashtable;
   import java.lang.Math;
   /*********************************************/
   /** Author: Colin Stanfill                   */
   /** Inspired by Sodaconstructor by Ed Burton */
   /*********************************************/  
   public class Soda extends JApplet implements MouseListener, Runnable, ActionListener, ChangeListener, MouseMotionListener, KeyListener{
       Thread t;
       public double[][] masses=new double[1000][7];
       public double[][] springs=new double[1000][7];
       public MVector vectora, vectorb;
       public String mode="Construct", mamode="Free Mass", spmode="Normal";
       public int spd=24, Tempi, foundm, founds, mx, my, numberofsprings=0, numberofmasses=0, width, height, MASS, disp, mou , mouseY;
       public double g=4.0, f=41, k=40, v=50, Tempd, fbounce=1.7;
       public boolean MassFound=false, MakingSpring=false, SpringFound=false, QQ=false;
       public JRadioButton Simulate, Construct, Delete, New, FreeMass, FixedMass, Normal, Barspring;
       public JMenu ModeMenu, MassMenu, SpringMenu;
       public JMenuBar Bar, Bar2;
       public JFrame Sliders;
       public JSlider gravity, friction, springiness, fps, velocity;
       public SinePanel Panel1;
       public static void main(String[] args) {
       }
       public void init() {
           this.setVisible(true);
           addMouseListener(this);
           addMouseMotionListener(this);
           addKeyListener(this);
           setBackground(Color.white);
           width=getSize().width;
           height=getSize().height;
           t=new Thread(this);
           t.start();
           this.setJMenuBar(MakeMenuBar());
           Sliders=new JFrame("Sliders");
           Sliders.setJMenuBar(MakeMenuBar2());
           Sliders.setVisible(true);
           Sliders.setSize(150, 400);
           Panel1=new SinePanel();
           Panel1.setVisible(true);
           Panel1.setSize(150, 400);
           Panel1.addMouseListener(Panel1);
           Panel1.addMouseMotionListener(Panel1);
           Panel1.setLocation(width, 0);
           Sliders.setLocation(width+150, 0);
       }
       public JMenuBar MakeMenuBar() {
           JRadioButton Simulate=new JRadioButton("Simulate");
           JRadioButton Construct=new JRadioButton("Construct");
           JRadioButton Delete=new JRadioButton("Delete");
           JRadioButton New=new JRadioButton("New");
           JRadioButton FreeMass=new JRadioButton("Free Mass");
           JRadioButton FixedMass=new JRadioButton("Fixed Mass");
           JRadioButton Normal=new JRadioButton("Normal");
           JRadioButton Barspring=new JRadioButton("Barspring");
           ButtonGroup Mode=new ButtonGroup();
           ButtonGroup Masses=new ButtonGroup();
           ButtonGroup Springs=new ButtonGroup();
           JMenu ModeMenu=new JMenu("Mode");
           JMenu MassMenu=new JMenu("Masses");
           JMenu SpringMenu=new JMenu("Springs");
           JMenuBar Bar=new JMenuBar();
           Bar.add(ModeMenu);
           Bar.add(MassMenu);  
           Bar.add(SpringMenu);       
           ModeMenu.add(Simulate);
           ModeMenu.add(Construct);
           ModeMenu.add(Delete);
           ModeMenu.add(New);
           MassMenu.add(FreeMass);
           MassMenu.add(FixedMass);
           SpringMenu.add(Normal);
           SpringMenu.add(Barspring);
           Mode.add(Simulate);
           Mode.add(Construct);
           Mode.add(Delete);
           Mode.add(New);
           Masses.add(FreeMass);
           Masses.add(FixedMass);
           Springs.add(Normal);
           Springs.add(Barspring);
           Construct.setSelected(true);
           FreeMass.setSelected(true);
           Normal.setSelected(true);
           Simulate.addActionListener(this);
           Construct.addActionListener(this);
           Delete.addActionListener(this);
           New.addActionListener(this);
           FreeMass.addActionListener(this);
           FixedMass.addActionListener(this);
           Normal.addActionListener(this);
           Barspring.addActionListener(this);
           ModeMenu.addActionListener(this);
           Simulate.setActionCommand("Simulate");
           Construct.setActionCommand("Construct");
           Delete.setActionCommand("Delete");
           FreeMass.setActionCommand("Free Mass");
           FixedMass.setActionCommand("Fixed Mass");
           Normal.setActionCommand("Normal");
           Barspring.setActionCommand("Barspring");
           return Bar;
       }
       public JMenuBar MakeMenuBar2() {
           Hashtable<Integer, JLabel> lT1 = new Hashtable<Integer, JLabel>();
           Hashtable<Integer, JLabel> lT2 = new Hashtable<Integer, JLabel>();
           Hashtable<Integer, JLabel> lT3 = new Hashtable<Integer, JLabel>();
           Hashtable<Integer, JLabel> lT4 = new Hashtable<Integer, JLabel>();
           Hashtable<Integer, JLabel> lT5 = new Hashtable<Integer, JLabel>();
           lT1.put(new Integer (0),new JLabel("G")); 
           lT2.put(new Integer (0),new JLabel("F")); 
           lT3.put(new Integer (0),new JLabel("K")); 
           lT4.put(new Integer (0),new JLabel("Speed"));
           lT5.put(new Integer (0),new JLabel("V"));  
           JSlider gravity=new JSlider(JSlider.VERTICAL, 0, 102, 40);
           JSlider friction=new JSlider(JSlider.VERTICAL, 0, 100, 41);
           JSlider springiness=new JSlider(JSlider.VERTICAL, 0, 99, 40);
           JSlider fps=new JSlider(JSlider.VERTICAL, 0, 300, 124);
           JSlider velocity=new JSlider(JSlider.VERTICAL, 0, 101, 50);
           gravity.setLabelTable(lT1);
           gravity.setPaintLabels(true);
           friction.setLabelTable(lT2);
           friction.setPaintLabels(true);
           springiness.setLabelTable(lT3);
           springiness.setPaintLabels(true);
           fps.setLabelTable(lT4);
           fps.setPaintLabels(true);
           velocity.setLabelTable(lT5);
           velocity.setPaintLabels(true);
           JMenuBar Bar2=new JMenuBar();
           Bar2.add(gravity);
           Bar2.add(friction);
           Bar2.add(springiness);
           Bar2.add(velocity);
           Bar2.add(fps);
           gravity.addChangeListener(this);
           friction.addChangeListener(this);
           springiness.addChangeListener(this);
           fps.addChangeListener(this);
           velocity.addChangeListener(this);
           return Bar2;
       }
       public void mouseClicked (MouseEvent me) {
           mx=me.getX();
           my=me.getY();
           MassFound=false;
           for(int i=0; i<numberofmasses+1;i++) {
               if(mx>masses[i][0]) {
                   if(mx-10<masses[i][0]) {
                       if(my>masses[i][1]) {
                           if(my-10<masses[i][1]) {
                               foundm=i;
                               MassFound=true;
                           }
                       }
                   }
               }
           }
           SpringFound=false;
           for(int i=0;i<numberofsprings;i++) {
              double a=((masses[(int)springs[i][0]][1]-masses[(int)springs[i][1]][1])/(masses[(int)springs[i][0]][0]-masses[(int)springs[i][1]][0]));
              double b=((masses[(int)springs[i][0]][1]-masses[(int)springs[i][0]][0]*a));
              double q=0;
              double u=0;
              double w=0;
              double m=0;
              if(masses[(int)springs[i][0]][0]>masses[(int)springs[i][1]][0]) {
                  q=masses[(int)springs[i][0]][0];
                  u=masses[(int)springs[i][1]][0];
               } else {
                  q=masses[(int)springs[i][1]][0];
                  u=masses[(int)springs[i][0]][0];
               }
               if(masses[(int)springs[i][0]][1]>masses[(int)springs[i][1]][1]) {
                  w=masses[(int)springs[i][0]][1];
                  m=masses[(int)springs[i][1]][1];
               } else {
                  w=masses[(int)springs[i][1]][1];
                  m=masses[(int)springs[i][0]][1];
               }
              if(my-5<a*mx+b) {
                  if(my+5>a*mx+b) {
                      if(mx<q) {
                          if(mx>u) {
                              if(my<w) {
                                  if(my>m) {
                                      if(MakingSpring==false) {
                                          founds=i;
                                          SpringFound=true;
                                       }
                                   }
                               }
                           }
                       }
                   }
               }
           }
           if(MassFound==true) {
               SpringFound=false;
           }
           if(SpringFound==false) {
               if(MassFound==false) {
                   if(mode=="Construct"){
                       masses[numberofmasses][0]=mx;
                       masses[numberofmasses][1]=my;
                       masses[numberofmasses][6]=1;
                       int Tempi=0;
                       if(mamode=="Fixed Mass") {
                           Tempi=1;
                       }
                       masses[numberofmasses][4]=Tempi;
                       numberofmasses++;
                       if(MakingSpring==true) {
                           springs[numberofsprings][1]=numberofmasses-1;
                           double Tempd=Math.sqrt((masses[(int)springs[numberofsprings][0]][0]-masses[(int)springs[numberofsprings][1]][0])*(masses[(int)springs[numberofsprings][0]][0]-masses[(int)springs[numberofsprings][1]][0])+(masses[(int)springs[numberofsprings][0]][1]- masses[(int)springs[numberofsprings][1]][1])*(masses[(int)springs[numberofsprings][0]][1]- masses[(int)springs[numberofsprings][1]][1]));
                           springs[numberofsprings][2]=Tempd;
                           springs[numberofsprings][3]=Tempd;
                           springs[numberofsprings][6]=1;
                           if(spmode=="Barspring") {
                               if(masses[(int)springs[numberofsprings][0]][4]*masses[(int)springs[numberofsprings][1]][4]==1) {
                                   springs[numberofsprings][4]=1;
                               }
                           }
                           numberofsprings++;
                           MakingSpring=false;
                       }
                   }
               }
           } else {
               if(mode=="Delete") {
                   springs[founds][6]=0;
               } else if(mode=="Construct") {
                   boolean MF=false;
                   for(int i=0;i<Panel1.numberofmuscles;i++) {
                       if(Panel1.muscles[i][0]==founds) {
                           MF=true;
                       }
                   }
                   if(MF==false) {
                       Panel1.NewMuscle(founds);
                   }
               } else if(mode=="Simulate") {
                   boolean MF=false;
                   for(int i=0;i<Panel1.numberofmuscles;i++) {
                       if(Panel1.muscles[i][0]==founds) {
                           MF=true;
                       }
                   }
                   if(MF==false) {
                       Panel1.NewMuscle(founds);
                   }
               }
           }
               if(MassFound==true) {
                   if(mode=="Construct") {
                       if(MakingSpring==false) {
                           springs[numberofsprings][0]=foundm;
                           MakingSpring=true;
                       } else {
                           springs[numberofsprings][1]=foundm;
                           MakingSpring=false;
                           double Tempd=Math.sqrt((masses[(int)springs[numberofsprings][0]][0]-masses[(int)springs[numberofsprings][1]][0])*(masses[(int)springs[numberofsprings][0]][0]-masses[(int)springs[numberofsprings][1]][0])+(masses[(int)springs[numberofsprings][0]][1]- masses[(int)springs[numberofsprings][1]][1])*(masses[(int)springs[numberofsprings][0]][1]- masses[(int)springs[numberofsprings][1]][1]));
                           springs[numberofsprings][2]=Tempd;
                           springs[numberofsprings][3]=Tempd;
                           if(spmode=="Barspring") {
                               if(masses[(int)springs[numberofsprings][0]][4]*masses[(int)springs[numberofsprings][1]][4]==1) {
                                   springs[numberofsprings][4]=1;
                               }
                           }
                           springs[numberofsprings][6]=1;
                           numberofsprings++;
                       }
                   } else if(mode=="Delete") {
                       masses[foundm][6]=0;
                       for(int i=0;i<numberofsprings;i++) {
                           if(springs[i][0]==foundm) {
                               springs[i][6]=0;
                           }
                           if(springs[i][1]==foundm) {
                               springs[i][6]=0;
                           }
                       }
                   }
                   MassFound=false;
               }
           repaint();
       }
       public void mouseEntered (MouseEvent me) {}
       public void mousePressed (MouseEvent me) {
           mx=me.getX();
           my=me.getY();
           MassFound=false;
           MASS=0-1;
           for(int i=0; i<numberofmasses+1;i++) {
               if(mx+10>masses[i][0]) {
                   if(mx-10<masses[i][0]) {
                       if(my+10>masses[i][1]) {
                           if(my-10<masses[i][1]) {
                               MASS=i;
                               MassFound=true;
                           }
                       }
                   }
               }
           }
       }
       public void mouseReleased (MouseEvent me) {
           masses[MASS][5]=0;
           MASS=0-1;
       }
       public void mouseExited (MouseEvent me) {}
       public void mouseMoved (MouseEvent me) {
           mou =me.getX();
           mouseY=me.getY();
       }
       public void keyPressed (KeyEvent ke) {}
       public void keyReleased (KeyEvent ke) {}
       public void mouseDragged (MouseEvent me) {
           if(!(MASS==0-1)) {
               masses[MASS][0]=me.getX()-5;
               masses[MASS][1]=me.getY()-5;
               masses[MASS][2]=0;
               masses[MASS][3]=0;
               masses[MASS][5]=1;
               repaint();
           }
       }
       public void stateChanged(ChangeEvent ce){
           JSlider source=(JSlider)ce.getSource();
           if(source.getMaximum()==102) {
               g=source.getValue()/10  ;
           } else if(source.getMaximum()==100) {
               f=source.getValue();
           } else if(source.getMaximum()==99) {
               k=source.getValue();
           } else if(source.getMaximum()==300) {
               if(!(source.getValue()==0)) {
                   spd=(3000/source.getValue());
               }
           } else if(source.getMaximum()==101) {
               v=source.getValue()-1;
           }
       }
       public void keyTyped(KeyEvent ke) {
           char c=ke.getKeyChar();
           if(c=='s') {
               mode="Simulate";
           } else if(c=='c') {
               mode="Construct";
           } else if(c=='d') {
               mode="Delete";
           } else if(c=='q') {
               mamode="Free Mass";
           } else if(c=='w') {
               mamode="Fixed Mass";
           } else if(c=='e') {
               spmode="Normal";
           } else if(c=='r') {
               spmode="Barspring";
           }
       }
       public void actionPerformed(ActionEvent e) {
           if(e.getActionCommand()=="Free Mass") {
               mamode="Free Mass";
           } else if(e.getActionCommand()=="Fixed Mass") {
               mamode="Fixed Mass";
           } else if(e.getActionCommand()=="Normal") {
               spmode="Normal";
           } else if(e.getActionCommand()=="Barspring") {
               spmode="Barspring";
           } else {
               mode=e.getActionCommand();
           }
           if(mode=="New") {
               for(int i=0;i<numberofmasses;i++) {
                   for(int j=0;j<6;j++) {
                       masses[i][j]=0;
                   }
               }
               for(int i=0;i<numberofsprings;i++) {
                   for(int j=0;j<6;j++) {
                       springs[i][j]=0;
                   }
               }
               numberofmasses=0;
               numberofsprings=0;
               mode="Construct";
           }
       }
       public void UpdatePhysics() {
           MakingSpring=false;
           for(int i=0;i<Panel1.numberofmuscles;i++) {
               springs[(int)Panel1.muscles[i][0]][2]=springs[(int)Panel1.muscles[i][0]][3]+springs[(int)Panel1.muscles[i][0]][3]*((double)Panel1.muscles[i][2]/60)*(.5+Math.sin((Math.PI/180)*(Panel1.disp+Panel1.muscles[i][1])));
           }
           for(int i=0;i<numberofsprings;i++) {
               if(springs[i][6]==1) {
                   if((masses[(int)springs[i][0]][4])+(masses[(int)springs[i][0]][5])>0) {
                       double a=masses[(int)springs[i][1]][0];
                       double b=masses[(int)springs[i][1]][1];
                       double c=masses[(int)springs[i][0]][0];
                       double d=masses[(int)springs[i][0]][1];
                       double m=Math.sqrt((a-c)*(a-c)+(b-d)*(b-d));
                       double n=springs[i][2];
                       double o=m-n;
                       o=0-k*o/198;
                       masses[(int)springs[i][1]][2]=((masses[(int)springs[i][1]][2]+(a-c)*o/m))*(1-f/100);
                       masses[(int)springs[i][1]][3]=((masses[(int)springs[i][1]][3]+(b-d)*o/m))*(1-f/100);
                   }
                   if((masses[(int)springs[i][1]][4])+(masses[(int)springs[i][1]][5])>0) {
                       double a=masses[(int)springs[i][0]][0];
                       double b=masses[(int)springs[i][0]][1];
                       double c=masses[(int)springs[i][1]][0];
                       double d=masses[(int)springs[i][1]][1];
                       double m=Math.sqrt((a-c)*(a-c)+(b-d)*(b-d));
                       double n=springs[i][2];
                       double o=m-n;
                       o=0-k*o/198;
                       masses[(int)springs[i][0]][2]=((masses[(int)springs[i][0]][2]+(a-c)*o/m))*(1-f/100);
                       masses[(int)springs[i][0]][3]=((masses[(int)springs[i][0]][3]+(b-d)*o/m))*(1-f/100);
                   }
                   if(masses[(int)springs[i][1]][4]*masses[(int)springs[i][0]][4]*masses[(int)springs[i][1]][5]*masses[(int)springs[i][0]][5]==0) {
                       double a=masses[(int)springs[i][0]][0];
                       double b=masses[(int)springs[i][0]][1];
                       double c=masses[(int)springs[i][1]][0];
                       double d=masses[(int)springs[i][1]][1];
                       double m=Math.sqrt((a-c)*(a-c)+(b-d)*(b-d));
                       double n=springs[i][2];
                       double o=m-n;
                       o=0-k*o/396;
                       masses[(int)springs[i][0]][2]=(masses[(int)springs[i][0]][2]+(a-c)*o/m)*(1-f/100);
                       masses[(int)springs[i][0]][3]=(masses[(int)springs[i][0]][3]+(b-d)*o/m)*(1-f/100);
                       masses[(int)springs[i][1]][2]=(masses[(int)springs[i][1]][2]-(a-c)*o/m)*(1-f/100);
                       masses[(int)springs[i][1]][3]=(masses[(int)springs[i][1]][3]-(b-d)*o/m)*(1-f/100);
                   }
               }
           }
           for(int i=0;i<numberofmasses;i++) {
               if(masses[i][4]==0) {
                   if(masses[i][5]==0) {
                       if(masses[i][6]==1) {
                           double mmmx=masses[i][0];
                           double mmmy=masses[i][1];
                           masses[i][3]+=g;
                           double mmx=masses[i][0]+masses[i][2];
                           double mmy=masses[i][1]+masses[i][3];
                           for(int j=0;j<numberofsprings;j++) {
                               if(masses[(int)springs[j][0]][0]-masses[(int)springs[j][1]][0]==0) {
                                   QQ=true;
                                   masses[(int)springs[j][0]][0]+=0.0001;
                               }
                               double a=(masses[(int)springs[j][0]][1]-masses[(int)springs[j][1]][1])/(masses[(int)springs[j][0]][0]-masses[(int)springs[j][1]][0]);
                               double b=masses[(int)springs[j][0]][1]-masses[(int)springs[j][0]][0]*a;
                               double q=0;
                               double u=0;
                               double w=0;
                               double m=0;
                               if(masses[(int)springs[j][0]][0]>masses[(int)springs[j][1]][0]) {
                                   q=masses[(int)springs[j][0]][0];
                                   u=masses[(int)springs[j][1]][0];
                               } else {
                                   q=masses[(int)springs[j][1]][0];
                                   u=masses[(int)springs[j][0]][0];
                               }
                               if(masses[(int)springs[j][0]][1]>masses[(int)springs[j][1]][1]) {
                                   w=masses[(int)springs[j][0]][1];
                                   m=masses[(int)springs[j][1]][1];
                               } else {
                                   w=masses[(int)springs[j][1]][1];
                                   m=masses[(int)springs[j][0]][1];
                               }
                               if(QQ==true) {
                                   masses[(int)springs[j][0]][0]-=0.0001;
                               }
                               QQ=false;
                               if(mmmy<mmmx*a+b) {
                                   if(mmy>mmx*a+b) {
                                       QQ=true;
                                   }
                               }
                               if(mmmy>mmmx*a+b) {
                                   if(mmy<mmx*a+b) {
                                       QQ=true;
                                   }
                               }
                               SpringFound=false;
                               if(QQ==true) {
                                       if(mmx<q) {
                                           if(mmx>u) {
                                               if(mmy<w) {
                                                   if(mmy>m) {
                                                       if(springs[j][4]==1) {
                                                           founds=i;
                                                           SpringFound=true;
                                                       }
                                                   }
                                               }
                                           }                                                    
                                       }
                               }
                               if(SpringFound==true) {
                                   vectora=new MVector(masses[i][2], masses[i][3], fbounce);
                                   vectorb=new MVector(masses[(int)springs[j][0]][0]-masses[(int)springs[j][1]][0], masses[(int)springs[j][0]][1]-masses[(int)springs[j][1]][1], fbounce);
                                   vectorb.Bounce(vectora);
                                   masses[i][2]=vectora.VX;
                                   masses[i][3]=vectora.VY;
                               }
                           }
                       }
                   }
               }
           }
           for(int i=0;i<numberofmasses;i++) {
               if(masses[i][4]==0) {
                   if(masses[i][5]==0) {
                       masses[i][2]=masses[i][2]*(1-f/100);
                       masses[i][3]=masses[i][3]*(1-f/100);
                       masses[i][0]=masses[i][0]+masses[i][2];
                       masses[i][1]=masses[i][1]+masses[i][3];
                           if(masses[i][1]>height-30) {
                               masses[i][1]=height-30;
                               masses[i][3]=0-masses[i][3];
                           } else if(masses[i][1]<30) {
                               masses[i][1]=30;
                               masses[i][3]=0-masses[i][3];
                           }
                           if(masses[i][0]>width-30) {
                               masses[i][0]=width-30;
                               masses[i][2]=0-masses[i][2];
                           } else if(masses[i][0]<30) {
                               masses[i][0]=30;
                               masses[i][2]=0-masses[i][2];
                           }
                   }
               }
           }
           repaint();
           disp+=(v/10);
           if(disp>360) {
               disp-=360;
           }
           Panel1.disp=disp;
           Panel1.repaint();
       }
       public void paint(Graphics g) {
           super.paint(g);
           if(MakingSpring==true) {
               g.drawLine(mou , mouseY, (int)masses[(int)springs[numberofsprings][0]][0]+5, (int)masses[(int)springs[numberofsprings][0]][1]+5);
           }
           for(int i=0; i<numberofmasses; i++) { 
               if(masses[i][6]==1) {
                   if(masses[i][4]==0) {
                       g.fillOval((int)masses[i][0],(int)masses[i][1], 10, 10 );
                   }
                   if(masses[i][4]==1) {
                       g.fillRect((int)masses[i][0],(int)masses[i][1], 10, 10 );
                   }
               }
           }
           for(int i=0;i<numberofsprings;i++) {
               if(springs[i][6]==1) {
                   if(springs[i][4]==1) {
                       g.setColor(Color.blue);
                   }
                   g.drawLine((int)masses[(int)springs[i][0]][0]+5, (int)masses[(int)springs[i][0]][1]+5, (int)masses[(int)springs[i][1]][0]+5, (int)masses[(int)springs[i][1]][1]+5);
                   g.setColor(Color.black);
               }
           }
           for(int i=0; i<Panel1.numberofmuscles;i++) {
               g.setColor(Color.red);
               double XA=masses[(int)springs[(int)Panel1.muscles[i][0]][0]][0]+2;
               double XB=masses[(int)springs[(int)Panel1.muscles[i][0]][1]][0]+2;
               double YA=masses[(int)springs[(int)Panel1.muscles[i][0]][0]][1]+2;
               double YB=masses[(int)springs[(int)Panel1.muscles[i][0]][1]][1]+2;
               g.fillOval((int)(XA+XB)/2, (int)(YA+YB)/2, 6, 6);
               g.setColor(Color.black);
           }
           if(!(Panel1.MUSCL==0-1)) {
               int i=Panel1.MUSCL;
               g.setColor(Color.green);
               double XA=masses[(int)springs[(int)Panel1.muscles[i][0]][0]][0]+2;
               double XB=masses[(int)springs[(int)Panel1.muscles[i][0]][1]][0]+2;
               double YA=masses[(int)springs[(int)Panel1.muscles[i][0]][0]][1]+2;
               double YB=masses[(int)springs[(int)Panel1.muscles[i][0]][1]][1]+2;
               g.fillOval((int)(XA+XB)/2, (int)(YA+YB)/2, 6, 6);
               g.setColor(Color.black);   
           }
       }
       public void run() {
           while(true){
               if(mode=="Simulate") {
                   UpdatePhysics();
               }
               repaint();
               try{
                   t.sleep(spd);
               }
               catch(InterruptedException e) {
               }
           }
       }
   }
   class MVector { 
       double VX, VY, Length, NVY, NVX, dot, fbounce;
       public MVector(double x, double y, double f) {
           VX=x;
           VY=y;
           Length=Math.sqrt(Math.pow(x,2)+Math.pow(y,2));
           NVX=x/Length;
           NVY=y/Length;
           fbounce=f;
       }
       public double Dot(MVector Q) {
           return Q.VX*this.VX+Q.VY*this.VY;
       }
       public double NDot(MVector Q) {
           return Q.VX*this.NVX+Q.VY*this.NVY;
       }
       public void Bounce(MVector Q) {
           dot=this.NDot(Q);
           Q.VX=fbounce*dot*NVX-Q.VX;
           Q.VY=fbounce*dot*NVY-Q.VY;
       }
   }     
           
       
   class SinePanel extends JFrame implements MouseListener, MouseMotionListener{
       public int width, height, disp, MUSCLE=0-1, MUSCL=0-1, mx, my, numberofmuscles=0;
       public int[][] muscles=new int[1000][4];
       public boolean MuscleFound, MuscleMade;
       public void init() {
           this.addMouseListener(this);
           this.addMouseMotionListener(this);
           setBackground(Color.white);
           width=getSize().width;
           height=getSize().height;
       }
       public void NewMuscle(int s) {
           muscles[numberofmuscles][0]=s;
           muscles[numberofmuscles][1]=150;
           muscles[numberofmuscles][2]=50;
           muscles[numberofmuscles][3]=1;
           numberofmuscles++;
       }
       public void mouseClicked(MouseEvent me) {
       }
       public void mouseExited(MouseEvent me) {}
       public void mouseEntered(MouseEvent me) {}
       public void mousePressed(MouseEvent me) {
           mx=me.getX();
           my=me.getY();
           MuscleFound=false;
           MUSCLE=0-1;
           for(int i=0; i<numberofmuscles+1;i++) {
               if(my+10>muscles[i][1]) {
                   if(my-10<muscles[i][1]) {
                       MUSCLE=i;
                       MuscleFound=true;
                   }
               }
           }
       }
       public void mouseMoved(MouseEvent me) {
           mx=me.getX();
           my=me.getY();
           MuscleFound=false;
           MUSCL=0-1;
           for(int i=0; i<numberofmuscles+1;i++) {
               if(my+10>muscles[i][1]) {
                   if(my-10<muscles[i][1]) {
                       MUSCL=i;
                       MuscleFound=true;
                   }
               }
           }
       }
       public void mouseDragged(MouseEvent me) {
           if(!(MUSCLE==0-1)) {
               muscles[MUSCLE][1]=me.getY();
               muscles[MUSCLE][2]=me.getX();
               if(muscles[MUSCLE][2]>60) {
                   muscles[MUSCLE][2]=60;
               }
               if(muscles[MUSCLE][2]<0) {
                   muscles[MUSCLE][2]=0;
               }
               repaint();
           }
       }
       public void mouseReleased(MouseEvent me) {
           MUSCLE=0-1;
       }
       public void paint(Graphics g) {
           super.paint(g);
           int oldX = 0;
           int oldY = 0;
           double radians;
           double cvtDegToRad=Math.PI/180;
           int x;
           int axis=(int)width/2;
           g.setColor(Color.red);
           for (int y=0; y<720; y++) {
               radians = (y+disp)*cvtDegToRad;
               x = (int)(60*Math.sin(radians) );
               g.drawLine(oldX/2+30, (int)((oldY+axis+20)/2), x/2+30, (int)((axis+y+20)/2));
               oldY = y;
               oldX = x;
           }
           for(int i=0;i<numberofmuscles+1;i++) {
               g.drawLine(0, muscles[i][1], 60, muscles[i][1]);
               g.fillOval(muscles[i][2], muscles[i][1]-2, 4, 4);
           }
       }
   }
Personal tools