Segment de longueur nulle

Bugs

Modérateur : xcasadmin

albenic
Messages : 40
Inscription : mer. oct. 08, 2008 7:19 pm

Segment de longueur nulle

Message par albenic » lun. janv. 07, 2013 3:18 pm

Bonjour,
sauf erreur de ma part, la commande

Code : Tout sélectionner

segment(point(0,0),point(0,0))
génère une erreur. En fait le message est

Code : Tout sélectionner

UNDEF
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.

alb
Messages : 1229
Inscription : ven. août 28, 2009 3:34 pm

Re: Segment de longueur nulle

Message par alb » lun. janv. 07, 2013 3:42 pm

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.

albenic
Messages : 40
Inscription : mer. oct. 08, 2008 7:19 pm

Re: Segment de longueur nulle

Message par albenic » lun. janv. 07, 2013 4:54 pm

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...

parisse
Messages : 5081
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Segment de longueur nulle

Message par parisse » lun. janv. 07, 2013 6:17 pm

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)?

alb
Messages : 1229
Inscription : ven. août 28, 2009 3:34 pm

Re: Segment de longueur nulle

Message par alb » lun. janv. 07, 2013 7:34 pm

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
}:;

parisse
Messages : 5081
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Segment de longueur nulle

Message par parisse » lun. janv. 07, 2013 8:00 pm

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!

albenic
Messages : 40
Inscription : mer. oct. 08, 2008 7:19 pm

Re: Segment de longueur nulle

Message par albenic » mar. janv. 08, 2013 12:55 pm

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).

albenic
Messages : 40
Inscription : mer. oct. 08, 2008 7:19 pm

Re: Segment de longueur nulle

Message par albenic » mar. janv. 08, 2013 12:56 pm

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 !!!!

albenic
Messages : 40
Inscription : mer. oct. 08, 2008 7:19 pm

Re: Segment de longueur nulle

Message par albenic » mar. janv. 08, 2013 12:58 pm

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 ?

parisse
Messages : 5081
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Segment de longueur nulle

Message par parisse » mar. janv. 08, 2013 1:22 pm

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.

albenic
Messages : 40
Inscription : mer. oct. 08, 2008 7:19 pm

Re: Segment de longueur nulle

Message par albenic » mar. janv. 08, 2013 4:55 pm

Merci pour l'évolution, ces éclaircissements et plus généralement le travail sur ce beau logiciel.

albenic
Messages : 40
Inscription : mer. oct. 08, 2008 7:19 pm

Re: Segment de longueur nulle

Message par albenic » mar. janv. 08, 2013 5:37 pm

Je viens de télécharger la nouvelle version (sous ubuntu) et j'ai fait le test. C'est pleinemet fonctionnel.

Bravo et merci.

alb
Messages : 1229
Inscription : ven. août 28, 2009 3:34 pm

Re: Segment de longueur nulle

Message par alb » jeu. janv. 10, 2013 10:14 pm

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

parisse
Messages : 5081
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Segment de longueur nulle

Message par parisse » ven. janv. 11, 2013 7:19 am

oups, j'ai fait trop vite la correction la derniere fois, je suis en train de recorriger.

alb
Messages : 1229
Inscription : ven. août 28, 2009 3:34 pm

Re: Segment de longueur nulle

Message par alb » sam. janv. 12, 2013 2:24 pm

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] ?

Répondre