Forum Programmation.java Surfaces de Bézier

Posté par  .
Étiquettes : aucune
-17
9
déc.
2012

Bonjour,

J'ai écrit le code pour afficher des surfaces de Bézier dans mon logiciel Emptycanvas.

Voici le code de la classe BezierCubique2D

package be.ibiiztera.md.pmatrix.pushmatrix;

import java.awt.Color;

public class BezierCubique2D implements Representable {
    public static final int DIM2 = 1000;
    public static final int DIM1 = 1000;
    private String id;
    private final int ordreU = 3;
    private final int ordreV = 3;
    private final int ordre = 3;
    private TColor color;
    /***
     * 11 12 13 14 0123 21 22 23 24 4567 31 32 33 34 8901 41 42 43 44 2345
     */
    private Point3D[][] controle;

    private TRIObject plane;

    public BezierCubique2D(Point3D[][] controle) {
        this.controle = controle;

    }

    public BezierCubique2D() {
    }

    public int getOrdre() {
        return ordre;
    }

    public Point3D[][] getControle() {
        return controle;
    }

    public Point3D getControle(int l, int c) {
        return controle[l][c];
    }

    public void setControle(int l, int c, Point3D p) {
        controle[l][c] = p;
    }

    public Point3D calculerPoint3D(double tx, double ty) {
        return bernstein(tx, ty);
    }

    private int factorielle(int n) {
        int ret = 1;
        for (int i = 1; i < n; i++)
            ret *= i;
        return ret;
    }

    private double b(double u, int n, int i) {
        return factorielle(n) / factorielle(i) / factorielle(n - i)
                * Math.exp(Math.log(u) * i)
                * Math.exp(Math.log(1 - u) * (n - i));
    }

    private Point3D bernstein(double u, double v)

    {
        int n =ordre;
        Point3D p = new Point3D(0, 0, 0);
        for (int i = 0; i < ordre; i++)
            for (int j = 0; j < ordre; j++)
                p = p.plus(controle[i][j].mult(b(u, n, i) * b(v, n, j)));
        return p;
    }

    public String getId() {
        return id;
    }

    @Override
    public void setId(String id) {
        this.id = ID.GEN(this);
    }

    @Override
    public String id() {
        return id;
    }

    @Override
    public String toString() {
        String s = "bezier2d ( ";
        for (int l = 0; l < 4; l++)
            for (int c = 0; c < 4; c++)
                s += controle[l][c].toString() + " ";
        return s + " )\n";
    }

    public Representable place(MODObjet aThis) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void texture(TColor tc) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean supporteTexture() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void setColor(TColor color) {
        this.color = color;
    }

    public TColor getColor() {
        return color;
    }

    public Color getColor(int x, int y, double dx, double dy) {

        return color.getMaillageTexturedColor(x, y, dx, dy);
    }

}

(code sous GNU Lesser Public Licence)

Un test :
https://plus.google.com/photos/111396871434148707968/albums/5819702748874831825/5819702762736239426

