Traceur de graphique a partir d'un fichier texte ascii (tracage direct des points sans stockage)

Soyez le premier à donner votre avis sur cette source.

Vue 15 968 fois - Téléchargée 1 738 fois

Description

Ceci est une applet JAVA qui permet à partir d'un fichier texte au format ASCII de tracer un graphique.
Il ne stocke pas les données et les trace en direct car il a ete fait pour gerer des fichier ASCII comportant plus de 500 000 coordonnées.
Donc il est très rapide. De plus il a un repère qui s'adapte automatiquement aux données.

G@BuLe

Source / Exemple :


/**Importation des librairies*/
import java.io.*;
import java.net.*;
import java.util.*;
import java.applet.*;
import java.awt.*;

import javax.swing.*;
import java.lang.*;

/**Applet créant une courbe a partir des coordonnées dans un fichier texte*/
/** @author G@BuLe */

public class graphique extends JApplet
{
	URL             url              = null;
	URLConnection   urlConnexion     = null;
	InputStream     entree           = null;
	BufferedReader  fluxEntree       = null;
	String          valeur2          = new String("");
	String          ligne            = new String("");
	int             indiceSeparateur = 0;
	int            nbreDeLigne      = 0;	
	int			   lignesPassees	 = 0;
	private Vector     tableauValeury = new Vector();//vecteur contenant les y
	private Vector     tableauValeurx     = new Vector();//vecteur contenant les x

	
/**Donnée membre de l'applet - propre au graphique*/	
private	int	nbrePoint	= 0;//nbre total de coordonnée (point) disponible
private	double	valxf ;
		double	valyf ;
		double	maxx ;
		double	maxy ;
		double	minx ;
		double	miny ;
		double amaxy ;
		double aminy ;
		double amaxx ;
		double aminx ;
		
