Page 1 sur 2
Segment de longueur nulle
Publié : lun. janv. 07, 2013 3:18 pm
par albenic
Bonjour,
sauf erreur de ma part, la commande
génère une erreur. En fait le message est
Or dans un programme, je manipule une liste de segments dont je demande l'affichage.
Comme il y a des segments de longueur nulle dans la liste, j'ai droit à un message d'erreur et aucun segment n'est tracé.
Comment puis-je contourner cette difficulté ?
Par avance merci.
PS : à noter que je trace aussi une liste de points, si je demande d'abord l'affichage des points puis celui des segments cela marche à peu près (l'épaisseur et la couleur ne sont pas prises en compte pour les segments) en revanche dans l'autre sens : affichage des segments puis des points, je n'obtiens rien à l'affichage.
Re: Segment de longueur nulle
Publié : lun. janv. 07, 2013 3:42 pm
par alb
c'est normal car il y a une infinité de segments passant par deux points confondus !
il faut éliminer de la liste les cas où les deux arguments sont confondus.
Re: Segment de longueur nulle
Publié : lun. janv. 07, 2013 4:54 pm
par albenic
Ouh là. Quelle définition de segment prends-tu ?
Quoi, qu'il en soit, j'avais dans l'idée que la fonction segment traçait un segment entre deux points distincts et un point dans le cas contraire mais j'ai mis un peu de temps à comprendre que ce n'était pas ainsi qu'elle était définie.
Je peux faire ce que tu proposes mais mon programme va perdre en lisibilité et cela m'ennuie.
Affaire à suivre...
Re: Segment de longueur nulle
Publié : lun. janv. 07, 2013 6:17 pm
par parisse
La raison derrière ce problème c'est que en interne, segment, demi-droite, droite et vecteur sont codés de manière identique, avec un attribut secondaire (qui gère le type), ce qui permet d'unifier par exemple la recherche d'intersections. Il n'est donc pas possible de changer le fait qu'un segment passant par 2 points confondus sera indéfini.
Pour le P.S., avez-vous des exemple de ligne de commande qui ne marchent pas (ou qui ne tiennent pas compte des attributs)?
Re: Segment de longueur nulle
Publié : lun. janv. 07, 2013 7:34 pm
par alb
je proposerais aux élèves d'inventer une fonction plus proche de la définition mathématique,
qu'on appellera dans le programme principal.
Code : Tout sélectionner
Segment(A,B):={
si A==B alors
retourne point(A)
sinon
retourne segment(A,B)
fsi
}:;
Re: Segment de longueur nulle
Publié : lun. janv. 07, 2013 8:00 pm
par parisse
Excellent! Je n'avais même pas vu que je pouvais faire pareil au début de la fonction segment, sans changer la manière interne de coder le segment!
Re: Segment de longueur nulle
Publié : mar. janv. 08, 2013 12:55 pm
par albenic
parisse a écrit :La raison derrière ce problème c'est que en interne, segment, demi-droite, droite et vecteur sont codés de manière identique, avec un attribut secondaire (qui gère le type), ce qui permet d'unifier par exemple la recherche d'intersections. Il n'est donc pas possible de changer le fait qu'un segment passant par 2 points confondus sera indéfini.
Pour le P.S., avez-vous des exemple de ligne de commande qui ne marchent pas (ou qui ne tiennent pas compte des attributs)?
C'est ce que je craignais. J'ai donc modifier mon programme en rajoutant un test sur les segments si segment égal UNDEF alors je donne la valeur du point.
Pour l'exemple, voici la version originale avec en commentaire la nouvelle version :
Code : Tout sélectionner
repete_lancers(n,p):={
local j,k,eff,freq,batons,points,result;
// j : numéro de la simulation
// result : nombre de "Pile" dans la simulation
// eff[k] : nombre de fois où l'on obtient k "Pile" au cours des 10 000 simulations
// freq[k] : fréquence d'obtention de k "Pile" au cours des 10 000 simulations
eff:=[0$26]; // On initialise la liste eff avec 26 fois la valeur 0
freq:=[0$26]; // On initialise la liste freq avec 26 fois la valeur 0
batons:=[]; // On définit une liste vide nommée batons pour la représentation graphique
points:=[]; // On définit une liste vide nommée points pour la représentation graphique
pour j de 1 jusque 10000 faire
result:=lancers(n,p);
eff[result]:=eff[result]+1;
fpour
afficher("Au cours de 10 000 simulations de lancers, on a obtenu :");
freq:=eff/10000;
//pour k de 0 jusque n faire
// si segment(point(k,0),point(k,freq[k]))==undef alors batons:=batons,point(k,0) sinon batons:=batons,segment(point(k,0),point(k,freq[k])) fsi;
//fpour;
batons:=seq(segment(point(k,0),point(k,freq[k])),k,0,25,1);
points:=seq(point(k,freq[k]),k,0,n,1);
afficher(freq);
affichage(batons,vert+line_width_4),affichage(points,rouge+point_width_4);
}
:;
et la fonction lancers(n,p) :
Code : Tout sélectionner
lancers(n,p):={
local k,pile;
// k : numéro du lancer
// pile : Nombre de "Pile" obtenus
pile := 0;
pour k de 1 jusque n faire
si alea(0,1)<p alors pile := pile + 1 fsi;
fpour;
retourne(pile);
}
:;
Dans le code tel quel, j'ai le tracé des segments mais sans les attributs.
Si j'inverse les commandes :
Code : Tout sélectionner
affichage(points,rouge+point_width_4),affichage(batons,vert+line_width_4);
au lieu de
Code : Tout sélectionner
affichage(batons,vert+line_width_4),affichage(points,rouge+point_width_4);
alors aucun tracé. Je peux comprendre ce second cas mais pour le premier, j'ai du mal à comprendre ce qui se passe (soit la commande est exécutée soit elle ne l'ai pas, me semble t-il).
Re: Segment de longueur nulle
Publié : mar. janv. 08, 2013 12:56 pm
par albenic
alb a écrit :je proposerais aux élèves d'inventer une fonction plus proche de la définition mathématique,
qu'on appellera dans le programme principal.
Code : Tout sélectionner
Segment(A,B):={
si A==B alors
retourne point(A)
sinon
retourne segment(A,B)
fsi
}:;
C'est ce que j'ai fini par faire !!!!
Re: Segment de longueur nulle
Publié : mar. janv. 08, 2013 12:58 pm
par albenic
parisse a écrit :Excellent! Je n'avais même pas vu que je pouvais faire pareil au début de la fonction segment, sans changer la manière interne de coder le segment!
Ccela signifie t-il que cette évolution fera partie d'une mise à jour prochaine ?
Re: Segment de longueur nulle
Publié : mar. janv. 08, 2013 1:22 pm
par parisse
Oui, c'est dans la version d'aujourd'hui.
La difference de comportement va disparaitre, elle venait du fait que baton se termine par des segments avec 2 points confondus, qui donnait undef. Or xcas se base sur le dernier element de la liste renvoyee pour savoir s'il doit afficher un graphique ou une reponse texte, et si on termine par baton c'etait un undef donc pas un objet graphique.
Re: Segment de longueur nulle
Publié : mar. janv. 08, 2013 4:55 pm
par albenic
Merci pour l'évolution, ces éclaircissements et plus généralement le travail sur ce beau logiciel.
Re: Segment de longueur nulle
Publié : mar. janv. 08, 2013 5:37 pm
par albenic
Je viens de télécharger la nouvelle version (sous ubuntu) et j'ai fait le test. C'est pleinemet fonctionnel.
Bravo et merci.
Re: Segment de longueur nulle
Publié : jeu. janv. 10, 2013 10:14 pm
par alb
j'ai 2 soucis
1/ depuis lundi, en faisant sudo apt-get install giac j'avais toujours giac est déjà la plus récente version disponible
et ce n'était pas le cas !
2/ ce soir avec synaptic j'ai une version 1.0.0 avec la correction du bug cité ici
je ne sais pas si c'est la version stable ou testing
Cependant segment(1+i,1+i) affiche le point de coordonnées 1 et 6
Re: Segment de longueur nulle
Publié : ven. janv. 11, 2013 7:19 am
par parisse
oups, j'ai fait trop vite la correction la derniere fois, je suis en train de recorriger.
Re: Segment de longueur nulle
Publié : sam. janv. 12, 2013 2:24 pm
par alb
Est-il possible que vecteur(1+i,1+i) trace le point (1,1)
et que coordonnees(vecteur(1+i,1+i)) renvoie [0,0] ?