Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tracé de segment pour un débutant en C

    27 novembre 2020 à 22:49:43

    #include<iostream>
    #include<math.h>
    
    int arrondi(float x)
    { 
        return (N*(x+0.5));
    }
    
    
    int main()
    {
         float x,y,xE,yE;
         int image[N][N];
         int ix=0;
         int iy=0;
    
         for(int i=0;i<=N;i++)
         { 
             for(intj=0;j<=N;j++)
             { 
                  image[i][j]=0;
             }
         }
    
         printf("Veuillez saisir les coordonnees de 
         l'extremite E(xE,yE): \n);
         
         scanf("%f%f, &xE, &yE);
         if((xE<0)||(xE>1)||(yE<0)||(yE>1)
         {
              printf("Erreur saisie.\n);
         }
    
         


    Bonsoir,

    Je me suis récemment mis au code en C et je suis tombé sur un exercice qui me pose problème.

    Voici l'énoncé:

    On s’intéresse au tracé sur écran de segments de droite. Un tel tracé s’effectue en allumant les pixels les plus proches possible du segment “réel”. L’image affichée, constituée de l’ensemble des pixels, est représentée par un tableau de N*N entiers Image[N][N] (on prendra N=20 et on utilisera la directive #define N 20 pour fixer cette valeur). On supposera que chaque pixel ne possède que 2 états: 0 pour éteint et 1 pour allumé.

    Dans la suite, on travaillera dans le premier quadrant (0<=x<=1 et 0<=y<=1)et on supposera que l’une des extrémités du segment coïncide avec l’origineO. On notera l’autre extrémité E=(xE,yE).

    À un point de coordonnées (x,y) de l'image réelle, on associe le pixel le plus proche ayant pour indices i=|N*x+0.5| et j=|N*y+0.5|, où |x| désigne la partie entière inférieure de x.

    1°) Écrire une fonction int arrondi(float x) qui calcule et renvoie la partie entière inférieure de N*x+0.5.

    Voici ce que j'ai fais:

    2°)Dans une fonction main(), déclarer un tableau Image[][] de N*N entiers et initialiser ses éléments à zéro.



    Et, demander à l’utilisateur de saisir au clavier les coordonnées de l’extrémité (xE, yE) en vérifiant qu’on a bien 0<=xE,yE<=1. Ajouter les instructions pour afficher à l’écran les indices associés au pixel le plus proche de E (utiliser la fonction arrondi()).

    Voir plus haut.



    Voilà, j'ai essayé, je sais que j'ai oublier plein de choses, surtout à la fin et je vous avoue que je me perds dans tout ça.

    Merci d'avance pour votre aide.

    -
    Edité par JakeWater 28 novembre 2020 à 21:33:56

    • Partager sur Facebook
    • Partager sur Twitter
      28 novembre 2020 à 1:49:48

      Salut,
      Tu n'as pas donné de code complet. Ton main n'est pas complété.
      Il te faut les fichiers d'inclusion (#include <...>) et le #define qu'on te demande.
      As-tu un compilateur. Il est bon de tester son code soi-même.
      Le pire qu'il peut arriver est que ça ne fonctionne pas, soit à cause d'une erreur de compilation, soit une erreur à l'exécution.
      Ta fonction arrondi est correcte.
      Je suggère de déclarer le tableau sur une ligne séparée. Certains te diront même d'avoir une ligne par variable.
      Tu ne déclares pas correctement les variables de type float: x, y, xE, yE.
      Les variables i et j pourraient être déclarées dans le for correspondant (regardes la documentation).
      Tu initialises correctement le tableau image.
      Dans le scanf(), le format pour float est %f
      Petite erreur de frappe: yE<01 (on doit lire yE<0)
      Tu n'assignes pas le résultat de arrondi() dans une variable, que tu pourrais appeler ix (ou iy)
      Fais avec la variable y comme avec x.
      On te dit comment faire pour allumer un pixel.
      Il te rreste à afficher le résultat dans deux boucles for imbriquées ...
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        28 novembre 2020 à 10:10:25

        Utilises le bouton code </> du forum pour poster ton code ! (tu peux modifier ton post, lien modifier en haut à droite du post).

        JakeWater a écrit:

        demander à l’utilisateur de saisir au clavier les coordonnées de l’extrémité (xE, yE) en vérifiant qu’on a bien 0<=xE,yE<=1. 

        Avec des entiers, ça va pas être facile !

        -
        Edité par rouloude 28 novembre 2020 à 10:36:44

        • Partager sur Facebook
        • Partager sur Twitter
          28 novembre 2020 à 21:20:10

          Bonsoir,

          Merci PierrotLeFou ainsi que rouloude pour ces réponses.

          Oui, désolé, les fichiers d'inclusion, je les ai mis dans mon compilateur CodeBlocks effectivement mais ici, j'ai oublié. J'y penserais la prochaine fois.;-)

          Variables séparées--->O.K, je prends note.

          x,y,xE,yE en float.....c'est vrai qu'avoir xE et yE entre 0 et 1, ce ne sera pas facile (merci les gars).

          Si j'écris for(int i=0; i<N; i++), c'est bon ou bien (int i; int i<N; int i++)?

          %f dans le scanf car ce sont des float---Noté!

          Merci pour l'erreur de frappe!

          Quand tu dis que je n'assigne pas le résultat de arrondi() dans une variable mais dans par exemple ix( resp iy), je ne saisi pas trop. Comment je pourrais faire? Je ne vois pas trop ce que tu veux dire. 

          Veux-tu dire que je dois écrire printf("L'arrondi de l'extrémité est %d ", arrondi(ix));?

          float ix=0;
          float iy=0;
          printf("L'arrondi de l'extremite xE(ou yE) est: ", arrondi(ix)(ou iy));?      (Merci du conseil rouloude ;-)!)
          //Pour allumer le pixel, j'essaie:
          float delta= yb-ya/xb-xa;
          for(i=ix;i<xE;i++)
          {    for(j=iy;j<yE;j++)
               {
                    iy=y+(ix-x)*delta;
                    printf(       , ix, arrondi(iy);       //Je ne sais pas trop comment afficher le pixel en (ix, arrondi(iy)
               }
          }
          Merci.   



          • Partager sur Facebook
          • Partager sur Twitter
            28 novembre 2020 à 22:09:04

            Ton code est illisible, poste le correctement dans une seule fenêtre !
            • Partager sur Facebook
            • Partager sur Twitter
              28 novembre 2020 à 22:19:44

              float ix=0;
              float iy=0;
              
              printf("L'arrondi de l'extremite xE( ou yE) est: "arrondi(ix) (ou iy);
              
              //Pour allumer le pixel, j'essaie:
              
              float delta=iy-y/ix-x;
              
              for(i=ix;i<xE;i++)
              {
                 for(j=iy;j<yE;j++)
                 {
                     iy=y+(ix-x)*delta;
                     printf(ix, arrondi(iy));
                 }
              }

              C'est mieux comme cela.
              • Partager sur Facebook
              • Partager sur Twitter
                28 novembre 2020 à 23:08:14

                Hello,

                JakeWater a écrit:

                float ix=0;
                float iy=0;
                
                printf("L'arrondi de l'extremite xE( ou yE) est: "arrondi(ix) (ou iy);
                
                //Pour allumer le pixel, j'essaie:
                
                float delta=iy-y/ix-x;
                
                for(i=ix;i<xE;i++)
                {
                   for(j=iy;j<yE;j++)
                   {
                       iy=y+(ix-x)*delta;
                       printf(ix, arrondi(iy));
                   }
                }



                Il va falloir revoir les bases du C: la ligne 4 ne compile pas, le printf() ligne 15 non plus.

                Et que crois-tu que va donner la ligne 8 ? Revois la priorité des opérateurs, car je suppose que tu voudrais que l'opération soit delta=(iy-y)/(ix-x). Toi, ce que tu as écrit, c'est delta=iy-x-y/ix



                -
                Edité par edgarjacobs 28 novembre 2020 à 23:28:02

                • Partager sur Facebook
                • Partager sur Twitter

                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                  28 novembre 2020 à 23:33:40

                  Salut Edgarjacobs,

                  Les lignes 4 et 15 vont retourner un 0 j'imagine, car ix (resp. iy) est égal à 0.

                  Dans mon 1er message, j'avais écris concernant la ligne 4: arrondi(xE) mais on m'a dit que c'était faux, je t'avoue que je suis perdu sur ce point (d'autres aussi d'ailleurs) étant novice.

                  Dans la ligne 8, j'ai écris, que delta=(iy-y)/(ix-x), je n'ai pas écris que delta=iy-x-y/ix.

                  En gros, ce que je veux, c'est delta=(yB-yA)/(xB-xA) avec yB>yA et xB>xA

                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 novembre 2020 à 0:23:41

                    JakeWater a écrit:

                    C'est mieux comme cela.

                    Le code est mis correctement dans dans le conteneur, sauf que le code c'est du m'importe quoi !

                    JakeWater a écrit:

                    Les lignes 4 et 15 vont retourner un 0 j'imagine, 

                     Elles ne vont rien retourner, printf sert à afficher du texte sur l'écran, et tu devrais revoir son utilisation ! 



                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 novembre 2020 à 0:26:05

                      JakeWater a écrit:

                      Les lignes 4 et 15 vont retourner un 0 j'imagine, car ix (resp. iy) est égal à 0.

                      Non, ces lignes sont syntaxiquement incorrectes, donc elles ne retourneront rien puisque le programme n'aura pas été compilé.

                      Dans mon 1er message, j'avais écris concernant la ligne 4: arrondi(xE) mais on m'a dit que c'était faux, je t'avoue que je suis perdu sur ce point (d'autres aussi d'ailleurs) étant novice.

                      Le problème n'est pas là mais dans la syntaxe de 'printf' : il faut indiquer le format d'affichage (%d peut-être).

                      Dans la ligne 8, j'ai écris, que delta=(iy-y)/(ix-x), je n'ai pas écris que delta=iy-x-y/ix.

                      Ah si :

                      float delta=iy-y/ix-x;  // est équivalent à iy-x-y/ix

                      En effet il fallait mettre des parenthèses, c'est pour ça qu'Edgarjacobs parlait des priorités des opérations.

                      -
                      Edité par robun 29 novembre 2020 à 0:26:59

                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 novembre 2020 à 1:55:12

                        J'ai l'impression que je me suis mal exprimé.
                        Tu appelles la fonction arrondi() avec un float comme argument, et tu t'attends à ce que ça soit converti en int.
                        Ça, la fonction le fait bien. Mais où va la valeur retournée par la fonction?
                        J'ai suggéré des variables de type int que j'ai nommées ix et iy (pour integer x ...)
                        Donc ce que tu dois faire est d'assigner à ix et iy les conversions de x et y.
                        Ce n'est pas une bonne idée de mettre les résultats des appels à arrondi() directement dans les printf() car tu en auras besoin plus tard.
                        Comment penses-tu mettre à 1 le pixel correspondant aux coordonnées que tu viens de saisir?
                        Et on ne te demande qu'un seul point. Sinon, tu devrais mettre la saisie, etc., dans une boucle pour en saisir plusieurs.
                        Ça me fait penser aux vieux traceurs mécaniques pour lesquels il fallait arrondir le tracé au dixième de millimèttre.
                        On a encore le même problème si on veut tracer sur un écran. On ne peut pas mettre de point entre deux pixels.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Le Tout est souvent plus grand que la somme de ses parties.

                          29 novembre 2020 à 17:45:04

                          JakeWater a écrit:

                          Dans la ligne 8, j'ai écris, que delta=(iy-y)/(ix-x), je n'ai pas écris que delta=iy-x-y/ix

                          Bien sur que si. Si tu ne mets pas les parenthèses, le compilateur ne les mettra pas pour toi. Lui, il fait ce que tu lui dis de faire. Si j'écris 10-4/4-1, ça donnera 8, pas 2.

                          -
                          Edité par edgarjacobs 29 novembre 2020 à 17:48:15

                          • Partager sur Facebook
                          • Partager sur Twitter

                          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                            29 novembre 2020 à 18:00:47

                            Même en algèbre, ça ne serait pas ce que tu penses.
                            Ça ressemble plus à ce qu'on ferait avec une calculette:
                            10
                            -
                            4
                            /   à ce moment, elle affiche 6
                            4
                            -     elle affiche 1.5 ?
                            1
                            =   elle affiche 0.5
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Le Tout est souvent plus grand que la somme de ses parties.

                              29 novembre 2020 à 20:03:06

                              JakeWater a écrit:

                              Les lignes 4 et 15 vont retourner un 0 j'imagine

                              Laisse Imagine à Lennon. En programmation on n'imagine pas que le résultat untel va être donné, ça se vérifie.

                              -
                              Edité par edgarjacobs 29 novembre 2020 à 20:05:09

                              • Partager sur Facebook
                              • Partager sur Twitter

                              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                29 novembre 2020 à 20:42:08

                                robun a écrit:

                                Non, ces lignes sont syntaxiquement incorrectes, donc elles ne retourneront rien puisque le programme n'aura pas été compilé.

                                Le problème n'est pas là mais dans la syntaxe de 'printf' : il faut indiquer le format d'affichage (%d peut-être). 

                                Oui, tu as raison, merci! 

                                edgarjacobs a écrit:

                                          Bien sur que si. Si tu ne mets pas les parenthèses, le compilateur ne les mettra pas pour toi. Lui, il fait ce que tu lui dis de faire. Si j'écris 10-              4/4-1, ça donnera 8, pas 2.

                                Au temps pour moi, je comprends. J'ai tendance à les oublier dans les forums alors que dans le compilateur je les mets systématiquement.

                                J'éviterais à l'avenir. Merci.

                                PierrotLeFou a écrit:

                                J'ai l'impression que je me suis mal exprimé.
                                Tu appelles la fonction arrondi() avec un float comme argument, et tu t'attends à ce que ça soit converti en int.
                                Ça, la fonction le fait bien. Mais où va la valeur retournée par la fonction?
                                J'ai suggéré des variables de type int que j'ai nommées ix et iy (pour integer x ...)
                                Donc ce que tu dois faire est d'assigner à ix et iy les conversions de x et y.

                                Est-ce-que si je mets un int juste après le return pour que la fonction me retourne un entier, c'est correct?

                                int arrondi(float x)
                                {
                                    return (int)(N*(x+0.5));
                                }

                                PierrotLeFou a écrit:


                                Ce n'est pas une bonne idée de mettre les résultats des appels à arrondi() directement dans les printf() car tu en auras besoin plus tard.

                                 En gros, après les 2 boucles for, j'écris "arrondi(iy);  et ensuite printf...., c'est bien ça?

                                PierrotLeFou a écrit:


                                Comment penses-tu mettre à 1 le pixel correspondant aux coordonnées que tu viens de saisir?
                                Et on ne te demande qu'un seul point. Sinon, tu devrais mettre la saisie, etc., dans une boucle pour en saisir plusieurs.
                                Ça me fait penser aux vieux traceurs mécaniques pour lesquels il fallait arrondir le tracé au dixième de millimèttre.
                                On a encore le même problème si on veut tracer sur un écran. On ne peut pas mettre de point entre deux pixels.


                                Je ne vais pas te mentir, je n'en ai aucune idée, je ne vois pas ce que je peux faire.

                                Peut-être que lorsqu’un pixel s'allume ou s'éteint, on utilise les booléens?

                                Merci PierrotLeFou pour toute cette aide.






                                • Partager sur Facebook
                                • Partager sur Twitter
                                  29 novembre 2020 à 21:08:10

                                  JakeWater a écrit:

                                  L’image affichée, constituée de l’ensemble des pixels, est représentée par un tableau de N*N entiers Image[N][N] (on prendra N=20 et on utilisera la directive #define N 20 pour fixer cette valeur). On supposera que chaque pixel ne possède que 2 états: 0 pour éteint et 1 pour allumé.

                                  Ça me semble assez clair pour le tableau représentant les pixel !
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    30 novembre 2020 à 1:30:09

                                    @JakeWater:
                                    Je ne répond pas par MP à ce genre de problème. (Ça ne me dérange pas que tu me dises TU ...)
                                    Tu sembles mélanger les types de variables, et ce n'est pas une bonne idée que d'utiliser des float comme variables de contrôle dans un for.
                                    Ensuite, je crois que l'exercice n'a pas été compris.
                                    Il ne s'agit pas de tracer une "vraie" image à l'écran, mais un tableau de 0 et de 1 pour montrer où sera placé le point saisi.
                                    Je te suggère de reviser les parties du cours sur les types de variable, les fonctions avec valeur de retour, l'assignation, l'affichage avec printf(), etc.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Le Tout est souvent plus grand que la somme de ses parties.

                                    Tracé de segment pour un débutant en C

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown