analyse d'une réponse jsxgraphcurve

Accueil Forums Programmation WIMS Programmation dans le langage wims analyse d'une réponse jsxgraphcurve

Étiqueté : 

Vous lisez 3 fils de discussion
  • Auteur
    Messages
    • #3054
      Richard Taillet
      Participant
      Up
      0
      Down
      ::

      Bonjour,

      Je suis en train de finaliser un exercice portant sur la réfraction et sur l’utilisation d’un rapporteur, l’utilisateur doit tracer un trait faisant un angle donné avec la verticale (code complet ci-dessous), puis si c’est correct, doit en tracer un autre. Mon problème est le suivant : je vérifie que la première droite tracée a la bonne pente grâce à la commande

      \condition{}{abs(\angle+\angleincident-90)<1}

      Quand je teste le code joint, effectivement à la première étape, WIMS me sort un OUI ou un NON, selon que j’ai bien tracé ce qui était demandé. En revanche, il passe à l’étape 2 de toute façon, indépendamment de la réussite ou non de l’étape 1. Du coup j’ai l’impression que \condition, en fait, c’est juste une fonction qui écrit la ligne OUI ou NON, une fois la réponse donnée, mais que ce qui gère le fait que la réponse soit considérée correcte ou pas dans l’exo (et donc fait éventuellement recommencer), c’est \answer. Du coup, quel est le mécanisme permettant de ne pas passer à la seconde étape si la première n’est pas correcte ?

      Merci d’avance !

      Richard.

      \title{Loi de Snell-Descartes pour une réfraction verre-air}
      \language{fr}
      \author{Richard Taillet}
      
      \css{<style type="text/css">
       .consigne{font-style:italic;border:1px solid silver;font-size:small;margin:1.5rem 0.5rem 0rem 0.3rem;background-color:rgba(230,230,230,0.3);color:rgb(100,100,100)}
        .consigne, .consigne h2{padding:.3rem .4rem;}
        .consigne h2{display:inline-block;font-size:0.8em;margin:-0.3rem;background-color:silver;color:rgb(80,80,80)}
      
      .jxgbox {margin-left:auto;margin-right:auto;}
      .jsxgraph_button {text-align:center;}
      
      </style>}
      
      \computeanswer{no}
      \format{html}
      \precision{1000}
      
      \range{-5..5}
      
      \integer{angleincident=5*randint(1..17)}
      \real{indice=1.5}
      
      \real{anglerefracte=asin(sin(\angleincident*3.14159/180.)/\indice)*180/3.14159}
      \real{anglerefracte=floor(\anglerefracte*10)*0.1}
      
      \integer{rayon=300}
      \integer{xpix=2*\rayon*1.2}
      \integer{ypix=2*\rayon*1.2}
      
      \real{xmin=-1.2}
      \real{xmax=1.2}
      
      \real{ysize=1}
      \real{ymin=-0.2}
      \real{ymax=1.2}
      
      \text{rapporteur=linewidth 1
      frect 0,0,\xpix,\ypix/2,lightgray
      text black,\xpix/4, \ypix/2*0.92, large, verre
      text black,\xpix/4, \ypix/2*1.05, large, air
      }
      
      \text{rapporteurbas=\rapporteur}
      
      \for{i=90 to 180 step 10}{
           \real{ang=\i*3.14/180}
           \real{ang=floor(\ang*1000)/1000}
           \text{rapporteur=\rapporteur
           line \xpix/2+\rayon*cos(\ang), \ypix/2-\rayon*sin(\ang), \xpix/2+\rayon*1.1*cos(\ang),\ypix/2-\rayon*1.1*sin(\ang), black 
           }
      }
      
      \for{i=90 to 180 step 30}{
           \text{rapporteur=\rapporteur
           text black, \xpix/2+\rayon*1.1*cos(\i*3.14/180),\ypix/2-\rayon*1.1*sin(\i*3.14/180),large, \i
           }
      }
      
      \text{rapporteur=\rapporteur
      line \xpix/2-0.1*\rayon, \ypix/2, \xpix/2+0.1*\rayon, \ypix/2, black
      line \xpix/2, \ypix/2-0.1*\rayon, \xpix/2, \ypix/2+0.1*\rayon, black
      }
      
      \for{i=95 to 175 step 10}{
           \real{ang=\i*3.14/180}
           \text{rapporteur=\rapporteur
           line \xpix/2+\rayon*cos(\ang), \ypix/2-\rayon*sin(\ang), \xpix/2+\rayon*1.05*cos(\ang),\ypix/2-\rayon*1.05*sin(\ang), black 
          }
      }
      
      \for{i=91 to 179 step 1}{
           \real{ang=\i*3.14/180}
           \real{ang=floor(\ang*1000)/1000}
           \text{rapporteur=\rapporteur
           line \xpix/2+\rayon*cos(\ang), \ypix/2-\rayon*sin(\ang), \xpix/2+\rayon*1.02*cos(\ang),\ypix/2-\rayon*1.02*sin(\ang), black 
          }
      }
      
      // rapporteur du bas pour la 2eme partie de l'exo
      
      \for{i=-90 to 180 step 10}{
           \real{ang=\i*3.14/180}
           \real{ang=floor(\ang*1000)/1000}
           \text{rapporteurbas=\rapporteurbas
           line \xpix/2+\rayon*cos(\ang), \ypix/2+\rayon*sin(\ang), \xpix/2+\rayon*1.1*cos(\ang),\ypix/2+\rayon*1.1*sin(\ang), black 
           }
      }
      
      \for{i=-90 to 180 step 30}{
           \text{rapporteurbas=\rapporteurbas
           text black, \xpix/2+\rayon*1.1*cos(\i*3.14/180),\ypix/2+\rayon*1.1*sin(\i*3.14/180),large, \i
           }
      }
      \text{rapporteurbas=\rapporteurbas
      line \xpix/2-0.1*\rayon, \ypix/2, \xpix/2+0.1*\rayon, \ypix/2, black
      line \xpix/2, \ypix/2-0.1*\rayon, \xpix/2, \ypix/2+0.1*\rayon, black
      }
      
      \for{i=5 to 175 step 10}{
           \real{ang=\i*3.14/180}
           \real{ang=floor(\ang*1000)/1000}
           \text{rapporteurbas=\rapporteurbas
           line \xpix/2+\rayon*cos(\ang), \ypix/2+\rayon*sin(\ang), \xpix/2+\rayon*1.05*cos(\ang),\ypix/2+\rayon*1.05*sin(\ang), black 
          }
      }
      \for{i=-89 to 180 step 1}{
           \real{ang=\i*3.14/180}
           \text{rapporteurbas=\rapporteurbas
           line \xpix/2+\rayon*cos(\ang), \ypix/2+\rayon*sin(\ang), \xpix/2+\rayon*1.02*cos(\ang),\ypix/2+\rayon*1.02*sin(\ang), black 
          }
      }
      
      \text{rapporteurbas=\rapporteurbas
      linewidth 2
      line \xpix/2-\rayon*cos((90-\anglerefracte)*3.14/180), \ypix/2-\rayon*sin((90-\anglerefracte)*3.14/180), \xpix/2, \ypix/2, blue}
      
      \text{dessin= draw( \xpix,\ypix 
      
      		\rapporteur
      
      )
      }
      \text{dessinbas= draw( \xpix,\ypix 
      
      		\rapporteurbas
      )
      }
      
      \text{choix=oui,non}
      \text{reponse=2}
      
      \text{ETAPE = r1
      r2
      r3}
      
      \steps{\ETAPE}
      
      \statement{ 
      Un rayon lumineux venant de la gauche et se propageant initialement dans du verre (d'indice égal à \indice) arrive sur une interface d'air horizontale (indice de réfraction égal à 1), au point O, avec un angle d'incidence de \anglerefracte degrés.
              \if{\step == 1}{
                   <p>1. <b>Tracer le rayon incident.</b></p>
                   \embed{r1,\xpix x \ypix
                        \dessin
                        sline}
              }
              \if{\step == 2}{
                   <p>1. Le rayon incident est tracé correctement.</p>
                   <p>2. <b>La condition de réflexion totale est-elle vérifiée ?</b></p>
                   \embed{r2,1}\embed{r2,2}
                   }
             \if{\step == 3}{
                   <p>1. Le rayon incident est tracé correctement.</p>
                   <p>2. La condition de réflexion totale n'est pas vérifiée.</p>
                   <p>3. <b>Tracer le rayon émergent.</b></p>
                   \embed{r3,\xpix x \ypix
                        \dessinbas
                        sline}
                    }
      <div class="consigne">
        <h2>Consignes&nbsp;: </h2>
        <p>La droite est définie en cliquant successivement sur deux points de la figure. Il est conseillé de commencer par cliquer au centre du rapporteur.</p>
      </div>
      }
      
      \answer{}{\jstest}{type=jsxgraphcurve} {option=color1=blue color2=blue precision=8}
      \answer{}{\reponse;\choix}{type=click} {option=noanalyzeprint}
      \answer{}{\jstestbas}{type=jsxgraphcurve} {option=color1=blue color2=blue precision=8}
      
      \real{longueur = sqrt((\jstest[4]-\jstest[2])*(\jstest[4]-\jstest[2])+(\jstest[3]-\jstest[1])*(\jstest[3]-\jstest[1]))}
      \real{cosinus = (\jstest[3]-\jstest[1])/\longueur}
      
      \real{angle=0.}
      
      \if {\cosinus==0}{
         \real{angle=90}
      }
      {
         \real{angle=atan((\jstest[4]-\jstest[2])/(\jstest[3]-\jstest[1]))/3.14159*180}
      }
      
      \if {\angle<0}{\real{angle=180+(\angle)}}
      
      \real{longueurbas = sqrt((\jstestbas[4]-\jstestbas[2])*(\jstestbas[4]-\jstestbas[2])+(\jstestbas[3]-\jstestbas[1])*(\jstestbas[3]-\jstestbas[1]))}
      \real{cosinusbas = (\jstestbas[3]-\jstestbas[1])/\longueurbas}
      
      \real{anglebas=0.}
      
      \if {\cosinusbas==0}{
         \real{anglebas=90}
      }
      {
         \real{anglebas=atan((\jstestbas[4]-\jstestbas[2])/(\jstestbas[3]-\jstestbas[1]))/3.14159*180}
      }
      
      \if {\anglebas<0}{\real{anglebas=180+(\anglebas)}}
      
      \real{ecart=abs(\anglebas-90+\angleincident)}
      \condition{Votre tracé}{abs(\angle+\anglerefracte-90)<1}
      \condition{Votre tracé est correct (il s'écarte de la valeur attendue de \ecart deg)}{\ecart<1}
      • Ce sujet a été modifié le il y a 8 années et 7 mois par Richard Taillet.
      • Ce sujet a été modifié le il y a 8 années et 7 mois par Richard Taillet.
      • Ce sujet a été modifié le il y a 8 années et 7 mois par Richard Taillet.
    • #3058
      bernadette
      Maître des clés
      Up
      0
      Down
      ::

      Utiliser nextstep devrait résoudre le problème, il me semble. Mais je n’ai
      pas retester si cela convient exactement à ce que tu veux
      (mais j’ai ce modèle sous la main !).

      \text{nstep=r1}
      \nextstep{\nstep}
      \text{repg=1}
      \text{instruction=vxvqsd }
      \statement{
      \instruction
      \embed{r \step}
      }
      \answer{}{\rep1}{type=numeric}{option=nonstop noanalyzeprint}
      \answer{}{\rep2}{type=numeric}{option=nonstop noanalyzeprint}
      \answer{}{\rep3}{type=numeric}{option=nonstop noanalyzeprint}
      \text{nstep=}
      \text{nstep=\rep1!=\repg and \step=2? r2}
      \text{nstep=\rep2!=\repg and \step=3? r3}
      \condition{}{\reply1=\repg or \reply2=\repg or \reply3=\repg}{option=hide}

    • #3059
      Richard Taillet
      Participant
      Up
      0
      Down
      ::

      Merci pour cette réponse rapide ! Cependant, je ne comprends pas suffisamment l’exemple pour voir en quoi il répond à ma question et quand je le teste tel quel, je ne comprends pas non plus ce qu’il fait (quelle serait la réponse considérée comme correcte dans votre exemple ?).

      Pourquoi l’utilisation de « \nextstep » est-elle ici préférable à celle de « \steps » ? J’ai sous les yeux la doc que vous avez écrite avec Sophie Lemaire, et la lecture du paragraphe 4.2 consacré aux exercices à étapes m’a donné l’impression que les deux mécanismes étaient équivalents.

      J’essaie de comprendre ! 😉

    • #3064
      bernadette
      Maître des clés
      Up
      0
      Down
      ::

      Avec nextstep, on peut décider après le statement quelle sera la question suivante.
      Avec \steps, la succession des questions est décidé avant le statement, donc ne peut pas être changé selon la réponse de l’élève.

      Excusez moi, je ne pourrais pas répondre les prochains jours, j’ai donc répondu un peu à la va vite et en fait le code en question ne fait ce que vous voulez.

      Il est fait pour poser trois fois la même question. S’arrête dès que la réponse est bonne, je crois.

      Bernadette

Vous lisez 3 fils de discussion
  • Vous devez être connecté pour répondre à ce sujet.