m |
|
Line 1: |
Line 1: |
- |
| + | Great common sense here. Wish I'd thuoght of that. |
- | 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);
| + | |
- | }
| + | |
- | }
| + | |
- | }
| + | |
Great common sense here. Wish I'd thuoght of that.