analyse d'une réponse jsxgraphcurve

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

Mots-clés : 

Ce sujet a 3 réponses, 2 participants et a été mis à jour par  bernadette, il y a 2 ans.

  • Auteur
    Messages
  • #3054

    Richard Taillet
    Participant

    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}
  • #3058

    bernadette
    Admin bbPress

    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

    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
    Admin bbPress

    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 devez être connecté pour répondre à ce sujet.