J'ai modifié le programme en ajoutant quelques evalf et en essayant de tenir compte des cas où les coordonnées sont irrationnelles.
Code : Tout sélectionner
Angle_degre(A,B,C):={
local a,b,c,val,lm;
lm:=min(longueur(A,B),longueur(A,C))/10;
a:=evalf(A);
b:=evalf(A+(B-A)*lm/longueur(A,B));
c:=evalf(A+(C-A)*lm/longueur(A,C));
si simplifier(angle(A,B,C)-pi/2)==0 alors
return carre(a,b),legende(affixe(similitude(a,sqrt(2),pi/4,b)),"90°");
fsi;
si simplifier(angle(A,B,C)+pi/2)==0 alors
return carre(a,c),legende(affixe(similitude(a,sqrt(2),pi/4,c)),"-90°");
fsi;
val:=round(angle(A,B,C)*180/pi,1);//valeur en degré à 0.1 près
return angle(A,B,C,val+"°");
}
:;
Triangle(A,B,C):={
local L,a,b,c,T,Titre,S,S2;
T:=type(abscisse(A)),type(ordonnee(A)),type(abscisse(B)),type(ordonnee(B)),type(abscisse(C)),type(ordonnee(C));
si member(DOM_SYMBOLIC,[T]) alors
//pour des coordonnees irrationnelles du type p+q*sqrt(k)
Titre:=titre="les angles et le carré des longueurs des côtés";
a:=simplifier(longueur2(B,C));
b:=simplifier(longueur2(A,C));
c:=simplifier(longueur2(A,B));
S2:=simplifier((1/4)*b*c*(sin(abs(angle(A,B,C))))^2);
si size(cat(S2))>49 alors //modifier 49 ? pour éviter affichage long ou rootof
L:=L,legende(point(evalf((1/3)*(A+B+C))),"S="+round(sqrt(S2),1));
sinon
L:=L,legende(point(evalf((1/3)*(A+B+C))),"S^2="+S2);
fsi;
sinon
//pour des coordonnees rationnelles
Titre:=titre="les angles et les longueurs des côtés";
a:=simplifier(longueur(B,C));
b:=simplifier(longueur(A,C));
c:=simplifier(longueur(A,B));
S:=simplifier((1/2)*b*c*sin(abs(angle(A,B,C))));
L:=L,legende(point(evalf((1/3)*(A+B+C))),"S="+S);
fsi;
L:=L,triangle(A,B,C),
Angle_degre(A,B,C),Angle_degre(B,C,A),Angle_degre(C,A,B),
legende(milieu(A,B),cat(c)),
legende(milieu(B,C),cat(a)),
legende(milieu(C,A),cat(b));
return Titre,L;
}
:;
J'ai rencontré une première difficulté pour éviter l'affichage de rootof dans le cas de racine de racine: je n'ai rien trouvé de mieux que le test sur size(cat(S2)) pour renvoyer une valeur approchée de S2. D'où ma première question: comment tester si un résultat est un rootof ?
Ensuite j'ai tenté 3 exemples:
1)A:=point(-2*sqrt(2)+3,-1);B:=point(4,-4*sqrt(2));C:=point(-5+2*sqrt(2),-5*sqrt(2));
Triangle(A,B,C);
2)A:=point(9,5);B:=point(2,-2);C:=point(-6,6);
Triangle(A,B,C);
3)A:=point(-5,-1);B:=point(7*sqrt(2),-2);C:=point(-6,8*sqrt(3));
Triangle(A,B,C);
Ma deuxième question concerne ce troisième exemple, je modifie l'ordonnée de B pour la rendre positive, par exemple ceci:
A:=point(-5,-1);B:=point(7*sqrt(2),2);C:=point(-6,8*sqrt(3));
Triangle(A,B,C);
et là j'obtiens un crash qui pour simplifier est obtenu avec:
A:=point(-5,-1);B:=point(7*sqrt(2),2);C:=point(-6,8*sqrt(3));
a:=simplifier(longueur2(B,C));
b:=simplifier(longueur2(A,C));
c:=simplifier(longueur2(A,B));
simplifier((1/4)*b*c*(sin(abs(angle(A,B,C))))^2)