/**Simulation poissons/requins Jérôme Michaud-Bonnet - GT Math/Info - Académie de Besançon */ import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.io.*; public class FPoissons { static JFrame frame; static Container content; static JTextArea textArea; static JPanel panel; static Graphics2D g; static int [] t_r; static int [] t_p; static int max_r; static int max_p; public FPoissons() { double poissons=0; double requins=0; double r,p; textArea=new JTextArea(); Object[] options = {"OK","Annuler"}; final JOptionPane optionPane=new JOptionPane(); String message_r="Nombre de requins"; String message_p="Nombre de poissons"; JTextField text_r=new JTextField(6); JTextField text_p=new JTextField(6); text_p.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) {} public void keyReleased(KeyEvent e) { if (e.getKeyCode()==KeyEvent.VK_ENTER) { //Enter->On ferme la fenetre (/!\ OK_OPTION non valide) JOptionPane.getFrameForComponent(optionPane).dispose(); } } public void keyTyped(KeyEvent e) {} }); int result=optionPane.showOptionDialog(null,new Object[] {message_r,text_r,message_p,text_p},"Valider", JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE, null, options,text_r); if (result==JOptionPane.CANCEL_OPTION) { return; } try { requins=Integer.parseInt(text_r.getText().trim()); poissons=Integer.parseInt(text_p.getText().trim()); } catch (Exception e) { JOptionPane.showMessageDialog(null,"Erreur de saisie dans les nombres.", "Erreur", JOptionPane.ERROR_MESSAGE); return; } if (requins<10) { requins=10; JOptionPane.showMessageDialog(null,"Le nombre de requins a été fixé à 10 pour éviter une boucle infinie.", "Boucle infinie", JOptionPane.INFORMATION_MESSAGE); } r=requins;p=poissons; textArea.append("Départ : requins,poissons : "+(int)requins+","+(int)poissons+"\n"); for (int i=0 ; i<100 ; i++) { if (2*requins < 0.9*poissons) { poissons = poissons-2*requins; } else { requins = Math.floor(0.90*poissons/2); poissons = Math.floor(0.10*poissons); } requins = Math.floor(requins*1.1); poissons = Math.floor(poissons*1.2); if (poissons>1000000000) poissons=1000000000; textArea.append("Période "+(i+1)+" : requins,poissons : "+(int)requins+","+(int)poissons+"\n"); } requins=r; poissons=p; max_r=(int)r;max_p=(int)p; int i=0; while (poissons>0) { if (poissons>max_p) max_p=(int)poissons; if (requins>max_r) max_r=(int)requins; t_r[i]=(int)requins; t_p[i]=(int)poissons; i++; if (2*requins < 0.9*poissons) { poissons = poissons-2*requins; } else { requins = Math.floor(0.90*poissons/2); poissons = Math.floor(0.10*poissons); } requins = Math.floor(requins*1.1); poissons = Math.floor(poissons*1.2); if (poissons>1000000000) poissons=1000000000; } textArea.append("Nombre de périodes de pérennité :"+i+"\n"); } public static void main(String[] args) { t_p=new int[1000]; t_r=new int[1000]; frame = new JFrame("Requins/Poissons GT Math/Info"); panel=new JPanel(new BorderLayout()); panel.setPreferredSize(new Dimension(300,200)); content=frame.getContentPane(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400,500); content.add(panel,BorderLayout.NORTH); frame.setVisible(true); g=(Graphics2D)panel.getGraphics(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); new FPoissons(); int width=panel.getWidth(); int height=panel.getHeight(); double echelle_r=(double)height/max_r; double echelle_p=(double)height/max_p; if (echelle_p<1) textArea.append("Echelle pour les poissons (en rouge) : 1 pixel pour "+(int)(1/echelle_p)+"\n"); else textArea.append("Echelle pour les poissons (en rouge) : "+(int)echelle_p+" pixel pour 1\n"); if (echelle_r<1) textArea.append("Echelle pour les requins (en bleu) : 1 pixel pour "+(int)(1/echelle_r)+"\n"); else textArea.append("Echelle pour les requins (en bleu) : "+(int)echelle_r+" pixel pour 1\n"); content.add(new JScrollPane(textArea)); g.setColor(Color.gray); g.drawLine(200,0,200,height); for (int i=0 ; i<199 ; i++) { g.setColor(Color.red); g.drawLine(i*2,height-(int)(t_p[i]*echelle_p),(i+1)*2,height-(int)(t_p[i+1]*echelle_p)); g.setColor(Color.blue); g.drawLine(i*2,height-(int)(t_r[i]*echelle_r),(i+1)*2,height-(int)(t_r[i+1]*echelle_r)); } frame.setVisible(true); } }