IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

tracer le graph de la fonction 1/x sur javaFX


Sujet :

JavaFX

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut tracer le graph de la fonction 1/x sur javaFX
    Bonjour à tous,

    Alors j'ai un projet à réaliser en java sur la calculatrice graphique en traçant le graphe de n'importe quelle fonction saisie,
    donc, je me demande si ya parmi vous s'il vous plaît quelqu'un qui peut m'aider à comment faire pour tracer le graphe de la fonction 1/x (et plus généralement le graphe d'une fonction
    discontinue sur un intervalle I) avec un linechart ou un autre outil en javaFx.

    Je vous remercie!

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    C'est pas bien compliqué, il te faut :
    • le X min : double
    • le X max : double
    • le pas (1 à priori) : double
    • la fonction y = f(x) : Function<Double, Double>

    Sois les 4 paramètres de ta méthode.

    Tu as ensuite à coder un pseudo algo dans le style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    series = series
    ymin = Double.MAX_VALUE;
    ymax = -Double.MAX_VALUE;
    pour (x = xmin; x <= xmax ; x += pas) {
       y = f(x)
       ymin = Math.min(ymin, y);
       ymax = Math.max(ymax, y);
       series += data(x, y)
    }
    xaxis = axis(xmin, xmax, (xmax-xmin) / 5)
    yaxis = axis(ymin, ymax, (ymax-ymin) / 5);
    graph = new linechart(xaxis, yaxis)
    graph += series
    en l'état ça fait un graph correct mais apres pour faire plus "joli" il faudrait calculer des arrondis qui vont bien a l'œil pour les bornes min et max x et y
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre réponse ! Enfaite dans mon cas, j'arrive bien à dessiner des fonctions continues mais par exemple si je veux dessiner 1/x sur un intervalle [-10,10], normalement j'aurai deux parties du graphe, une partie dessinée sur l'intervalle [-10,0[ et une autre sur ]0,10] et que les deux parties soient séparées mais moi actuellement j'arrive à dessiner 1/x mais j'ai un problème entre les deux partie genre le dernier point de la première partie est relié avec le premier point de la deuxième partie.
    Et voilà en photo le graphe que j'ai.
    Images attachées Images attachées  

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Essaie de mettre null pour la data de la valeur X = 0. Je sais pu si on peut faire des lignes brisées mais il me semble que si
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Alors apres qq tests non c'est pas possible en l'état que ce soit en utilisant une valeur de Y null, Infinity ou NaN. Par contre il est possible de surcharger [c]LineChart[:c] pour faire cela par exemple comme dans le code suivant. C'est probablement ce que j'avais fait il y a une 7-8 ans quand je faisais pas mal de graphes (ça passe vite ).

    Voir ce code que j'ai utilisé tel quel à un changement près. Dans GapNumberAxis, le créateur du code utilisait l'API privée pour obtenir un convertisseur de style CSS et donc j'ai remplacé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import com.sun.javafx.css.converters.SizeConverter;
     
    [...]
     
    private static final CssMetaData<GapNumberAxis, Number> TICK_UNIT = new CssMetaData<GapNumberAxis, Number>("-fx-tick-unit",
    				SizeConverter.getInstance(), 5.0) {
    Par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import javafx.css.StyleConverter;
     
    [...]
     
    private static final CssMetaData<GapNumberAxis, Number> TICK_UNIT = new CssMetaData<GapNumberAxis, Number>("-fx-tick-unit",
                    StyleConverter.getSizeConverter(), 5.0) {
    Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    package test;
     
    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.chart.LineChart;
    import javafx.scene.chart.NumberAxis;
    import javafx.scene.chart.XYChart;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
     
    import java.util.function.Function;
     
    public final class Main extends Application {
     
        public static void main(String... args) {
            launch(args);
        }
     
        @Override
        public void start(Stage stage) throws Exception {
            final var chart1 = createChart(-5, 5, 0.25, x -> 1d / x);
            final var chart2 = createChartGap(-5, 5, 0.25, x -> 1d / x);
            final var root = new VBox();
            root.getChildren().addAll(chart1, chart2);
            final var scene = new Scene(root);
            stage.setWidth(1200);
            stage.setHeight(800);
            stage.setScene(scene);
            stage.show();
        }
     
        private LineChart createChart(final double minX, final double maxX, final double step, final Function<Double, Double> f) {
            double minY = Double.MAX_VALUE;
            double maxY = -Double.MAX_VALUE;
            final var series = new XYChart.Series();
            for (double x = minX; x <= maxX; x += step) {
                final double y = f.apply(x);
                System.out.printf("%f = f(%f)%n", y, x);
                Double.isInfinite(y);
                if (!Double.isInfinite(y)) {
                    minY = Math.min(minY, y);
                    maxY = Math.max(maxY, y);
                }
                final var data = new XYChart.Data(x, Double.isInfinite(y) ? Double.NaN : y);
                series.getData().add(data);
            }
            System.out.printf("%f - %f%n", minY, maxY);
            final var xAxis = new NumberAxis(minX, maxX, (maxX - minX) / 5);
            xAxis.setLabel("X");
            final var yAxis = new NumberAxis(minY, maxY, (maxY - minY) / 5);
            yAxis.setLabel("Y");
            final var chart = new LineChart(xAxis, yAxis);
            chart.getData().add(series);
            return chart;
        }
     
        private LineChart createChartGap(final double minX, final double maxX, final double step, final Function<Double, Double> f) {
            double minY = Double.MAX_VALUE;
            double maxY = -Double.MAX_VALUE;
            final var series = new XYChart.Series();
            for (double x = minX; x <= maxX; x += step) {
                final double y = f.apply(x);
                System.out.printf("%f = f(%f)%n", y, x);
                Double.isInfinite(y);
                if (!Double.isInfinite(y)) {
                    minY = Math.min(minY, y);
                    maxY = Math.max(maxY, y);
                }
                final var data = new XYChart.Data(x, Double.isInfinite(y) ? Double.NaN : y);
                series.getData().add(data);
            }
            System.out.printf("%f - %f%n", minY, maxY);
            final var xAxis = new GapNumberAxis(minX, maxX, (maxX - minX) / 5);
            xAxis.setLabel("X");
            final var yAxis = new GapNumberAxis(minY, maxY, (maxY - minY) / 5);
            yAxis.setLabel("Y");
            final var chart = new GapLineChart(xAxis, yAxis);
            chart.getData().add(series);
            return chart;
        }
    }
    Nom : Sans titre.jpg
Affichages : 595
Taille : 113,9 Ko
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour vos réponses et votre aide, ce que j'ai finalement fais avec mon graphe c'est de créer une liste de series (data) et une liste de double qui stockent mes points de discontinuités et avec quelques fonctions auxiliaires j'ai pu dessiner le graphe de 1/x,

    Et en creusant un peu plus je me suis rendu compte de la difficulté de dessiner le graphe de tan(x), donc je me demande si vous savez comment chercher et trouver tous les points de discontinuités de tan(x) (la première idée qui vienne à l'esprit c'est de parcourir l'intervalle et tester si la valeur avec la fonction n'est pas égale à Nan ou infinité, mais le problème c'est d'avancer avec quel pas (0.1, 0.01, 0.001, ou Math.PI ...etc) puisque on est face à des nombre avec une partie décimale assez grande (des valeurs exactes) )

    Je vous remercie !!

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Malheureusement non car ça sort de mon domain de compétence habituel et mes années d'université sont loin derrière moi. Il faudrait demander à qqun qui s'y connaisse mieux au niveau de la théorie mathématique (est-il possible d'approximer la fonction avec un développement limité ou qq chose dans ce genre qui permettrait de plus facilement estimer les pts de discontinuité) ou aller poser la question dans le forum algorithmique puisque c'est plus une question théorique générale qu'une question propre à Java.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    D'accord je vois, merci beaucoup pour votre aide, je vais déjà commencer par essayer les développement limité sur tan(x) comme vous avez dit et sinon je poserai la question sur le forum d'algorithmique...

Discussions similaires

  1. Recherche fonction / méthode pour tracer un graph particulier
    Par Cver1 dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 02/06/2010, 18h10
  2. [network simulator]tracer des graphes
    Par popov2 dans le forum Développement
    Réponses: 1
    Dernier message: 10/03/2006, 23h08
  3. Tracer un graphe...
    Par Magicien d'Oz dans le forum C
    Réponses: 4
    Dernier message: 05/02/2006, 13h27
  4. Tracer des graphes
    Par PRomu@ld dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 09/01/2006, 22h17
  5. Réponses: 3
    Dernier message: 15/04/2004, 08h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo