diff --git a/CheckboxListener.java b/CheckboxListener.java new file mode 100644 index 0000000..065ced7 --- /dev/null +++ b/CheckboxListener.java @@ -0,0 +1,41 @@ +package project; + +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; + +import javax.swing.*; +import java.awt.*; + +public class CheckboxListener implements ItemListener { + + int actionNumber; + MidPanel mid; + JComboBox box; + Options opt; + JSlider slide; + JLabel label; + + public CheckboxListener(Options o, MidPanel m, JComboBox b, int number, JSlider s, JLabel l) { + mid = m; + box = b; + actionNumber = number; + opt = o; + slide = s; + label = l; + } + + @Override + public void itemStateChanged(ItemEvent arg0) { + if (box.getSelectedIndex() == 1) { + mid.change[actionNumber] = true; + opt.pos[2][actionNumber].add(slide); + opt.pos[2][actionNumber].add(label); + opt.pos[2][actionNumber].updateUI(); + } + else { + mid.change[actionNumber] = false; + opt.pos[2][actionNumber].removeAll(); + opt.pos[2][actionNumber].updateUI(); + } + } +} diff --git a/ForceListener.java b/ForceListener.java new file mode 100644 index 0000000..8ceb259 --- /dev/null +++ b/ForceListener.java @@ -0,0 +1,26 @@ +package project; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JCheckBox; + +public class ForceListener implements ActionListener { + + int action; + MidPanel mid; + JCheckBox box; + + public ForceListener(int a, MidPanel m, JCheckBox b) { + action = a; + mid = m; + box = b; + } + + @Override + public void actionPerformed(ActionEvent e) { + mid.change[action] = box.isSelected(); + + } + +} diff --git a/JOptionPaneMultiInput.java b/JOptionPaneMultiInput.java new file mode 100644 index 0000000..19d17f0 --- /dev/null +++ b/JOptionPaneMultiInput.java @@ -0,0 +1,49 @@ +package project; + +import java.awt.GridLayout; + +import javax.swing.*; + +public class JOptionPaneMultiInput +{ + Options options; + JOptionPaneMultiInput(String name,Options opt,int n) + { + options=opt; + JPanel myPanel = new JPanel(); + myPanel.setLayout(new GridLayout(2,3,10,10)); + + JTextField xField = new JTextField(5); + JTextField yField = new JTextField(5); + JTextField zField = new JTextField(5); + xField.setText("0"); + yField.setText("0"); + zField.setText("0"); + + myPanel.add(new JLabel("vx:")); + myPanel.add(new JLabel("vy:")); + myPanel.add(new JLabel("vz:")); + myPanel.add(xField); + myPanel.add(yField); + myPanel.add(zField); + int result = JOptionPane.showConfirmDialog(null, myPanel, + options.options.getString("insertvelocity")+" "+name, JOptionPane.OK_CANCEL_OPTION); + if (result == JOptionPane.OK_OPTION) { + if(n==1) + { + options.middle.v01x=Double.parseDouble(xField.getText()); + options.middle.v01y=Double.parseDouble(yField.getText()); + options.middle.v01z=Double.parseDouble(zField.getText()); + } + if(n==2) + { + options.middle.v02x=Double.parseDouble(xField.getText()); + options.middle.v02y=Double.parseDouble(yField.getText()); + options.middle.v02z=Double.parseDouble(zField.getText()); + } + System.out.println("x value: " + xField.getText()); + System.out.println("y value: " + yField.getText()); + System.out.println("z value: " + zField.getText()); + } + } +} \ No newline at end of file diff --git a/LeftPanel.java b/LeftPanel.java index 15f6512..edc05e9 100644 --- a/LeftPanel.java +++ b/LeftPanel.java @@ -36,33 +36,45 @@ public class LeftPanel extends JPanel { //JButton button1, button2; - GraphPanel panelgraph1x,panelgraph1y,panelgraph2x,panelgraph2y; + GraphPanel panelgraph1x,panelgraph1y,panelgraph1z,panelgraph2x,panelgraph2y,panelgraph2z; int preferedx,preferedy; XYSeries series1x; XYSeries series1y; + XYSeries series1z; + XYSeries series2x; XYSeries series2y; + XYSeries series2z; + LeftPanel() { preferedx=300; - preferedy=230; - this.setLayout(new GridLayout(4,1)); + preferedy=160; + this.setLayout(new GridLayout(6,1)); this.setBorder( BorderFactory.createEtchedBorder(EtchedBorder.LOWERED)); series1x = new XYSeries("x1(t)"); series1y=new XYSeries("y1(t)"); + series1z=new XYSeries("z1(t)"); + series2x=new XYSeries("x2(t)"); series2y=new XYSeries("y2(t)"); + series2z=new XYSeries("z2(t)"); panelgraph1x=new GraphPanel("x1(t)",series1x,preferedx,preferedy); panelgraph1y=new GraphPanel("y1(t)",series1y,preferedx,preferedy); + panelgraph1z=new GraphPanel("z1(t)",series1z,preferedx,preferedy); + panelgraph2x=new GraphPanel("x2(t)",series2x,preferedx,preferedy); panelgraph2y=new GraphPanel("y2(t)",series2y,preferedx,preferedy); + panelgraph2z=new GraphPanel("z2(t)",series2z,preferedx,preferedy); this.add(panelgraph1x); this.add(panelgraph1y); + this.add(panelgraph1z); this.add(panelgraph2x); this.add(panelgraph2y); + this.add(panelgraph2z); } } diff --git a/MenuTopPanel.java b/MenuTopPanel.java index 54c4f91..73a5be2 100644 --- a/MenuTopPanel.java +++ b/MenuTopPanel.java @@ -15,6 +15,7 @@ import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; +import java.util.ResourceBundle; import javax.swing.BorderFactory; import javax.swing.ImageIcon; @@ -46,16 +47,18 @@ public class MenuTopPanel extends JPanel { JMenuBar menuBar; - JMenu menu, submenu; - JMenuItem menuItemSave,menuItemStop,menuItemExit,menuItemOpen,menuItemStart,menuItemContinue; + JMenu menu, lngMenu; + JMenuItem menuItemSave,menuItemStop,menuItemExit,menuItemOpen,menuItemStart,menuItemContinue,menuItemEng, menuItemPl; JRadioButtonMenuItem rbMenuItem; JCheckBoxMenuItem cbMenuItem; MidPanel mid; + Options optionsPanel; boolean cont=false; LeftPanel left; - MenuTopPanel(MidPanel middle,LeftPanel lef) + MenuTopPanel(MidPanel middle,LeftPanel lef,Options rigth) { + optionsPanel=rigth; left=lef; mid=middle; this.setLayout(new GridLayout(1,1)); @@ -63,13 +66,46 @@ public class MenuTopPanel extends JPanel //Menu menuBar= new JMenuBar(); - menu=new JMenu("A menu"); - menu.getAccessibleContext().setAccessibleDescription("bajerek"); + menu=new JMenu(optionsPanel.options.getString("menu")); + menu.getAccessibleContext().setAccessibleDescription(optionsPanel.options.getString("menu")); menuBar.add(menu); + lngMenu=new JMenu(optionsPanel.options.getString("lngmenu")); + lngMenu.getAccessibleContext().setAccessibleDescription(optionsPanel.options.getString("lngmenu")); + menuBar.add(lngMenu); + menuItemPl= new JMenuItem(optionsPanel.options.getString("polish")); + ActionListener polishListener=new ActionListener() + { + + @Override + public void actionPerformed(ActionEvent arg0) + { + optionsPanel.options=ResourceBundle.getBundle("MessagesBundle_pl_PL",optionsPanel.locale); + changeLanguage(); + } + + }; + menuItemPl.addActionListener(polishListener); + + + menuItemEng= new JMenuItem(optionsPanel.options.getString("english")); + ActionListener englishListener=new ActionListener() + { + + @Override + public void actionPerformed(ActionEvent arg0) + { + optionsPanel.options=ResourceBundle.getBundle("MessagesBundle_en_GB",optionsPanel.locale); + changeLanguage(); + } + + }; + menuItemEng.addActionListener(englishListener); + lngMenu.add(menuItemPl); + lngMenu.add(menuItemEng); //Save - menuItemSave = new JMenuItem("Save"); - menuItemSave.getAccessibleContext().setAccessibleDescription("Save"); + menuItemSave = new JMenuItem(optionsPanel.options.getString("save")); + menuItemSave.getAccessibleContext().setAccessibleDescription(optionsPanel.options.getString("save")); ActionListener saveListener=new ActionListener() { @Override @@ -77,7 +113,7 @@ public void actionPerformed(ActionEvent e) { String filepath; JFileChooser filechooser=new JFileChooser(); - filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + filechooser.setCurrentDirectory(new File("/home/me/Documents")); int result=filechooser.showSaveDialog(mid); if(result==JFileChooser.APPROVE_OPTION) { @@ -94,34 +130,35 @@ public void actionPerformed(ActionEvent e) // dodawanie nowej strony do klasy reprezentujacej PDF Page page = pdfDoc.createPage(new Rectangle(794, 1123)); PDFGraphics2D g2 = page.getGraphics2D(); - left.panelgraph1x.chart.draw(g2, new Rectangle(0,0,794, 562),new Point(0,0), null); - left.panelgraph1y.chart.draw(g2, new Rectangle(0,562,794, 562),new Point(562,100), null); - + left.panelgraph1x.chart.draw(g2, new Rectangle(0,0,794, 370),new Point(0,0), null); + left.panelgraph1y.chart.draw(g2, new Rectangle(0,370,794, 370),new Point(562,100), null); + left.panelgraph1z.chart.draw(g2, new Rectangle(0,740,794, 370),new Point(562,100), null); Page page2 = pdfDoc.createPage(new Rectangle(794, 1123)); PDFGraphics2D g2page2 = page2.getGraphics2D(); - left.panelgraph2x.chart.draw(g2page2, new Rectangle(0,0,794, 562),new Point(0,0), null); - left.panelgraph2y.chart.draw(g2page2, new Rectangle(0,562,794, 562),new Point(562,100), null); - + left.panelgraph2x.chart.draw(g2page2, new Rectangle(0,0,794, 370),new Point(0,0), null); + left.panelgraph2y.chart.draw(g2page2, new Rectangle(0,370,794, 370),new Point(562,100), null); + left.panelgraph2z.chart.draw(g2page2, new Rectangle(0,740,794, 370),new Point(562,100), null); // Tworzenie pustego pliku - File file = new File(filepath+"/Dane.pdf"); + File file = new File(filechooser.getSelectedFile()+".pdf"); // zapis do pliku zawartosci dodanej do obiektu pdfDoc pdfDoc.writeToFile(file); try { - PrintWriter zapis=new PrintWriter(filepath+"/Wyniki.txt"); + PrintWriter zapis=new PrintWriter(filechooser.getSelectedFile()+".txt"); int i=0; - zapis.println("#"+"\t"+"Czas t"+"\t"+"x1"+"\t"+"y1"+"\t"+"x2"+"\t"+"y2"); + zapis.println("#"+"\t"+"Czas t"+"\t"+"x1"+"\t"+"y1"+"\t"+"z1"+"\t"+"x2"+"\t"+"y2"+"\t"+"z2"); + zapis.println("!"+"\t"+"dt:"+"\t"+mid.dt); for(double w:mid.m1.xn) { - zapis.println((i*mid.dt)+"\t"+mid.m1.xn.get(i)+"\t"+mid.m1.yn.get(i)+"\t"+mid.m2.xn.get(i)+"\t"+mid.m2.yn.get(i)); + zapis.println((i*mid.dt)+"\t"+mid.m1.xn.get(i)+"\t"+mid.m1.yn.get(i)+"\t"+mid.m1.zn.get(i)+"\t"+mid.m2.xn.get(i)+"\t"+mid.m2.yn.get(i)+"\t"+mid.m2.zn.get(i)); i++; } zapis.close(); } catch (FileNotFoundException e1) { - // TODO Auto-generated catch block + e1.printStackTrace(); } @@ -130,12 +167,43 @@ public void actionPerformed(ActionEvent e) }; menuItemSave.addActionListener(saveListener); //Open - menuItemOpen= new JMenuItem("Open"); - menuItemOpen.getAccessibleContext().setAccessibleDescription("Open"); - + menuItemOpen= new JMenuItem(optionsPanel.options.getString("open")); + menuItemOpen.getAccessibleContext().setAccessibleDescription(optionsPanel.options.getString("open")); + ActionListener openListener=new ActionListener() + { + + @Override + public void actionPerformed(ActionEvent arg0) + { + String filepath; + JFileChooser filechooser=new JFileChooser(); + int result=filechooser.showOpenDialog(mid); + if(result==JFileChooser.APPROVE_OPTION) + { + filepath=(filechooser.getSelectedFile().getAbsolutePath()); + if(mid.stop) + { + left.series1x.clear(); + left.series1y.clear(); + left.series1z.clear(); + + left.series2x.clear(); + left.series2y.clear(); + left.series2z.clear(); + } + mid.stop=false; + mid.check=false; + mid.startOpenedAnimation(filepath); + } + + + } + + }; + menuItemOpen.addActionListener(openListener); //Exit - menuItemExit=new JMenuItem("Exit"); - menuItemExit.getAccessibleContext().setAccessibleDescription("Exit"); + menuItemExit=new JMenuItem(optionsPanel.options.getString("exit")); + menuItemExit.getAccessibleContext().setAccessibleDescription(optionsPanel.options.getString("exit")); //Kontrola zdarzeń ActionListener exitListener=new ActionListener() { @@ -149,12 +217,14 @@ public void actionPerformed(ActionEvent e) - menuItemStart=new JMenuItem("Start"); + menuItemStart=new JMenuItem(optionsPanel.options.getString("start")); ActionListener startListener=new ActionListener() { @Override public void actionPerformed(ActionEvent e) { + mid.joption=new JOptionPaneMultiInput(optionsPanel.options.getString("mass1"),optionsPanel,1); + mid.joption=new JOptionPaneMultiInput(optionsPanel.options.getString("mass2"),optionsPanel,2); if(mid.check) { if(mid.stop) @@ -163,6 +233,8 @@ public void actionPerformed(ActionEvent e) left.series1y.clear(); left.series2x.clear(); left.series2y.clear(); + left.series1z.clear(); + left.series2z.clear(); } mid.stop=false; mid.check=false; @@ -172,9 +244,9 @@ public void actionPerformed(ActionEvent e) } }; menuItemStart.addActionListener(startListener); - menuItemStart.getAccessibleContext().setAccessibleDescription("Start"); + menuItemStart.getAccessibleContext().setAccessibleDescription(optionsPanel.options.getString("start")); - menuItemStop=new JMenuItem("Stop"); + menuItemStop=new JMenuItem(optionsPanel.options.getString("stop")); ActionListener stopListener=new ActionListener() { @Override @@ -188,9 +260,9 @@ public void actionPerformed(ActionEvent e) } }; menuItemStop.addActionListener(stopListener); - menuItemStop.getAccessibleContext().setAccessibleDescription("Stop"); + menuItemStop.getAccessibleContext().setAccessibleDescription(optionsPanel.options.getString("stop")); - menuItemContinue=new JMenuItem("Continue"); + menuItemContinue=new JMenuItem(optionsPanel.options.getString("continue")); ActionListener continueListener=new ActionListener() { @Override @@ -205,17 +277,17 @@ public void actionPerformed(ActionEvent e) } else if(!mid.stop) { - JOptionPane.showMessageDialog(mid, "You have to stop simulation first"); + JOptionPane.showMessageDialog(mid, optionsPanel.options.getString("stopSimEr")); } else { - JOptionPane.showMessageDialog(mid, "You haven't started simulation yet !!!!"); + JOptionPane.showMessageDialog(mid, optionsPanel.options.getString("startSimFirstEr")); } } }; menuItemContinue.addActionListener(continueListener); - menuItemContinue.getAccessibleContext().setAccessibleDescription("Continue"); + menuItemContinue.getAccessibleContext().setAccessibleDescription(optionsPanel.options.getString("continue")); menu.add(menuItemStart); menu.add(menuItemContinue); menu.add(menuItemStop); @@ -224,6 +296,30 @@ else if(!mid.stop) menu.add(menuItemExit); this.add(menuBar); } + + + + void changeLanguage() + { + menuItemSave.setText(optionsPanel.options.getString("save")); + menuItemStop.setText(optionsPanel.options.getString("stop")); + menuItemExit.setText(optionsPanel.options.getString("exit")); + menuItemOpen.setText(optionsPanel.options.getString("open")); + menuItemStart.setText(optionsPanel.options.getString("start")); + menuItemContinue.setText(optionsPanel.options.getString("continue")); + menuItemEng.setText(optionsPanel.options.getString("english")); + menuItemPl.setText(optionsPanel.options.getString("polish")); + menu.setText(optionsPanel.options.getString("menu")); + lngMenu.setText(optionsPanel.options.getString("lngmenu")); + optionsPanel.am.setText(optionsPanel.options.getString("mass1")); + optionsPanel.bm.setText(optionsPanel.options.getString("mass2")); + optionsPanel.mi.setText(optionsPanel.options.getString("u")); + optionsPanel.k.setText(optionsPanel.options.getString("k")); + optionsPanel.eta.setText(optionsPanel.options.getString("eta")); + //optionsPanel.mass1Change.setText(optionsPanel.options.getString("changeable")); + //optionsPanel.mass2Change.setText(optionsPanel.options.getString("changeable")); + optionsPanel.forces.setText(optionsPanel.options.getString("include")); + } diff --git a/MessagesBundle_en_GB.properties b/MessagesBundle_en_GB.properties new file mode 100644 index 0000000..ae7e8f4 --- /dev/null +++ b/MessagesBundle_en_GB.properties @@ -0,0 +1,20 @@ +mass1= Mass 1 +mass2= Mass2 +u= Coefficient of kinematic viscosity +k= Coefficient of elasticity +lngmenu= Languages +menu= Menu +start= Start +exit= Exit +open= Open +stopSimEr= You have to stop simulation first! +continue= Continue +save= Save +stop= Stop +startSimFirstEr=You haven't started simulation yet!!! +polish= Jezyk Polski +english= English Language(GB) +include= Include +changeable= Changeable +eta= density*area*constant +insertvelocity= Please insert starting velocity for \ No newline at end of file diff --git a/MessagesBundle_pl_PL.properties b/MessagesBundle_pl_PL.properties new file mode 100644 index 0000000..40ce5fb --- /dev/null +++ b/MessagesBundle_pl_PL.properties @@ -0,0 +1,20 @@ +mass1= Masa 1 +mass2= Masa 2 +u= Wspó\u0142czynnik lepko\u015Bci +k= Wspó\u0142czynnik spr\u0119\u017Cysto\u015Bci +lngmenu= J\u0119zyki +menu= Menu +start= Start +exit= Wyj\u015Bcie +open= Otwórz +stopSimEr= Musisz rozpocz\u0105\u0107 najpierw symulacje! +continue= Kontynuuj +save= Zapisz +stop= Stop +startSimFirstEr=Nie zacz\u0105\u0142\u0119\u015B jeszcze symulacji!!! +polish= Jezyk Polski +english= English Language(GB) +include= Uwzgl\u0119dnij +changeable= Zmienna +eta= g\u0119stosc*wspó\u0142czynnik*powierzchnia +insertvelocity= Prosze wprowadzi\u0107 pr\u0119dko\u015B\u0107 pocz\u0105tkow\u0105 dla \ No newline at end of file diff --git a/MidPanel.java b/MidPanel.java index 6bdc16f..02774c2 100644 --- a/MidPanel.java +++ b/MidPanel.java @@ -1,3 +1,4 @@ + package project; import java.awt.BasicStroke; @@ -46,16 +47,32 @@ public class MidPanel extends JPanel boolean stop=false; double dt; double k; + double mi; + double eta; + double[] h; double mass1,mass2; LeftPanel left; boolean check=true; + boolean[] change; //1 - czy m1 sie zmienia; 2 - to samo dla m2; 3 - czy dziala sila lepkosci; 4 - sila aleblablaniczna CartesianPanel background; + JOptionPaneMultiInput joption; + double v01x,v01y,v01z,v02x,v02y,v02z; MidPanel(LeftPanel leftt) { left=leftt; + v01x=0; + v01y=0; + v01z=0; + v02x=0; + v02y=0; + v02z=0; + this.setMinimumSize(new Dimension(1000,1000)); this.setBorder( BorderFactory.createEtchedBorder(EtchedBorder.LOWERED)); this.setBackground(Color.white); + change = new boolean[5]; + h = new double[2]; + for (int i = 0; i<5; i++) change[i] = false; } public void paintComponent(Graphics g) @@ -93,20 +110,41 @@ else if(paintm2.y>=this.getHeight()) paintm1.y=paintm1.y-this.getHeight()/2; paintm2.y=paintm2.y-this.getHeight()/2; } - g2d.setStroke(new BasicStroke()); + + //System.out.println("dziala"); + g2d.setStroke(new BasicStroke()); g2d.setColor(Color.WHITE); g2d.fillRect(0,0,this.getWidth(),this.getHeight()); - Stroke stroke = new BasicStroke(2f); + final float dash1[] = {10.0f}; + final BasicStroke dashed = + new BasicStroke(2.0f, + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 10.0f, dash1, 0.0f); + Stroke stroke = dashed; g2d.setColor(Color.BLACK); - g2d.setStroke(stroke); - g2d.drawLine((int) paintm1.x,(int) paintm1.y,(int) paintm2.x,(int) paintm2.y); - - g2d.setColor(Color.GREEN); - g2d.fillOval((int) paintm1.x,(int) paintm1.y,30,30); + g2d.setStroke(new ZigzagStroke(new BasicStroke(), 3, 3)); + g2d.drawLine((int) (paintm1.x+10),(int) (paintm1.y+10),(int) (paintm2.x+10),(int) (paintm2.y+10)); + + g2d.setStroke(new BasicStroke(2)); + + if(m1.z>m2.z) + { + g2d.setColor(Color.GREEN); + g2d.fillOval((int) paintm1.x,(int) paintm1.y,m1.sizex,m1.sizey); g2d.setColor(Color.RED); - g2d.fillOval((int) paintm2.x,(int) paintm2.y,30,30); + g2d.fillOval((int) paintm2.x,(int) paintm2.y,m2.sizex,m2.sizey); + } + else + { + g2d.setColor(Color.RED); + g2d.fillOval((int) paintm2.x,(int) paintm2.y,m2.sizex,m2.sizey); + g2d.setColor(Color.GREEN); + g2d.fillOval((int) paintm1.x,(int) paintm1.y,m1.sizex,m1.sizey); + } + } else if(stop) @@ -118,13 +156,27 @@ else if(stop) g2d.setColor(Color.WHITE); g2d.fillRect(0,0,this.getWidth(),this.getHeight()); + g2d.setColor(Color.BLACK); - g2d.drawLine((int) paintm1.x,(int) paintm1.y,(int) paintm2.x,(int) paintm2.y); + g2d.setStroke(new ZigzagStroke(new BasicStroke(), 3, 3)); + g2d.drawLine((int) (paintm1.x+10),(int) (paintm1.y+10),(int) (paintm2.x+10),(int) (paintm2.y+10)); + + g2d.setStroke(new BasicStroke(2)); + if(m1.z>m2.z) + { g2d.setColor(Color.GREEN); - g2d.fillOval((int) paintm1.x,(int) paintm1.y,30,30); + g2d.fillOval((int) paintm1.x,(int) paintm1.y,m1.sizex,m1.sizey); g2d.setColor(Color.RED); - g2d.fillOval((int) paintm2.x,(int) paintm2.y,30,30); - } + g2d.fillOval((int) paintm2.x,(int) paintm2.y,m2.sizex,m2.sizey); + } + else + { + g2d.setColor(Color.RED); + g2d.fillOval((int) paintm2.x,(int) paintm2.y,m2.sizex,m2.sizey); + g2d.setColor(Color.GREEN); + g2d.fillOval((int) paintm1.x,(int) paintm1.y,m1.sizex,m1.sizey); + } + } } @@ -132,8 +184,8 @@ else if(stop) void startAnimation() { start=true; - m1=new Object(0,this.getHeight()/2,0,0,0,0,mass1); - m2=new Object(100,this.getHeight()/2 ,0,20,10,0,mass2); + m1=new Object(0,this.getHeight()/2,0,v01x,v01y,v01z,mass1); + m2=new Object(100,this.getHeight()/2 ,0,v02x,v02y,v02z,mass2); l1=new Rope(m1,m2); this.repaint(); ExecutorService ex=Executors.newFixedThreadPool(1); @@ -146,5 +198,15 @@ void continueAnimation() ExecutorService ex=Executors.newFixedThreadPool(1); ex.submit(new RunAnimation(this,left)); } - + void startOpenedAnimation(String filepath) + { + start=true; + m1=new Object(0,this.getHeight()/2,0,0,0,0,mass1); + m2=new Object(100,this.getHeight()/2 ,0,0,0,0,mass2); + l1=new Rope(m1,m2); + ExecutorService ex=Executors.newFixedThreadPool(1); + ex.submit(new RunOpenedAnimation(left,this,filepath)); + } } + + diff --git a/Object.java b/Object.java index 942bff8..9f38d5a 100644 --- a/Object.java +++ b/Object.java @@ -16,6 +16,10 @@ public class Object double az; ArrayList xn; ArrayList yn; + ArrayList zn; + int sizex; + int sizey; + Object(double xx,double yy,double zz,double vvx,double vvy,double vvz,double m) { x=xx; @@ -25,8 +29,12 @@ public class Object vy=vvy; vz=vvz; mass=m; + sizex=30; + sizey=30; xn=new ArrayList(); yn=new ArrayList(); + zn=new ArrayList(); + //System.out.println(vx); } } diff --git a/Options.java b/Options.java index 75dea2a..8b4f7e6 100644 --- a/Options.java +++ b/Options.java @@ -8,29 +8,40 @@ import java.awt.*; import java.awt.event.*; +import java.util.Locale; +import java.util.ResourceBundle; public class Options extends JPanel { MidPanel middle; + JLabel am; //Wszystkie etykietki JLabel bm; JLabel k; JLabel mi; JLabel forces; + JLabel eta; JSlider sliderm1; //slidery do mas i współczynników JSlider sliderm2; JSlider sliderK; JSlider sliderMi; + JSlider sliderEta; + + JSlider sliderm1Change; + JSlider sliderm2Change; JLabel amEcho; //Etykietki wyświetlają wartości ustawione na suwakach JLabel bmEcho; JLabel kEcho; JLabel miEcho; + JLabel h1Echo; + JLabel h2Echo; + JLabel etaEcho; - JCheckBox mass1Change; //Wszystkie CheckBoxy - JCheckBox mass2Change; //Dwa do zmiany mas, 3 do uwzględnianych sił + //Wszystkie CheckBoxy + //Dwa do zmiany mas, 3 do uwzględnianych sił JCheckBox fn; JCheckBox fs; JCheckBox fl; @@ -38,11 +49,18 @@ public class Options extends JPanel JComboBox mass1Function; //Wybór funkcji zmiany parametrów w czasie JComboBox mass2Function; JComboBox kFunction; - + + Locale locale; JPanel[][] pos; //Tablica paneli do ogarnięcia layoutu + ResourceBundle options; public Options(MidPanel mid) { + + locale = new Locale("PL", "POL"); + + options= ResourceBundle.getBundle("MessagesBundle_en_GB",locale); + middle=mid; this.setBorder( BorderFactory.createEtchedBorder(EtchedBorder.LOWERED)); this.setLayout(new GridLayout(6,2)); //Rozmieszczam panele @@ -58,34 +76,49 @@ public Options(MidPanel mid) pos[0][1].setLayout(new BorderLayout()); pos[3][0].setLayout(new BorderLayout()); pos[4][0].setLayout(new BorderLayout()); + pos[4][1].setLayout(new BorderLayout()); + + + am = new JLabel(options.getString("mass1")); + bm = new JLabel(options.getString("mass2")); + k = new JLabel(options.getString("k")); + mi = new JLabel(options.getString("u")); + forces = new JLabel(options.getString("include")); + eta = new JLabel(options.getString("eta")); - am = new JLabel("Masa 1 początkowa"); - bm = new JLabel("Masa 2 początkowa"); - k = new JLabel("Współczynnik sprężystości"); - mi = new JLabel("Współczynnik lepkości"); - forces = new JLabel("Uwzględnij"); sliderm1 = new JSlider(JSlider.HORIZONTAL, 0, 100, 1); sliderm2 = new JSlider(JSlider.HORIZONTAL, 0, 100, 1); sliderK = new JSlider(JSlider.HORIZONTAL, 0, 100, 10); sliderMi = new JSlider(JSlider.HORIZONTAL, 0, 100, 10); + sliderEta = new JSlider(JSlider.HORIZONTAL, 0, 10000, 1000); + + sliderm1Change = new JSlider(JSlider.HORIZONTAL, 0, 100, 10); + sliderm2Change = new JSlider(JSlider.HORIZONTAL, 0, 100, 10); amEcho = new JLabel(String.format("%.2f kg", (double) sliderm1.getValue())); bmEcho = new JLabel(String.format("%.2f kg", (double) sliderm2.getValue())); kEcho = new JLabel(String.format("%.2f N/m", (double) sliderK.getValue())); miEcho = new JLabel(String.format("%.2f kg*m/s", (double) sliderMi.getValue())); + h1Echo = new JLabel(String.format("%.2f", (double) sliderm1Change.getValue())); + h2Echo = new JLabel(String.format("%.2f", (double) sliderm2Change.getValue())); + etaEcho = new JLabel(String.format("%.2f", (double) sliderEta.getValue())); Border b = BorderFactory.createLineBorder(Color.BLACK, 1); amEcho.setBorder(b); bmEcho.setBorder(b); kEcho.setBorder(b); miEcho.setBorder(b); + etaEcho.setBorder(b); sliderm1.addChangeListener(new ValueListener(amEcho, sliderm1, 10, "kg",middle,1)); sliderm2.addChangeListener(new ValueListener(bmEcho, sliderm2, 10, "kg",middle,2)); sliderK.addChangeListener(new ValueListener(kEcho, sliderK, 20, "N/m",middle,4)); - sliderMi.addChangeListener(new ValueListener(miEcho, sliderMi, 20, "kg*m/s",middle,5)); + sliderMi.addChangeListener(new ValueListener(miEcho, sliderMi, 500, "kg*m/s",middle,5)); + sliderm1Change.addChangeListener(new ValueListener(h1Echo, sliderm1Change, 100, "", middle, 6)); + sliderm2Change.addChangeListener(new ValueListener(h2Echo, sliderm2Change, 100, "", middle, 7)); + sliderEta.addChangeListener(new ValueListener(etaEcho, sliderEta, 500000, "kg/m", middle, 8)); String[] functions = {"m(t) = m", "m(t) = m*e^(-xt)"}; mass1Function = new JComboBox(functions); @@ -96,12 +129,15 @@ public Options(MidPanel mid) String[] functions2 = {"k(t) = k", "k(t) = k*(1+l)"}; kFunction = new JComboBox(functions2); kFunction.setSelectedIndex(0); - - mass1Change = new JCheckBox("Zmienna", false); - mass2Change = new JCheckBox("Zmienna", false); fn = new JCheckBox("Fn", false); fs = new JCheckBox("Fs", true); fl = new JCheckBox("Fl", false); + + fl.addActionListener(new ForceListener(3, mid, fl)); + fn.addActionListener(new ForceListener(4, mid, fn)); + + mass1Function.addItemListener(new CheckboxListener(this, middle, mass1Function, 0, sliderm1Change, h1Echo)); + mass2Function.addItemListener(new CheckboxListener(this, middle, mass2Function, 1, sliderm2Change, h2Echo)); pos[0][0].add(am, BorderLayout.PAGE_START); pos[0][0].add(amEcho, BorderLayout.PAGE_END); @@ -109,9 +145,7 @@ public Options(MidPanel mid) pos[0][1].add(bmEcho, BorderLayout.PAGE_END); pos[0][0].add(sliderm1, BorderLayout.CENTER); pos[0][1].add(sliderm2, BorderLayout.CENTER); - pos[1][0].add(mass1Change); pos[1][0].add(mass1Function); - pos[1][1].add(mass2Change); pos[1][1].add(mass2Function); pos[3][0].add(k, BorderLayout.PAGE_START); pos[3][0].add(kEcho, BorderLayout.PAGE_END); @@ -120,6 +154,9 @@ public Options(MidPanel mid) pos[4][0].add(mi, BorderLayout.PAGE_START); pos[4][0].add(miEcho, BorderLayout.PAGE_END); pos[4][0].add(sliderMi, BorderLayout.CENTER); + pos[4][1].add(eta, BorderLayout.PAGE_START); + pos[4][1].add(etaEcho, BorderLayout.PAGE_END); + pos[4][1].add(sliderEta, BorderLayout.CENTER); pos[5][0].add(forces); pos[5][1].add(fn); pos[5][1].add(fs); diff --git a/Rope.java b/Rope.java index b90d4c0..9ea0fd5 100644 --- a/Rope.java +++ b/Rope.java @@ -4,105 +4,46 @@ public class Rope { double[] l; - double alfa; - double l0; + double lc; + static double l0; double r; Object m1,m2; - static boolean secoperationx=false; - static boolean secoperationy=false; Rope(Object mm1, Object mm2 ) { l=new double[3]; m1=mm1; m2=mm2; - l[0]=Math.abs(m1.x-m2.x); - l[1]=Math.abs(m1.y-m2.y); - l[2]=Math.abs(m1.z-m2.z); + l[0]=m1.x-m2.x; + l[1]=m1.y-m2.y; + l[2]=m1.z-m2.z; l0=Math.sqrt(Math.pow(l[0],2)+Math.pow(l[1],2)+Math.pow(l[2],2)); + //System.out.println(l0); + //System.out.println(l[0]); + lc=l0; - //System.out.println(Math.toRadians(180)); - //System.out.println("l="+l); } - void calculateAlpha(Object mm1,Object mm2) + void calculateLength() //Oblicza całk. długość { - //r=Math.sqrt(Math.pow((mm2.x-mm1.x), 2)+Math.pow((mm2.y-mm1.y),2)); - //System.out.println(r); - alfa=(Math.atan2((mm2.y-mm1.y),(mm2.x-mm1.x))); - //System.out.println(alfa*180/Math.PI); - /*if(Math.abs(mm1.x-mm2.x)==0) - { - alfa=-Math.PI/2; - } - else if((mm2.y-mm1.y)>=0 && (mm2.x-mm1.x)>=0) - { - alfa=(Math.atan((mm2.y-mm1.y)/(mm2.x-mm1.x))); - System.out.println("alfa1: "+ alfa*180/Math.PI); - } - else if((mm2.y-mm1.y)>0 && (mm2.x-mm1.x)<0) - { - alfa=(Math.atan((mm2.y-mm1.y)/(mm2.x-mm1.x)))+Math.PI; - System.out.println("alfa2: "+ alfa*180/Math.PI); - - } - else if((mm2.y-mm1.y)<=0 && (mm2.x-mm1.x)<=0) - { - alfa=Math.abs(Math.atan((mm2.y-mm1.y)/(mm2.x-mm1.x)))+Math.PI; - System.out.println("alfa3: "+ alfa*180/Math.PI); - - } - else if((mm2.y-mm1.y)<0 && (mm2.x-mm1.x)>0) - { - alfa=(Math.atan((mm2.y-mm1.y)/(mm2.x-mm1.x)))+2*Math.PI; - System.out.println("alfa4: "+ alfa*180/Math.PI); - - - }*/ - + lc = Math.sqrt(Math.pow(l[0],2)+Math.pow(l[1],2)+Math.pow(l[2],2)); } - double calculateDeltax(Object mm1,Object mm2)//oblicza rozciagniecie sprezyny w kierunku x + double calculateDeltax()//oblicza rozciagniecie sprezyny w kierunku x { - - if(!secoperationx) - { - secoperationx=true; - //l[0]=l0*(mm2.x-mm1.x)/r; - l[0]=l0*(Math.cos(alfa)); - - - } - //System.out.println("cosfi: "+l[0]/l0); - - - - return (l[0]-Math.abs(mm1.x-mm2.x)); - + l[0]=m1.x-m2.x; + return (l[0]*(lc-l0)/l0); } - double calculateDeltay(Object mm1,Object mm2)//oblicza rociagniecie sprezyzny w kierunku y + double calculateDeltay()//oblicza rociagniecie sprezyzny w kierunku y { - if(!secoperationy) - { - secoperationy=true; - //System.out.println("alfay: "+ alfa); - //l[1]=l0*(mm2.y-mm1.y)/r; - l[1]=l0*(Math.sin(alfa)); - - - - } - //System.out.println("sinfi: "+l[1]/l0); - //System.out.println("jedynka tryg: "+(Math.pow(l[0]/l0,2)+Math.pow(l[1]/l0, 2))); - - return (l[1]-Math.abs(mm1.y-mm2.y)); + l[1]=m1.y-m2.y; + return (l[1]*(lc-l0)/l0); } - double calculateDeltaz(Object mm1,Object mm2) + double calculateDeltaz()//oblicza rozciagniecie sprezyny w kierunku z { - double previouslz=l[2]; - l[2]=Math.sqrt(Math.pow(l0,2)-Math.pow(l[0],2)-Math.pow(l[1],2)); - return (previouslz-Math.abs(mm1.z-mm2.z)); + l[2]=m1.z-m2.z; + return (l[2]*(lc-l0)/l0); } } diff --git a/RunAnimation.java b/RunAnimation.java index 8875f2e..b135167 100644 --- a/RunAnimation.java +++ b/RunAnimation.java @@ -8,17 +8,25 @@ public class RunAnimation implements Runnable { MidPanel middle; double K; + double Mi; double dt; + double Eta; + double[] h; LeftPanel left; double correction; static double stoptime=0; + double F1, F2; + int observationPointSpeed=3000; RunAnimation(MidPanel mid,LeftPanel leftt) { left=leftt; middle=mid; - dt=middle.dt; + dt=0.001;//middle.dt K=middle.k; + Mi=middle.mi; + h=middle.h; + Eta=middle.eta; correction=middle.getHeight()/2; } @@ -36,6 +44,7 @@ public void run() //w //System.out.println("stoptime:"+ stoptime); break; } + middle.l1.calculateLength(); calculateAnimationx(dt); left.series1x.add(t,middle.m1.x); left.series2x.add(t,middle.m2.x); @@ -43,49 +52,113 @@ public void run() //w calculateAnimationy(dt); left.series1y.add(t,middle.m1.y-correction); left.series2y.add(t,middle.m2.y-correction); + + calculateAnimationz(dt); + left.series1z.add(t,middle.m1.z); + left.series2z.add(t,middle.m2.z); + + + calculateParameters(dt); + middle.repaint(); left.repaint(); try { - Thread.sleep((long) (dt*1000)); + Thread.sleep((long) (dt*10)); } catch (InterruptedException e) { e.printStackTrace(); } + //System.out.println("Energia :"+((middle.m1.mass*(middle.m1.vx*middle.m1.vx+middle.m1.vy*middle.m1.vy)+middle.m2.mass*(middle.m2.vx*middle.m2.vx+middle.m2.vy*middle.m2.vy))/2+K*(middle.l1.l[0]-middle.l1.l0)*(middle.l1.l[0]-middle.l1.l0))); } middle.check=true; middle.stop=true; } - void calculateAnimationx(double dt) //oblicza os x tutaj chyba trzeba dac przypadki wyboru + //Wszystko co dzieje się na osi z + void calculateAnimationx(double dt) //oblicza os x { - middle.l1.calculateAlpha(middle.m1, middle.m2); - middle.m1.ax=-K*middle.l1.calculateDeltax(middle.m1, middle.m2)/(middle.m1.mass); - middle.m2.ax=K*middle.l1.calculateDeltax(middle.m1, middle.m2)/(middle.m2.mass); - middle.l1.secoperationx=false; + F1=-K*middle.l1.calculateDeltax(); + F2=K*middle.l1.calculateDeltax(); + if (middle.change[3]) { + F1-=Mi*middle.m1.vx; + F2-=Mi*middle.m2.vx; + } + if (middle.change[4]) { + F1-=Eta*Math.abs(middle.m1.vx)*middle.m1.vx; + F2-=Eta*Math.abs(middle.m2.vx)*middle.m2.vx; + } + middle.m1.ax=F1/(middle.m1.mass); + middle.m2.ax=F2/(middle.m2.mass); + middle.m1.vx+=middle.m1.ax*dt; middle.m2.vx+=middle.m2.ax*dt; + middle.m1.x+=middle.m1.vx*dt; middle.m2.x+=middle.m2.vx*dt; + middle.m1.xn.add(middle.m1.x); middle.m2.xn.add(middle.m2.x); } - void calculateAnimationy(double dt) //oblicza os y tutaj chyba trzeba dac przypadki wyboru + //Wszystko co dzieje sie na osi y + void calculateAnimationy(double dt) //oblicza os y { - middle.m1.ay=K*middle.l1.calculateDeltay(middle.m1, middle.m2)/(middle.m1.mass); - middle.m2.ay=-K*middle.l1.calculateDeltay(middle.m1, middle.m2)/(middle.m2.mass); - middle.l1.secoperationy=false; - //System.out.println(middle.l1.calculateDeltay(middle.m1, middle.m2)); - middle.m1.vy+=middle.m1.ay*dt; - middle.m2.vy+=middle.m2.ay*dt; + F1=-K*middle.l1.calculateDeltay(); + F2=K*middle.l1.calculateDeltay(); + if (middle.change[3]) { + F1-=Mi*middle.m1.vy; + F2-=Mi*middle.m2.vy; + } + if (middle.change[4]) { + F1-=Eta*Math.abs(middle.m1.vy)*middle.m1.vy; + F2-=Eta*Math.abs(middle.m2.vy)*middle.m2.vy; + } + middle.m1.ay=F1/(middle.m1.mass); + middle.m2.ay=F2/(middle.m2.mass); middle.m1.y+=middle.m1.vy*dt; middle.m2.y+=middle.m2.vy*dt; + middle.m1.vy+=middle.m1.ay*dt; + middle.m2.vy+=middle.m2.ay*dt; middle.m1.yn.add(middle.m1.y); middle.m2.yn.add(middle.m2.y); } + //Wszystko co dzieje się na osi z + void calculateAnimationz(double dt) //oblicza os z + { + + F1=-K*middle.l1.calculateDeltaz(); + F2=K*middle.l1.calculateDeltaz(); + if (middle.change[3]) { + F1-=Mi*middle.m1.vz; + F2-=Mi*middle.m2.vz; + } + if (middle.change[4]) { + F1-=Eta*Math.abs(middle.m1.vz)*middle.m1.vz; + F2-=Eta*Math.abs(middle.m2.vz)*middle.m2.vz; + } + middle.m1.az=F1/(middle.m1.mass); + middle.m2.az=F2/(middle.m2.mass); + middle.m1.z+=middle.m1.vz*dt; + middle.m2.z+=middle.m2.vz*dt; + middle.m1.vz+=middle.m1.az*dt; + middle.m2.vz+=middle.m2.az*dt; + + middle.m1.zn.add(middle.m1.z); + middle.m2.zn.add(middle.m2.z); + //skalowanie wymiarow kulek + middle.m1.sizex=(int) (30-middle.m1.z/observationPointSpeed*middle.m1.sizex); + middle.m1.sizey=(int) (30-middle.m1.z/observationPointSpeed*middle.m1.sizey); + + middle.m2.sizex=(int) (30-middle.m2.z/observationPointSpeed*middle.m2.sizex); + middle.m2.sizey=(int) (30-middle.m2.z/observationPointSpeed*middle.m2.sizey); + } + void calculateParameters(double dt) { + if (middle.change[0]) middle.m1.mass *= Math.exp(-h[0]*dt); + if (middle.change[1]) middle.m2.mass *= Math.exp(-h[1]*dt); + } } diff --git a/RunOpenedAnimation.java b/RunOpenedAnimation.java new file mode 100644 index 0000000..6a20c93 --- /dev/null +++ b/RunOpenedAnimation.java @@ -0,0 +1,116 @@ +package project; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +public class RunOpenedAnimation implements Runnable +{ + String file; + MidPanel middle; + LeftPanel left; + double correction; + double stoptime=0; + private volatile boolean exit = false; + double dt; + + RunOpenedAnimation(LeftPanel lef,MidPanel mid,String filepath) + { + + left=lef; + middle=mid; + file=filepath; + correction=middle.getHeight()/2; + exit = false; + + } + @Override + public void run() //wątek służący do uruchamiania animacji + { + BufferedReader br; + try + { + br = new BufferedReader(new FileReader(file)); + String st; + try + { + while ((st = br.readLine()) != null) + { + + String[] arguments=st.split("\t"); + if(arguments[0].equals("#")) + { + continue; + } + else if(arguments[0].equals("!")) + { + dt=Double.parseDouble(arguments[2]); + System.out.println(dt); + } + else + { + + double[] values=new double[7]; + for(int i=0;i<7;i++) + { + values[i]=Double.parseDouble(arguments[i]); + } + double t=values[0]; + if(middle.stop) + { + stoptime=t; + //System.out.println("stoptime:"+ stoptime); + break; + } + middle.m1.x=values[1]; + middle.m1.y=values[2]; + middle.m1.z=values[3]; + + middle.m2.x=values[4]; + middle.m2.y=values[5]; + middle.m2.z=values[6]; + + left.series1x.add(t,middle.m1.x); + left.series1y.add(t,middle.m1.y-correction); + left.series1z.add(t,middle.m1.z); + + left.series2x.add(t,middle.m2.x); + left.series2y.add(t,middle.m2.y-correction); + left.series2z.add(t,middle.m2.z); + + middle.repaint(); + left.repaint(); + + try + { + Thread.sleep((long) (dt*10)); + } + catch (InterruptedException e) + { + + e.printStackTrace(); + } + + } + + + } + exit=true; + + + middle.check=true; + middle.stop=true; + } catch (NumberFormatException | IOException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } catch (FileNotFoundException e1) + { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + } +} \ No newline at end of file diff --git a/TopPanel.java b/TopPanel.java index e20358c..79bea45 100644 --- a/TopPanel.java +++ b/TopPanel.java @@ -26,11 +26,13 @@ public class TopPanel extends JPanel MenuTopPanel menuPanel; MidPanel middle; LeftPanel left; - TopPanel(MidPanel mid,LeftPanel lef) + Options right; + TopPanel(MidPanel mid,LeftPanel lef,Options opt) { + right=opt; left=lef; middle=mid; - menuPanel=new MenuTopPanel(middle,left); + menuPanel=new MenuTopPanel(middle,left,right); this.setLayout(new GridLayout(1,1)); this.add(menuPanel); diff --git a/ValueListener.java b/ValueListener.java index 373e745..c80dab7 100644 --- a/ValueListener.java +++ b/ValueListener.java @@ -12,7 +12,8 @@ public class ValueListener implements ChangeListener { String unit; MidPanel mid; int actionnumber;//w zaleznosci od tego co ma robic bedzie mialo swoj numerek bo tak to dt konfilktuje z m1 itd - //1 to masa1, 2 to masa2, 3 to krok calkowy,4 to stala sprezystosci, 5 to mi + //1 to masa1, 2 to masa2, 3 to krok calkowy,4 to stala sprezystosci, 5 to mi, 6 i 7 to wsp. zmiany masy, 8 to sila + //aerocostam public ValueListener(JLabel l, JSlider s, String u,MidPanel middle,int anumber) { actionnumber=anumber; @@ -29,6 +30,16 @@ else if(actionnumber==3) mid.dt=slider.getValue()/divider; else if(actionnumber==4) mid.k=slider.getValue()/divider; + else if(actionnumber==5) + mid.mi=slider.getValue()/divider; + else if(actionnumber==6) + mid.h[0]=slider.getValue()/divider; + else if(actionnumber==7) + mid.h[1]=slider.getValue()/divider; + else if(actionnumber==8) + mid.eta=slider.getValue()/divider; + String value = String.format("%.3f " + unit, slider.getValue()/divider); + label.setText(value); } @@ -48,6 +59,16 @@ else if(actionnumber==3) mid.dt=slider.getValue()/divider; else if(actionnumber==4) mid.k=slider.getValue()/divider; + else if(actionnumber==5) + mid.mi=slider.getValue()/divider; + else if(actionnumber==6) + mid.h[0]=slider.getValue()/divider; + else if(actionnumber==7) + mid.h[1]=slider.getValue()/divider; + else if(actionnumber==8) + mid.eta=slider.getValue()/divider; + String value = String.format("%.3f " + unit, slider.getValue()/divider); + label.setText(value); } @@ -62,7 +83,15 @@ else if(actionnumber==3) mid.dt=slider.getValue()/divider; else if(actionnumber==4) mid.k=slider.getValue()/divider; - String value = String.format("%.2f " + unit, slider.getValue()/divider); + else if(actionnumber==5) + mid.mi=slider.getValue()/divider; + else if(actionnumber==6) + mid.h[0]=slider.getValue()/divider; + else if(actionnumber==7) + mid.h[1]=slider.getValue()/divider; + else if(actionnumber==8) + mid.eta=slider.getValue()/divider; + String value = String.format("%.3f " + unit, slider.getValue()/divider); label.setText(value); } diff --git a/Window.java b/Window.java index 030a06f..974cbf6 100644 --- a/Window.java +++ b/Window.java @@ -27,10 +27,10 @@ public class Window extends JFrame left= new LeftPanel(); mid = new MidPanel(left); bottom=new BottomPanel(mid); - topPanel=new TopPanel(mid,left); + right=new Options(mid); + topPanel=new TopPanel(mid,left,right); - right=new Options(mid); diff --git a/ZigzagStroke.java b/ZigzagStroke.java new file mode 100644 index 0000000..30b9d2f --- /dev/null +++ b/ZigzagStroke.java @@ -0,0 +1,85 @@ + +package project; + +import java.awt.*; +import java.awt.geom.*; + +public class ZigzagStroke implements Stroke { + private float amplitude = 10.0f; + private float wavelength = 10.0f; + private Stroke stroke; + private static final float FLATNESS = 1; + + public ZigzagStroke( Stroke stroke, float amplitude, float wavelength ) { + this.stroke = stroke; + this.amplitude = amplitude; + this.wavelength = wavelength; + } + + public Shape createStrokedShape( Shape shape ) { + GeneralPath result = new GeneralPath(); + PathIterator it = new FlatteningPathIterator( shape.getPathIterator( null ), FLATNESS ); + float points[] = new float[6]; + float moveX = 0, moveY = 0; + float lastX = 0, lastY = 0; + float thisX = 0, thisY = 0; + int type = 0; + boolean first = false; + float next = 0; + int phase = 0; + + float factor = 1; + + while ( !it.isDone() ) { + type = it.currentSegment( points ); + switch( type ){ + case PathIterator.SEG_MOVETO: + moveX = lastX = points[0]; + moveY = lastY = points[1]; + result.moveTo( moveX, moveY ); + first = true; + next = wavelength/2; + break; + + case PathIterator.SEG_CLOSE: + points[0] = moveX; + points[1] = moveY; + // Fall into.... + + case PathIterator.SEG_LINETO: + thisX = points[0]; + thisY = points[1]; + float dx = thisX-lastX; + float dy = thisY-lastY; + float distance = (float)Math.sqrt( dx*dx + dy*dy ); + if ( distance >= next ) { + float r = 1.0f/distance; + float angle = (float)Math.atan2( dy, dx ); + while ( distance >= next ) { + float x = lastX + next*dx*r; + float y = lastY + next*dy*r; + float tx = amplitude*dy*r; + float ty = amplitude*dx*r; + if ( (phase & 1) == 0 ) + result.lineTo( x+amplitude*dy*r, y-amplitude*dx*r ); + else + result.lineTo( x-amplitude*dy*r, y+amplitude*dx*r ); + next += wavelength; + phase++; + } + } + next -= distance; + first = false; + lastX = thisX; + lastY = thisY; + if ( type == PathIterator.SEG_CLOSE ) + result.closePath(); + break; + } + it.next(); + } + + return stroke.createStrokedShape( result ); + } + +} \ No newline at end of file