		int	ce;
		//String	source           = "Copie (2) de pib7801;.txt";
		//String	source           = "signalA.txt";
		String	source           = "test.txt";
		String	valx          = new String("");
		String	valy          = new String("");
		

/**Méthode d'initialisation de l'applet - initialise les paramètres du graphique*/
public void init()
{

try
{
showStatus("Initialisation des paramètres...");	
//creation des flux de fichier entrants

//source       = getParameter("source");
url          = new URL(getCodeBase(),source);
//url          = new URL(getCodeBase(),"signalA.txt");
urlConnexion = url.openConnection();
entree       = urlConnexion.getInputStream();
fluxEntree   = new BufferedReader(new InputStreamReader(entree));

//Lecture du fichier
while(fluxEntree.ready())
  {
  	ligne            = fluxEntree.readLine();
  	indiceSeparateur = ligne.indexOf(";");
  	valx          = new String(ligne.substring(0,indiceSeparateur));
  	valy           = new String(ligne.substring(indiceSeparateur + 1,ligne.lastIndexOf(";")));
  	tableauValeurx.addElement(valx);
    tableauValeury.addElement(valy);
  	//on cree les flottants pour pouvoir comparer les valeurs
  	valxf = Double.parseDouble( valx ) ;
  	valyf = Double.parseDouble( valy ) ;
  	//pour la premierre boucle , le valeurs sont les valeurs max
  	if (nbreDeLigne == 0){ minx = valxf ; maxx = valxf; miny = valyf ; maxy = valyf ; }
    if (valxf > maxx){ maxx = valxf;}
    if (valxf < minx){ minx = valxf;}
    if (valyf > maxy){ maxy = valyf;}
    if (valyf < miny){ miny = valyf;}
    nbreDeLigne++;
    ce = nbreDeLigne;
    
  }

//arrondi de min et max pour une meilleure lisibilité si c tres grand
if(((Math.abs(maxx))>1)&&((Math.abs(minx))>1))
{
	if(((Math.abs(maxy))>1)&&((Math.abs(maxy))>1)) // mais si y est tres grand on arrondi
	{
		amaxy = Math.ceil(maxy);
		aminy = Math.floor(miny);		
	
	}
	else // sinon il est tres petit et on arrondi pas
	{
		amaxy = maxy;
		aminy = miny;		
	}

	amaxx = Math.ceil(maxx);
	aminx = Math.floor(minx);
}
else ////on arrondi pas min et max pour pouvoir lire si l'ecart est tres petit
{
	if(((Math.abs(maxy))>1)&&((Math.abs(miny))<1)) // mais si y est tres grand on arrondi
	{
		amaxy = Math.ceil(maxy);
		aminy = Math.floor(miny);		
	
	}
	else // sinon il est tres petit et on arrondi pas
	{
		amaxy = maxy;
		aminy = miny;		
	}
	amaxx = maxx;
	aminx = minx;	
}

//Fermeture du fichier
fluxEntree.close();

//si problèmes de lecture du fichier
} catch (FileNotFoundException fnfe) {
     System.out.println("fichier non trouvé");
   }
   catch (IOException ioe) {
     System.out.println("erreur d'E/S " + ioe.getMessage());
   }

}//Fin de la méthode Init()
public void paint(Graphics g)
{
	Enumeration listex            = null;
	Enumeration listey            = null;
	Float       valeurPointx      = null;
	Float       valeurPointy      = null;
	// tracage des axes 
	g.drawLine(40, 60, 40, 360); 
	g.setFont(new Font("Helvetica", Font.PLAIN, 22)); 
	g.drawLine(40, 360, 1000, 360);
	
	
	// ecriture des informations
	g.setFont(new Font("Helvetica", Font.PLAIN, 12));
	g.setColor(Color.blue);
	g.drawString("Informations sur les bornes :",40,400);
	g.setColor(Color.black);
	g.drawString("X max : "+maxx + "     /    X min : " + minx ,40,420);
	g.drawString("Y max : "+maxy + "     /    Y min : " + miny ,40,440);
	
	
	
	// tracage axe des 0 si le minimum est inférieur à 0 
	/*g.setFont(new Font("Helvetica", Font.PLAIN, 12)); 
	g.setColor(Color.lightGray);
	int yz = 0; 
	if (miny < 0){
	  double d1 =  360 - (- miny * (300 / (maxy - miny)));
	  Double D1 = new Double(d1);
	  yz =  D1.intValue();
	  g.drawLine(40, yz, 1000, yz);
	  g.setColor(Color.black);
	  g.drawString("0.0", 3 , yz);
	  
		}*/

// dessin de l'axe x avec sa graduation
	
	//calcul de l'intervalle des valeurs sur l'axe des x
	double ecar ;
	ecar = (amaxx - aminx)/5;
	
	int ect = (int)ecar;
	
	
	// initialisation de la boucle
	int h = 0;
	double valeurpt = aminx; // variable pour le repere du point tracé
	
	while(h < 6){ //boucle de tracage 
	int x;
	

	
	// tranfert des coordonnées du x en pixels
	x = 40 + ((1000-40)/5 )*h;
	// conversion de la valeur du point en string pour l'affichage
  	String ss;
  	
	ss = Double.toString(valeurpt);
	//inscription de la coordonnée
	g.setFont(new Font("Helvetica", Font.PLAIN, 12)); 
	g.drawString(ss, x , 372);
	// tracage du petit trait sur l'axe
	g.setColor(Color.lightGray);
	g.drawLine(x, 360, x, 60); 
	g.setColor(Color.black);
	// si on a l'axe du 0 tracage du petit trait sur l'axe du 0
	//if (miny < 0) g.drawLine(x, yz + 2, x, yz-2);
	// pour + de lisibilité ....
	
	// incrementation des valeurs
	h++ ;

	valeurpt = valeurpt + ecar ;
	}

	
// dessin de l'axe y avec sa graduation
	
	//calcul de l'intervalle des valeurs sur l'axe des y
	double ecary ;
	ecary = (amaxy - aminy)/4;

	// initialisation de la boucle
	int d = 0;
	double valeurpty = amaxy; // variable pour le repere du point tracé
	
	while(d < 5){ //boucle de tracage 
	int y;
	
	// tranfert des coordonnées du y en pixels
	y = 60 + ((360-60)/4 )*d;
	// conversion de la valeur du point en string pour l'affichage
	String ss;
	ss = Double.toString(valeurpty);	
	//inscription de la coordonnée
	//if ( valeurpty < -1 || valeurpty > 1 ){
	g.setFont(new Font("Helvetica", Font.PLAIN, 12)); 
	g.drawString(ss, 3 , y);
	// tracage du petit trait sur l'axe
	g.setColor(Color.lightGray);
	g.drawLine(40, y, 1000, y); 
	g.setColor(Color.black);
	//}
	// incrementation des valeurs
	d++ ;
	valeurpty = valeurpty - ecary ;
	 
	}

// tracage des points 
	

	try
	{
	showStatus("Tracage du graphique");	
//	creation des flux de fichier entrants
	//source       = getParameter("source");
     url  = new URL(getCodeBase(),source);
	//url          = new URL(getCodeBase(),"signalA.txt");
	urlConnexion = url.openConnection();
	entree       = urlConnexion.getInputStream();
	fluxEntree   = new BufferedReader(new InputStreamReader(entree));

//	Lecture du fichier
	
	nbreDeLigne = 1;
	int ancienX = 0;
	int ancienY = 0;
	double ecarty;
	double ecartx;
	ecartx = amaxx-aminx;
	ecarty = amaxy-aminy;
	double rapporty ;
	double rapportx ;
	listex = tableauValeurx.elements();
	listey = tableauValeury.elements();

	while(listex.hasMoreElements())
	  {
		valxf = new Float((String)listex.nextElement());
		valyf = new Float((String)listey.nextElement());

	  	//on cree les double pour pouvoir comparer les valeurs
	  	//valxf = Double.parseDouble( valx ) ;
	  	rapportx = (valxf-aminx)/ecartx;
	  	//valyf = Double.parseDouble( valy ) ;
	    rapporty = (valyf-aminy)/ecarty;
	  	valxf = (1000-40)*rapportx;
	  	valyf = 300-((360-60)*rapporty);
	  	//les transformer en int pour pouvoir les tracer
	  	int valxint=(int)valxf;
	  	int valyint=(int)valyf;
	  	if(nbreDeLigne==1)
	    {
	    	 
	          ancienX = valxint;
	          ancienY = valyint;
	          nbreDeLigne ++;

	    }	//fin du If sur i
	  	if(nbreDeLigne!=1)
	    {
	    	  
	          //On trace la ligne correspondante correspondant en indiquant la valeur
	          g.setColor(Color.red);
	          //la valeur + la marge
	          g.drawLine(40+ancienX,60+ancienY,40+valxint,60+valyint);
	          //pour mettre des petits points
	          //g.fillOval(40+valxint,60+valyint,5,5);
	          ancienX = valxint;
	          ancienY = valyint;
	          nbreDeLigne ++ ;
	          g.setColor(Color.black);
	        
	         
	    }
	    
	  }

//	Fermeture du fichier
	fluxEntree.close();

//	si problèmes de lecture du fichier
	} catch (FileNotFoundException fnfe) {
	     System.out.println("fichier non trouvé");
	   }
	   catch (IOException ioe) {
	     System.out.println("erreur d'E/S " + ioe.getMessage());
	   }

		
		

		} // fin tracage graph
	
	

	

	

	

}//fin de l'applet

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2
Date d'inscription
jeudi 11 septembre 2003
Statut
Membre
Dernière intervention
16 avril 2008