Et je me rends compte que la classe est boguée.

  • # Et ?

    Posté par  . Évalué à 4.

    faudrait que t'en parles à Robertix…

    non, sinon elle est ou là question ?

    • [^] # Commentaire supprimé

      Posté par  . Évalué à -10. Dernière modification le 11 décembre 2012 à 09:41.

      Ce commentaire a été supprimé par l’équipe de modération.

      • [^] # Re: Et ?

        Posté par  (site web personnel) . Évalué à 6.

        Insulter ne t'apportera que peu de réponse…

        Indiquer que le triangle noir sur l'image te dérange, peut-être un peu plus… ou tout autre point qui n'est pas clair dans ton entrée de forum.

      • [^] # Re: Et ?

        Posté par  . Évalué à 6.

        Moi oui j'ai remarqué que je suis très con.
        J'en étais honteux et déprimé. Mais depuis que je vais chez le psy, j'en suis fier.

        • [^] # Re: Et ?

          Posté par  . Évalué à 2.

          « Avant, on était tous cons. Mais ça, c'était avant. » :-)

      • [^] # Re: Et ?

        Posté par  . Évalué à 2.

        Tu veux venir diner Mercredi soir - J'invite des gens de tous bords à discuter de leur passion, Ça sera sympa ….

      • [^] # Re: Et ?

        Posté par  (site web personnel) . Évalué à 1.

        Bonjour la généralisation ! Tous, vraiment ?

        Et maintenant la question du jour : être traité de con par un con prouve-t-il que je ne le suis pas ?

        Fuse : j'en Use et Abuse !

        • [^] # Re: Et ?

          Posté par  . Évalué à 4.

          Et maintenant la question du jour : être traité de con par un con prouve-t-il que je ne le suis pas ?

          Non. Parce qu'on est tous le con de quelqu'un d'autre.

  • # factorielle sur les int ?

    Posté par  . Évalué à 5.

    Ça déborde à fact 13 sur 32 bits et fact 21 sur 64 bits.
    Autrement dit la fonction est très très partielle (et foire silencieusement).

    Please do not feed the trolls

    • [^] # Re: factorielle sur les int ?

      Posté par  . Évalué à -2.

      Ah l'erreur pernicieuse.

      Et si je programme la factorielle en double précision?

      • [^] # Re: factorielle sur les int ?

        Posté par  . Évalué à 6.

        Peut-être que dans la vrai vie on n'utilise pas des factorielles pour calculer les coefficients binomiaux. Et peut-être qu'aussi quand on a besoin de manier des très grand nombres et des très petits, pour éviter que toute l'information utile se retrouve codée dans l'exposant, et pour éviter que la mantisse ne contienne que des broutilles on fait les calculs sous une certaine transformation.

        • [^] # Re: factorielle sur les int ?

          Posté par  . Évalué à -10.

          En fait dans la vraie vie des surfaces on ne va pas jusqu'à l'ordre 13 mais plutôt jusqu'à l'ordre 3 soit pour les coefficients au maximum :
          3! = 3*2*1 = 6

          Cela dit cette politique du moins systématique JE PRENDS LA PORTE ET VAIS TROUVER DES FORUMS PLUS ACCUEILLANTS.

          "Mais pourquoi reviennent-ils si c'est infesté par les rats? Sinon pour s'assurer qu'ils soient partis?"

      • [^] # Re: factorielle sur les int ?

        Posté par  (site web personnel) . Évalué à 7. Dernière modification le 10 décembre 2012 à 07:24.

        Salut,

        Et si je programme la factorielle en double précision?

        Si tu travailles en nombre entiers en précision finie, tu ne vas pas représenter beaucoup plus de nombres: tu vois qu'en doublant la capacité de 32 à 64 bits tu es passé de 13 à 21…

        Si tu fais de la combinatoire et que les valeurs sont importantes, tu peux utiliser du calcul arithmétique en précision illimitée: on ne travaille plus directement avec les registres, mais — pour simplifier — avec la liste de longueur arbitraire des chiffres.

        Si tu fais du caclul numérique tu vas remplacer tes factorielles, coefficients binomiaux et autres «grandes fonctions des nombres» par des approximations, comme te le permet le calcul numérique de la fonction gamma d'Euler ou la formule de Stirling.

        Pour calculer les coefficients binomiaux dont tu as besoin, tu peux le faire numériquement (flottants) ou tu peux obtenir une valeur entière en utilisant la relation de Pascal:

        C(n+1,p+1) = C(n,p) + C(n,p+1)
        C(n,n) = C(n,0) = 1
        
        

        (p parmis n) qui te permet de calculer récursivement les coefficients sans passer par des valeurs intermédiaires trop grandes que tu ne peux pas représenter dans tes registres.

        • [^] # Re: factorielle sur les int ?

          Posté par  . Évalué à 3. Dernière modification le 10 décembre 2012 à 21:55.

          Si tu fais de la combinatoire et que les valeurs sont importantes, tu peux utiliser du calcul arithmétique en précision illimitée: on ne travaille plus directement avec les registres, mais — pour simplifier — avec la liste de longueur arbitraire des chiffres.

          Par exemple il y a http://gmplib.org/ mais c'est pour le langage C pas pour Java de mémoire.

  • # Je comprends pas…

    Posté par  . Évalué à 1.

    Les projets commencent déjà en école d'ingé/DUT/école d'info ?

    Ruby est le résultat d'un gamin qui apprend le Java, puis jette un œil à Perl et se dit « je peux le réparer! »

    • [^] # Re: Je comprends pas…

      Posté par  . Évalué à -3.

      Sans doute que le terme "projet" est mal choisi. Il s'agit plutôt d'une "archive de classes".

      Et puis je fais des dessins comme j'ai toujours fait.

    • [^] # Commentaire supprimé

      Posté par  . Évalué à -10. Dernière modification le 11 décembre 2012 à 09:43.

      Ce commentaire a été supprimé par l’équipe de modération.

      • [^] # Re: Je comprends pas…

        Posté par  (site web personnel) . Évalué à 10.

        Cher jeune mal-embouché,

        en général je trouve mes charmants collègues un peu durs avec les nouveaux venus, et ai tendance à arrondir les angles. Mais en l'occurrence, je te trouve d'une suffisance absolument puante, qui t'empêche de te remettre 2 secondes en question. Insulter les gens sur un forum public ne se fait pas. À plus forte raison si tu es en position de demandeur, et que tu n'as rien payé pour voir une réponse, que je sache. Nous ne te devons donc rien. Si un jour tu souhaites avoir des réponses à tes questions, voici un petit manuel de politesse qui te permettra d'avoir des réponses. Sur un autre site de préférence, car personne ne te retient (comprendre: le chantage à coup de "je vais me barrer du site" m'en fait bouger une sans toucher l'autre).

        Oh, bien sûr, il y a la possibilité infime qu'un éclair de remord te traverse, et qu'en respectant tes interlocuteurs tu arrives tout de même à arracher une réponse constructive. Pas à moi bien sûr, je ne code pas en java (et j'ai autre chose à foutre). Mais sache tout de même que lorsque tu postes un message, les gens ne sont pas dans ta tête… Indiquer ce que tu as fait, c'est bien, indiquer ce que tu cherches à faire, c'est mieux. Or là, tu nous sors une capture d'écran, mais comme tu n'as pas indiqué précisément ce que tu cherche à faire, ni le résultat attendu, ni en quoi ton résultat actuel en est différent, bin du coup comprends que tes interlocuteurs peuvent être un peu agacés. Je répète donc la règle de base:

        Ton interlocuteur n'est pas dans ta tête.

      • [^] # Re: Je comprends pas…

        Posté par  . Évalué à 2.

        Il faudrait aussi pouvoir remonter le temps d'au moins 32 minutes !

  • # Le code du test ne donne pas le résultat attendu

    Posté par  . Évalué à -2.

            BezierCubique2D bc2 = new BezierCubique2D(new Point3D[][] {
                    { new Point3D(-6, -6, 0), new Point3D(-6, -2, 0),
                            new Point3D(-6, 2, 0), new Point3D(-6, 6, 0) },
                    { new Point3D(-2, -6, 0), new Point3D(-2, -2, 0),
                            new Point3D(-2, 2, 0), new Point3D(-2, 6, 0) },
                    { new Point3D(2, -6, 0), new Point3D(2, -2, 0),
                            new Point3D(2, 2, 0), new Point3D(2, 6, 0) },
                    { new Point3D(6, -6, 0), new Point3D(6, -2, 0),
                            new Point3D(6, 2, 0), new Point3D(6, 6, 0) }
    
            }
    
            );
    
    

    Normalement on devrait voir apparaître une surface plane de forme rectangulaire sur tout l'écran (à peu près). Hors la forme générée ressemble à une feuille de plante.

    Alors pourquoi?

    Je ne crois pas contrairement à ce qui est dit plus haut que ce soit du à un débordement de capacité sur 32 bits car les coefficients sont calculés avec des factorielles limitées au maximum à 3! soit 3*2*1 = 6 (n! avec n=3, i!, (n-i)! avec i=0,1,2,3).

    • [^] # Re: Le code du test ne donne pas le résultat attendu

      Posté par  . Évalué à 4.

      JE PRENDS LA PORTE ET VAIS TROUVER DES FORUMS PLUS ACCUEILLANTS.

      T'as pas trouvé ? ;)

      Désolé de ne pas pouvoir t'aider quant à ton problème, je n'ai pas les compétences nécessaires. Au cas où tu voudrais me faire remarquer que je ne réponds pas sur le fond.

  • # Voila, un simple problème de boucles et j'y suis

    Posté par  . Évalué à -1.

  • # Il reste un bogue

    Posté par  . Évalué à -3.

    Un petit souci, quand je "déplace" la surface dans l'espace tridimensionnel elle change de forme.

    Par exemple si un côté est sur un axe (OX OY ou OZ) le côté sera parallèle à l'axe, sinon le côté sera incurvé.

    • [^] # Re: Il reste un bogue

      Posté par  . Évalué à 0.

      Il reste un bogue

      Tant mieux, ça te fait les pieds.

      Je t'invite à relire cette discussion, comprendre ce qui t'es reproché, avant d'enfin, poser ta question clairement, poliment, en expliquant ce que tu as fait, et ton but.

      Bon séjour en enfer,

      • [^] # Commentaire supprimé

        Posté par  . Évalué à -7. Dernière modification le 11 décembre 2012 à 09:45.

        Ce commentaire a été supprimé par l’équipe de modération.

        • [^] # Commentaire supprimé

          Posté par  . Évalué à -3.

          Ce commentaire a été supprimé par l’équipe de modération.

      • [^] # Commentaire supprimé

        Posté par  . Évalué à -8. Dernière modification le 11 décembre 2012 à 09:43.

        Ce commentaire a été supprimé par l’équipe de modération.

        • [^] # Re: Il reste un bogue

          Posté par  . Évalué à 0.

          Je rêve.

          Ces propos étant publics, ils sont appréciables au titre de l'injure publique. Ça serait bien que tu en prennes conscience.

          • [^] # Re: Il reste un bogue

            Posté par  . Évalué à -10.

            PARLE A MON AVOCAT

          • [^] # Re: Il reste un bogue

            Posté par  . Évalué à 1.

            sans déconner, tu t'attendais à quoi ?

            tu viens lui faire la moral à 2€ en jouant monsieur la morale, et Joe donneur de leçon. et pas qu'une fois.

            Ton comportement est aussi détestable que l'autre affolé de la touche MAJ.

            Aide-le ou tire-toi "aider" quelqu'un d'autre.

            • [^] # Re: Il reste un bogue

              Posté par  . Évalué à 0.

              Tu fais quoi là si tu le fais pas la même chose, excepté que tu le fais à moi, et pas à lui.

              Et contrairement à ce que tu semble croire, j'ai voulu l'aider, et ma première intervention dans ce thread contenait des information pertinentes et utiles. Oui les informations n'étaient pas complètes, il manquait une petite recherche google, mais vu le ton de la demande, je n'allais pas prémacher le travail.

              Alors, oui vu sa réaction à mon premier post, vu sa capacité à insulter, je n'ai pas été sympa.

              Non je ne m'attendais pas à cela, non je ne m'attendais pas à me faire injurier de la sorte. Je m'attendais à ce qu'il disparaisse de ce thread ou qu'il s'adoucisse. Autant de verve, d'arrogance, et de violence, ça me dépasse.

              Aide-le ou tire-toi "aider" quelqu'un d'autre.

              Plait-il ?

              • [^] # Re: Il reste un bogue

                Posté par  . Évalué à -3.

                je t'ai fait ce commentaire, à toi, parce que j'ai espoir que tu comprennes. Pour lui, c'est mal barré.

                les informations n'étaient pas complètes

                Amusant de reprocher à quelqu'un une question incomplète et de lui donner une pas-réponse.
                La réalité est que l'aider dans son problème ne t'intéressait pas. Tu cherchais juste à faire le malin et lui faire une leçon de moral sur "la vraie vie" dixit ton expression.

                Il n'y aurait eu que ce commentaire, je n'aurais rien dit. Mais ensuite, tu reviens le chercher et le provoquer ("ca te fait les pieds"…), alors pitié, ne viens pas jouer le gars offusqué qui a mal pris une insulte, ce n'est pas crédible Tu as commencé à écrire dans ce journal pour ça, te taper un neuneu. C'est un sport que je respecte, mais qu'il faut assumer.

                En clair, et pour faire simple. dont feed the troll

                PS: Je ne répondrais plus maintenant, tout a été dit.

                • [^] # Re: Il reste un bogue

                  Posté par  . Évalué à 2.

                  Tu as commencé à écrire dans ce journal pour ça, te taper un neuneu.

                  Ton analyse est fausse.

                  Je ne répondrais plus maintenant, tout a été dit.

                  C'est ton choix, ça m'évitera d'essayer de convaincre une pierre de voler.

  • # Il y a encore des gens qui codent en java ?

    Posté par  . Évalué à 8.

    Et sinon il faut poser les questions dans la bonne rubrique

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.