Java Forums

Main Menu
Home
Today's Posts
FAQ
Search
Contact Us

Java Network
Java Tips
Java Tips Blog

Sponsored Links





Welcome to the Java Forums.

You are currently viewing our boards as a guest which gives you limited access to view most discussions and access our other features. By joining our free community, you will:

  • have access to post topics
  • communicate privately with other members (PM)
  • not see advertisements between posts
  • have the possibility to earn one of our surprises if you are an active member
  • access many other special features that will be introduced later.

Registration is fast, simple and absolutely free so please, join our community today!

If you have any problems with the registration process or your account login, please contact us.

Reply
 
LinkBack Thread Tools Display Modes
  #1 (permalink)  
Old 06-05-2008, 01:58 AM
Member
 
Join Date: Jun 2008
Posts: 2
Abdelhamidem is on a distinguished road
how to pause and repaint in a loop, to draw a mathematical function.
Hello
First of all, Forgive my english...

I would like to make a program in which you give :
_ a function (for exemple x^2)
_ min and max
_ a number of "iterations" (I'm not sure it's the correct word in english, but nevermind)


and then, the program shows the graph of that function, along with a "rain" of dots, chosen randomly and not in an applet...
if you type "java applet monte carlo inria" in google, click on the first link, and it will lead you to the result I want. But I don't want it in an applet.

Once the data is entered (if you give a try to my source code, don't pay attention to the checkBoxes, it's not necessary to check them) , and the OK button is clicked , ActionPerformed calls the method go() from class Fenetre (window in english). And this go() method runs a loop in wich it calls repaint() and the method Thread.sleep(10) in each loop.

The method paintComponent is supposed to draw one "random dot" plus the mathematical function each time.
If I call repaint several time, it should redraw the function (but since the function didn't change, we see no difference), and ADD another "random dot".

My problem is the loop runs several times, but it's like it calls repaint() once, because once the loop is done, I see the graph of my function, but only one "random" dot is on the graph.

Here is a simplified version of my source code...
Please help me!

The program needs a jar file to run... I linked a zip file to this thread for those who would have the courage, or the great kindness to try my code...

Although it seems long and complicated, the main issue is between method go() from class Fenetre (last method), and graphique1 class.

here is the code:

Main.java

Code:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package montecarlo; /** * * @author Abdelhamid */ import java.io.*; import java.util.*; import java.math.*; import org.nfunk.jep.*; public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { Fenetre it = new Fenetre(); } }

graphique1.java
This is the class where paintComponent is.
Code:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package montecarlo; import javax.swing.*; import java.util.*; public class graphique1 extends JPanel { int X[] = new int[10000]; int Y[] = new int[10000]; int min, max; Random rand = new Random(); int randX = 0; int randY = 0; /** Creates new form Graphique */ public graphique1(Integrale I) { min = (int) I.borneMin - 100; max = (int) I.borneMax + 100; for (int i = min; i < max; i++) { X[i - min] = i + 300; Y[i - min] = (int) (225 - 0.1 * I.evaluer(i)); } this.setPreferredSize(new java.awt.Dimension(600, 450)); } @Override public void paintComponent(java.awt.Graphics g) { g.setColor(new java.awt.Color(255, 255, 255)); g.fill3DRect(0, 0, 599, 449, true); g.setColor(new java.awt.Color(0, 0, 0)); randX = rand.nextInt(100) + -5 + 300; randY = 225 - rand.nextInt(100); g.drawLine(randX, randY, randX, randY); g.drawPolygon(X, Y, max - min); } }

Fenetre.java
This is where go() method is. It calls repaint() and Thread.sleep(10) within a loop.
All the begining of this is class is just full of declarations of JLabel and JTextField etc...