Salut Dejant9

Si tu n'as pas résolu ton pb voici un exemple qui peut t'aider

http://chgi.developpez.com/java/applet/

J'y voit plutôt une déclaration de class :
public class TaClass extends Applet implements Runnable

avec une methode :
public void run(){
while (true)
{
repaint();
try {
Thread.sleep(1000);
}
catch(InterruptedException e){}
}
Messages postés
6
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
6 septembre 2008

bonjour c'est encore moi ^^
est ce que tu connais un moyen d'actualiser l'applet (soit pas un bouton soit à intervals réguliers)? je me suis tourné vers ce bout de code:

public class Actualise extends Thread
{
//méthode qui est lancée au démarage du thread
public void run()
{
//boucle qui se répete à l'infini
while(true)
{
//on rafraîchit le panneau d'animation
Animation.anim.repaint();

try
{
//on fait un pause soulager le processeur
sleep(15);

}
catch(Exception e) {}
}
}
}

je l'ai mis au début et j'ai mis Actualise thread = new Actualise();
thread.start();
à la fin de void init() mais ca ne fonctionne pas..
Messages postés
50
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
24 avril 2008

verifie en debug la valeur de la variable source . il me semble que quand c une adresse avec des slash, pour que le slash soit reconnu il faut le doubler.
ex : String source = "ton//adresse//de//fichier.txt";
Messages postés
6
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
6 septembre 2008

mais le problème reste le même..lorsqu'on déplace le test.txt le graphique n'affiche pas de points :( j'ai essayé "c:/test/test.txt" et au cas ou "c:\test\test.txt" ...
Messages postés
50
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
24 avril 2008

;-)
Afficher les 17 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.