Code:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package montecarlo; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.event.*; public class Fenetre { private JFrame fenetre = new JFrame("PFE MONTE CARLO 2008") { { addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } }; final int cte = 400; private JPanel[] panel; private JButton button; private JLabel[] label; private javax.swing.JTextField[] jText; private javax.swing.JRadioButton[] jRadio; private javax.swing.JCheckBox[] jCheck; //graphique1 graph; public Fenetre() { panel = new JPanel[12]; for (int i = 0; i < 12; i++) { panel[i] = new JPanel(); } label = new JLabel[13]; jText = new JTextField[5]; jRadio = new JRadioButton[2]; jCheck = new JCheckBox[4]; jText[0] = new JTextField(25); jText[1] = new JTextField(8); jText[2] = new JTextField(8); jText[3] = new JTextField(14); jText[4] = new JTextField(14); jCheck[0] = new JCheckBox("Monte Carlo "); jCheck[1] = new JCheckBox("Rectangle "); jCheck[2] = new JCheckBox("Trapezes "); jCheck[3] = new JCheckBox("Simpson "); jRadio[0] = new JRadioButton("Iterations"); jRadio[1] = new JRadioButton("Valeur "); label[0] = new JLabel("f(x)="); label[1] = new JLabel("min"); label[2] = new JLabel("max"); label[3] = new JLabel(" Complexité"); label[4] = new JLabel("Resultats"); label[5] = new JLabel("0.000000"); label[6] = new JLabel("0.000000"); label[7] = new JLabel("0.000000"); label[8] = new JLabel("0.000000"); label[9] = new JLabel("0.000000"); label[10] = new JLabel("0.000000"); label[11] = new JLabel("0.000000"); label[12] = new JLabel("0.000000"); jText[3].setPreferredSize(new Dimension(100, 25)); jText[4].setPreferredSize(new Dimension(100, 25)); for (int i = 3; i < 13; i++) { label[i].setPreferredSize(new Dimension(100, 25)); } button = new JButton("ok"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { go(); } }); panel[0].add(label[0]); panel[0].add(jText[0]); panel[0].add(button); panel[0].setPreferredSize(new Dimension(cte, 30)); panel[7].add(label[1]); panel[7].add(label[2]); panel[7].setPreferredSize(new Dimension(25, 60)); panel[8].add(jText[1]); panel[8].add(jText[2]); panel[8].setPreferredSize(new Dimension(150, 60)); panel[1].add(panel[7]); panel[1].add(panel[8]); panel[1].setPreferredSize(new Dimension(cte, 60)); panel[2].add(jRadio[0]); panel[2].add(jRadio[1]); panel[2].setPreferredSize(new Dimension(80, 60)); panel[3].add(jText[3]); panel[3].add(jText[4]); panel[3].setPreferredSize(new Dimension(250, 60)); panel[11].add(panel[2]); panel[11].add(panel[3]); panel[11].setPreferredSize(new Dimension(cte, 80)); panel[6].add(new JPanel() { { setPreferredSize(new Dimension(100, 25)); } }); panel[6].add(jCheck[0]); panel[6].add(jCheck[1]); panel[6].add(jCheck[2]); panel[6].add(jCheck[3]); panel[4].add(label[3]); panel[4].add(label[5]); panel[4].add(label[7]); panel[4].add(label[9]); panel[4].add(label[11]); panel[5].add(label[4]); panel[5].add(label[6]); panel[5].add(label[8]); panel[5].add(label[10]); panel[5].add(label[12]); panel[4].setPreferredSize(new Dimension(100, 200)); panel[5].setPreferredSize(new Dimension(100, 200)); panel[6].setPreferredSize(new Dimension(100, 200)); panel[9].add(panel[0]); panel[9].add(panel[1]); panel[9].add(panel[2]); panel[9].add(panel[3]); panel[9].add(panel[11]); panel[9].add(panel[6]); panel[9].add(panel[4]); panel[9].add(panel[5]); panel[9].setPreferredSize(new Dimension(cte, 450)); panel[10].add(panel[9]); fenetre.add(panel[10]); fenetre.setVisible(true); fenetre.pack(); } public void go() { String fonction = jText[0].getText(); float min = Float.parseFloat(jText[1].getText()); float max = Float.parseFloat(jText[2].getText()); int nbOpns = Integer.parseInt(jText[3].getText()); Integrale uneIntegrale = new Integrale(fonction, min, max); graphique1 graph = new graphique1(uneIntegrale); panel[10].add(graph); fenetre.pack(); for (int i = 0; i < 1000; i++) { graph.repaint(); try { Thread.sleep(10); } catch (InterruptedException e) { System.out.println("awakened prematurely"); } } } }
Integrale.java
This class is used to parse a String into an evaluable function, thanks to the jep jar

Code:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package montecarlo; import org.nfunk.jep.*; /** * * @author Abdelhamid */ public class Integrale { org.nfunk.jep.JEP fonction; protected int nbOperateurs=0; protected double borneMin; protected double borneMax; protected double valeurAttendue; public Integrale(String fonc, double min, double max) { fonction = new JEP(); fonction.addStandardFunctions(); fonction.addStandardConstants(); fonction.addVariable("x", 0); fonction.parseExpression(fonc); borneMin = min; borneMax = max; int i = 0; while (i != fonc.length()) { if (fonc.charAt(i) == '+' || fonc.charAt(i) == '-') { nbOperateurs++; } else if (fonc.charAt(i) == '*' || fonc.charAt(i) == '/') { nbOperateurs++; } else if (fonc.charAt(i) == '^') { nbOperateurs+=Integer.parseInt(""+fonc.charAt(i+1)); } i++; } } public Integrale(String fonc, double min, double max, double val) { this(fonc, min, max); valeurAttendue = val; } public double evaluer(double val) { fonction.addVariable("x", val); return fonction.getValue(); } public double getMin() { return borneMin; } public double getMax() { return borneMax; } }
Thank you very much!
Attached Files
File Type: zip jep-2.4.1.zip (74.9 KB, 1 views)
Bookmark Post in Technorati
Reply With Quote
Sponsored Links
  #2 (permalink)  
Old 06-05-2008, 04:38 AM
Senior Member
 
Join Date: Jun 2008
Posts: 175
Fubarable is on a distinguished road
Please do not cross-post this in multiple forums:
Bookmark Post in Technorati
Reply With Quote
  #3 (permalink)  
Old 06-05-2008, 11:31 PM
Senior Member
 
Join Date: Jul 2007
Posts: 1,124
hardwired is on a distinguished road
Code:
C:\jexp\jep-2.4.1>java -jar jep-2.4.1.jar Failed to load Main-Class manifest attribute from jep-2.4.1.jar
Couldn't run your jar or find any source files so I made up something that may answer your question(s).
Code:
import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.awt.image.BufferedImage; import java.util.Random; import javax.swing.*; public class AnimationTest implements ActionListener, Runnable { AnimationPanel animationPanel = new AnimationPanel(); Thread thread; boolean running = false; public void actionPerformed(ActionEvent e) { String ac = e.getActionCommand(); if(ac.equals("START")) start(); if(ac.equals("STOP")) stop(); if(ac.equals("CLEAR")) animationPanel.clear(); } private void start() { if(!running) { running = true; thread = new Thread(this); thread.setPriority(Thread.NORM_PRIORITY); thread.start(); } } private void stop() { running = false; if(thread != null) thread.interrupt(); thread = null; } public void run() { while(running) { try { Thread.sleep(250); } catch(InterruptedException e) { running = false; System.out.println("interrupted"); } animationPanel.addDot(); } } private JPanel getAnimationPanel() { return animationPanel; } private JPanel getUIPanel() { JPanel panel = new JPanel(); String[] ids = { "start", "stop", "clear" }; for(int i = 0; i < ids.length; i++) { JButton button = new JButton(ids[i]); button.setActionCommand(ids[i].toUpperCase()); button.addActionListener(this); panel.add(button); } return panel; } public static void main(String[] args) { AnimationTest test = new AnimationTest(); JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(test.getAnimationPanel()); f.add(test.getUIPanel(), "Last"); f.pack(); f.setLocation(200,200); f.setVisible(true); } } class AnimationPanel extends JPanel { Random seed = new Random(); BufferedImage image; Path2D.Double path; public void addDot() { int x = seed.nextInt(100) - 5 + 300; int y = 225 - seed.nextInt(100); Graphics2D g2 = image.createGraphics(); g2.setPaint(new Color(210,200,230)); g2.fill(new Ellipse2D.Double(x-2, y-2, 4, 4)); g2.dispose(); repaint(); } public void clear() { int w = image.getWidth(); int h = image.getHeight(); Graphics2D g2 = image.createGraphics(); g2.setBackground(getBackground()); g2.clearRect(0, 0, w, h); g2.dispose(); repaint(); } protected void paintComponent(Graphics g) { if(image == null) init(); // Looks like you want the dots to appear // under/behind the graph. g.drawImage(image, 0, 0, this); Graphics2D g2 = (Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setPaint(Color.blue); g2.draw(path); } public Dimension getPreferredSize() { return new Dimension(600,450); } private void init() { int w = getWidth(); int h = getHeight(); int type = BufferedImage.TYPE_INT_RGB; image = new BufferedImage(w, h, type); Graphics2D g2 = image.createGraphics(); g2.setBackground(getBackground()); g2.clearRect(0, 0, w, h); g2.dispose(); path = initWave(w, h); } private Path2D.Double initWave(int w, int h) { Path2D.Double sineWave = new Path2D.Double(); for(int x = 0; x < w; x++) { double y = h/2.0 - Math.sin(((double)x/w)*2*Math.PI)*(h-2)/2.0; if(x > 0) sineWave.lineTo(x, y); else sineWave.moveTo(x, y); } return sineWave; } }
Edit:
type "java applet monte carlo inria" in google showed this thread as number one. I looked around a little and couldn't find what you described.

Last edited by hardwired : 06-06-2008 at 12:04 AM.
Bookmark Post in Technorati
Reply With Quote
  #4 (permalink)  
Old 06-06-2008, 12:10 AM
Member
 
Join Date: Jun 2008
Posts: 2
Abdelhamidem is on a distinguished road
Thank you so much for your help, and all that work you've done. I've just found a solution, using a javax.Swing timer:

I changed the graphique1 class to this (by the way, i renamed it Graphique)
Code:
package montecarlo; import javax.swing.*; import javax.swing.event.*; import java.util.*; import java.awt.*; import java.awt.event.*; public class Graphique extends JPanel implements ActionListener { int X[] = new int[10000]; int Y[] = new int[10000]; int min, max; Random rand = new Random(); int randX = 0; int randY = 0; boolean functionDrawed = false; double zoom = 1; Integrale integrale; javax.swing.Timer t; public Graphique(Integrale I) { integrale = I; min = (int) I.borneMin - 100; max = (int) I.borneMax + 100; for (int i = min; i < max; i++) { X[i - min] = (int) zoom * i + 300; Y[i - min] = (int) (225 - zoom * I.evaluer(i)); } this.setPreferredSize(new java.awt.Dimension(600, 450)); repaint(); t = new javax.swing.Timer(100, this); t.start(); } @Override public void paintComponent(java.awt.Graphics g) { if (!functionDrawed) { g.setColor(new java.awt.Color(255, 255, 255)); g.fill3DRect(0, 0, 599, 449, true); g.setColor(new java.awt.Color(0, 0, 0)); g.drawPolygon(X, Y, max - min); functionDrawed = true; } randX = rand.nextInt(100) + -5 + 300; randY = 225 - rand.nextInt(100); if ((225 - zoom * integrale.evaluer((randX - 300) / zoom)) > randY) { g.setColor(new java.awt.Color(255, 0, 0)); } else { g.setColor(new java.awt.Color(0, 0, 255)); } g.drawLine(randX, randY, randX, randY); } public void actionPerformed(ActionEvent e) { repaint(); } } and it works perfectly!
Bookmark Post in Technorati
Reply With Quote
Sponsored Links
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
Demonstration of the mathematical operators Java Tip java.util 0 04-17-2008 12:02 AM
Repaint problem swimberl Java 2D 1 02-16-2008 10:12 PM
Help with Pause trill Java Applets 2 09-28-2007 09:50 PM
Help with mathematical part in java lenny Advanced Java 3 08-09-2007 02:55 PM
Help with mathematical methods Marcus Advanced Java 2 07-01-2007 09:20 PM


All times are GMT +3. The time now is 12:40 AM.


VBulletin, Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright ©2006 - 2007, www.java-forums.org