Misez P'tit, Optimisez - N°33 (angles & côtés d'un triangle)

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5259
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par bernouilli92 »

Voici ma solution pour hp48gx et suivantes
Elle fonctionne quel que soit le mode angulaire.
Les coordonnées des points sont à entrer sous forme de 3 nombres complexes.

Code : Tout sélectionner

<< -1 ACOS 
  -> a <<
    3 DUPN 3 ->LIST 
    4 ROLLD ROT 3 ->LIST 
    - ABS LASTARG LIST-> DROP ROT 3 ->LIST
    ARG DUP LIST-> DROP ROT 3 ->LIST
    - a MOD
    IF DUP LIST-> DROP + + a 1.1 * > THEN
      a DUP DUP 3 ->LIST SWAP - 
    END
  >>
>>
EDIT : le code ci-dessous ne fonctionne pas sur 48s, seulement à partir de la 48g
Modifié en dernier par bernouilli92 le 17 janv. 2013 11:39, modifié 1 fois.
HP, Casio, Sharp, Psion, quelques TI et divers autres
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6186
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par Marge »

Bien joué, Bernouilli92 !

Ah, ça commence à remuer, là ! :D
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par C.Ret »

Pour répondre à Doum-Doum.
doum-doum a écrit :Petite question connait on les coordonnées complexes des sommets des secteurs angulaires du triangle ?
Oui, c'est justement parce que le repère est orthonormé qu'il est possible de représenter les positions des sommets du triangle indifféremment par leur coordonnées cartésiennes, coordonnées complexes a+i.b ou coordonnées polaires (r , w°).

Si le repère n'est pas orthonormé, alors il y aura une transformation à faire entre les coordonnées cartésiennes dans le repère (quelconque) et la valeur complexe du même point.

Comme le repère est orthonormé, l'utilisation des affixes complexes est astucieuse et directe. C'est à dire que le point de coordonnées x=a, y=b aura comme affixe complexe justement a+i.b

Mais chose bien plus importante, c'est que la norme complexe correspond à la distance euclidienne et il existe une relation entre coordonnée, distance et angle lié à l'existence du cercle d'Euler (celui de ma figure).

Ce qui fait que l'on peut utiliser les fonctions ABS et ARG sur les nombres complexes cela correspondra aux distances et aux angles dans le plan euclidien.
babaorhum a écrit :

Code : Tout sélectionner

10 INPUT "Point A - Entrer XA,YA :";XA,YA     100 PRINT "**RESULTATS**"
20 INPUT "Point B - Entrer XB,YB :";XB,YB     110 PRINT "LONGUEUR AB :";AB
30 INPUT "Point C - Entrer XC,YC :";XC,YC     120 PRINT "LONGUEUR BC :";BC
40 AB = sqr((XB-XA)^2+(YB-YA)^2)              130 PRINT "LONGUEUR AC :";AC
50 BC = sqr((XC-XB)^2+(YC-YB)^2)              140 PRINT "ANGLE BAC:";AA
60 AC = sqr((XC-XA)^2+(YC-YA)^2)              150 PRINT "ANGLE ABC:";BB
70 cc = ACS((BC^2+AC^2-AB^2)/(2*BC*AC))       160 PRINT "ANGLE BCA:";CC
80 AA = ACS((AC^2+AB^2-BC^2)/(2*AC*AB))       160 PRINT "ANGLE BCA:";CC
90 BB = 180-AA-CC                             200 END
Bien joué. Pour une première version c'est déjà un bon programme.
Et difficile de beaucoup l'optimiser, surtout pour les BASIC de pockets qui n'ont pas d'appel de sous programme avec passage d'arguments.
bernouilli92 a écrit :Voici ma solution pour hp48sx et suivantes
Elle fonctionne quel que soit le mode angulaire.
Les coordonnées des points sont à entrer sous forme de 3 nombres complexes.
J'ai le même principe.
Mon code nécessite de saisir les coordonnées des trois sommets sous forme complexe.
Il fonctionne aussi quelque soit le mode trigonométrique. Bien évidemment, les résultats sont affichés dans cette unité angulaire.

Pour économiser les pas de programme et ne pas avoir à jongler avec les n ROLL et n ROLLD, j’utilise deux astuces :
- Les trois niveaux de la pile contiennent les affixes complexes des trois sommets,
- La fonction ROT est utilisée entre chaque calcul de distance et d’angle afin d’évaluer les cas correspondant à chacun des sommets: B C A pour calcul en considérant le sommet A, puis C A B et finalement A B C pour le sommet C.
- Mémorise temporairement les résultats dans la mémoire statistique. Un simple Σ+ permet d’y faire entrer le résultat du calcul et un RCL Σ permet de les afficher.
- Normalise le résultat angulaire à l'aide de COS ACOS (plus court et universel contrairement à 360 MOD, 2PI MOD ou autre…)
- Cette normalisation est utile pour éviter d'avoir des angles négatifs ou au-delà de 180°
- Pour chaque sommet, la longueur du coté opposé et l’angle interne sont calculés à l’aide des fonctions complexes ABS et ARG (qui ici donnent directement distance et angle). Pour éviter de calculer deux fois une des différences, l’instruction de conversion P->R est utilisée car, grace à C->R, elle laisse dans la pile successivement ABS et ARG. Ce qui permet en une seule passe d’avoir la longueur(ABS) et une première partie du calcul de l’angle (ARG).

Code : Tout sélectionner

« CLΣ                 // Efface contenu mémoire Statique ΣDAT
  1 3 START
       ROT  ΣDstAng   // Calcule distance et angle pour A,B et C
  NEXT
  RCLΣ                // Affiche les résultats
»
'LATRI'  STO

Format des résultats :
[[ a AA ]             // longueur de coté opposé et angle au somme A
 [ b BB ]             // longueur de coté opposé et angle au somme B
 [ c CC ]]            // longueur de coté opposé et angle au somme C

«
  3 PICK OVER - R->P C->R               // Calcul distance |b-a| et angle(b-a)°
  4 PICK 4 PICK - ARG                   // Calcul angle (c-a)°
  SWAP - COS ACOS                       // Calcul angle interne au sommet a et normalise
  2 ->ARRY Σ+                           // mémorise Distance et Angle dans mémoire stat.
»
'ΣDstAng' STO
Pour le triangle suivant,
crettraingle.png
crettraingle.png (13.23 Kio) Vu 3064 fois
J’obtiens en mode DEG :

Code : Tout sélectionner

┌───────────────────────┐
│2:                     │
│1:                     │
│4 FIX DEGREE_          │
│LATRI:   :   :   :  :  │
└───────────────────────┘
[ENTER] Choisir le mode trigonométrique.
┌───────────────────────┐
│2:      (9.0000,5.0000)│
│1:      (5.0000,7.0000)│
│(2,4_                  │
│LATRI:   :   :   :  :  │
└───────────────────────┘
 Saisir les coordonnées (x,y) des trois sommets
┌───────────────────────┐
│2:      (9.0000,5.0000)│
│1:      (5.0000,7.0000)│
│(2,4_                  │
│LATRI:   :   :   :   : │
└───────────────────────┘
 Exécuter LATRI
┌───────────────────────┐
│1: [[ 4.4721 34.6952 ] │
│    [ 4.2426 108.4349 ]│
│    [ 7.0711 36.8699 ]]│
│ΣDAT:LATRI:  :  :   :  │
└───────────────────────┘
 Lire les résultats
 colonne de gauche longueur des cotés
 colonne de droite angle (ici en DEGREE)
Evidemment, l'ordre des résultats dans la matrice résultat dépend de l'ordre des coordonnées des sommets initiaux.
A noter que les résultats sont indépendants de la position de l'origine du repère.
Modifié en dernier par C.Ret le 17 oct. 2023 21:23, modifié 3 fois.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
bkg2018
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 359
Enregistré le : 30 mai 2012 16:57

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par bkg2018 »

J'avoue que ce genre de problème ne m'attire plus.

Ce qui m'intrigue c'est pourquoi avoir restreint le problème à la 2D ...

Sinon la solution RPL est incrompréhensible mais a l'air astucieuse.
HP : 67 25 34C 15C 41CX 48S* 48SX 48GX 35S* WP34S* 39gII*
TI : SR52 57 58C* 59 Programmer 66 74S 65
Sharp : PC 1245 1251* 1262 G-850S G-850V
Canon : X-07* F-800P*
Casio : CG-8 SF5300E*
*: persos d'époque
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6186
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par Marge »

C.Ret a écrit :Pour répondre à Doum-Doum.
doum-doum a écrit :Petite question connait on les coordonnées complexes des sommets des secteurs angulaires du triangle ?
Oui, c'est justement parce que le repère est orthonormé qu'il est possible de représenter les positions des sommets du triangle indifféremment par leur coordonnées cartésiennes, coordonnées complexes a+i.b ou coordonnées polaires (r , w°).

Si le repère n'est pas orthonormé, alors il y aura une transformation à faire entre les coordonnées cartésiennes dans le repère (quelconque) et la valeur complexe du même point.

Comme le repère est orthonormé, l'utilisation des affixes complexe est astucieuse et directe. C'est à dire que le point de coordonnées x=a, y=b auront comme affixe complexe justement a+i.b

Mais chose bien plus importante, c'est que la norme complexe correspond à la distance euclidienne et il existe une relation entre coordonnée, distance et angle lié à l'existence du cercle d'Euler (celui de ma figure).

Ce qui fait que l'on peut utiliser les fonctions BAS et ARG sur les nombres complexes cela correspondra aux distances et aux angles dans le plan euclidien.
babaorhum a écrit :

Code : Tout sélectionner

10 INPUT "Point A - Entrer XA,YA :";XA,YA
20 INPUT "Point B - Entrer XB,YB :";XB,YB
30 INPUT "Point C - Entrer XC,YC :";XC,YC
40 AB = sqr((XB-XA)^2+(YB-YA)^2)
50 BC = sqr((XC-XB)^2+(YC-YB)^2)
60 AC = sqr((XC-XA)^2+(YC-YA)^2)
70 cc = ACS((BC^2+AC^2-AB^2)/(2*BC*AC))
80 AA = ACS((AC^2+AB^2-BC^2)/(2*AC*AB))
90 BB = 180-AA-CC
100 PRINT "**RESULTATS**"
110 PRINT "LONGUEUR AB :";AB
120 PRINT "LONGUEUR BC :";BC
130 PRINT "LONGUEUR AC :";AC
140 PRINT "ANGLE BAC:";AA
150 PRINT "ANGLE ABC:";BB
160 PRINT "ANGLE BCA:";CC
200 END
Bien joué. Pour une première version c'est déjà un bon programme.
Et difficile de beaucoup l'optimiser, surtout pour les BASIC de pockets qui n'ont pas d'appel de sous programme avec passage d'arguments.
bernouilli92 a écrit : Voici ma solution pour hp48sx et suivantes
Elle fonctionne quel que soit le mode angulaire.
Les coordonnées des points sont à entrer sous forme de 3 nombres complexes.
J'ai le même principe.
Mon code nécessite de saisir les coordonnées des trois sommets sous forme complexe.
IL fonctionne aussi quelque soit le mode trigonométrique. Bien évidemment, les résultats sont affichés dans cette unité angulaire.

Pour économiser les pas de programme et ne pas avoir à jongler avec les n ROLL et n ROLLD, j’utilise deux astuces :
- Les trois niveaux de la pile contiennent les affixes complexes des trois sommets,
- La fonction ROT est utilisée entre chaque calcul de distance et d’angle afin d’évaluer les cas correspondant à chacun des sommets. B C A pour calcul en considérant le sommet A, puis C A B et finalement A B C pour le sommet C.
- Mémorise temporairement les résultats dans la mémoire statistique. Un simple Σ+ permet d’y faire entrer le résultat du calcul et un RCL Σ permet de les afficher.
- Normalise le résulta angulaire à l'aide de COS ACOS (plus court et universel contrairement à 360 MOD, 2PI MOD ou autre...)
- Cette normalisation est utile pour éviter d'avoir des angles négatifs ou au-delà de 180°
- Pour chaque sommet, la longueur de coté opposé et l’angle interne sont calculé à l’aide des fonctions complexes ABS et ARG (qui ici donnent directement distance et angle). Pour éviter de calculer deux fois une des différences, l’instruction de conversion P->R est utilisée car , grace à C->R) elle laisse dans la pile successivement ABS et ARG. Ce qui permet en une seule passe d’avoir la longueur(ABS) et une première partie du caclcul de l’angle (ARG).

Code : Tout sélectionner

« CLΣ                 // Efface contenu mémoire Statique ΣDAT
  1 3 START
       ROT  ΣDstAng   // Calcule distance et angle pour A,B et C
  NEXT
  RCLΣ                // Affiche les résultats
»
'LATRI'  STO


Format des résultats :
[[ a AA ]             // longeur de coté opposé et angle au somme A
 [ b BB ]             // longeur de coté opposé et angle au somme B
 [ c CC ]]            // longeur de coté opposé et angle au somme C


«
  3 PICK OVER - R->P C->R               // Calcul distance |b-a| et angle(b-a)°
  4 PICK 4 PICK - ARG                   // Calcul angle (c-a)°
  SWAP - COS ACOS                       // Calcul angle interne au sommet a et normalise
  2 ->ARRY Σ+                           // mémorise Distance et Angle dans mémoire stat.
»
'ΣDstAng' STO

Pour le triangle suivant,
Image
J’obtiens en mode DEG :

Code : Tout sélectionner

┌───────────────────────┐
│2:                     │
│1:                     │
│4 FIX DEGREE_          │
│LATRI:   :   :   :  :  │
└───────────────────────┘
[ENTER] Choisir le mode trigonométrique.
┌───────────────────────┐
│2:      (9.0000,5.0000)│
│1:      (5.0000,7.0000)│
│(2,4_                  │
│LATRI:   :   :   :  :  │
└───────────────────────┘
 Saisir les coordonnées (x,y) des trois sommet
┌───────────────────────┐
│2:      (9.0000,5.0000)│
│1:      (5.0000,7.0000)│
│(2,4_                  │
│LATRI:   :   :   :   : │
└───────────────────────┘
 Executer LATRI
┌───────────────────────┐
│1: [[ 4.4721 34.6952 ] │
│    [ 4.2426 108.4349 ]│
│    [ 7.0711 36.8699 ]]│
│ΣDAT:LATRI:  :  :   :  │
└───────────────────────┘
 Lire les résultats
 colonne de gauche longueur des cotés
 colonne de droite angle (ici en DEGREE)



Evidemment, l'ordre des résultats dans la matrice résultat dépend de l'ordre des coordonnées des sommets initiaux.
A noter que les résultats sont indépendants de la position de l'origine du repère.
Merci C.Ret pour ces explications. Je n'avais pas du tout pensé à cette solution astucieuse qui prouve qu'un problème apparemment simple et rabâché peut encore surprendre et plaire.

Il serait judicieux d'indiquer pour chaque programme le nombre d'octets utilisés !
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5259
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par bernouilli92 »

Voici une version un peu optimisée de ma solution (48gx), je n'aimais pas trop la bidouille de la fin qui consiste à vérifier que la somme des angles vaut 180°, par contre le problème que j'ai avec cette version c'est qu'elle ne donne pas le bon résulat pour un triangle plat.

Code : Tout sélectionner

« -1 ACOS -> a                            ; on stocke la valeur d'un angle plat (180 ou pi ou 400 en fonction du mode angulaire)
  « OVER - ROT ROT -                      ; on soustrait un point aux deux autres, cela revient à changer l'origine et on a donc 2 points A' et B' (en plus de l'origine O')
    IF DUP2 ARG SWAP ARG - a 2 * MOD a >  ; petit test: on inverse les deux points si nécessaire pour que les 
    THEN SWAP                             ; vecteurs O'A' et O'B' soient dans le sens trigonométrique
    END
    DUP2 - 3 ->LIST                       ; on crée le 3ème vecteur A'B', on met les 3 vecteurs dans une liste
    ABS LASTARG ARG LIST-> DROP ROT       ; on calcule la longeur de chacun des vecteurs et on récupère la liste pour utiliser les angles 
    3 ->LIST DUP 1 GET + DeltaLIST        ; on calcule le delta entre les angles pris deux à deux (on ajoute à la liste des 3 angles le premier angle avant d'appeler DeltaLIST)
	a MOD                                  ; Avec un petit modulo l'angle plat pour être dans les clous  
  »
»

@C.Ret : Comme d'habitude une solution tout en beauté, chapeau !
Modifié en dernier par bernouilli92 le 22 janv. 2013 11:09, modifié 3 fois.
HP, Casio, Sharp, Psion, quelques TI et divers autres
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par C.Ret »

Pour ma solution, compter 54 octets de programme et l'utilisation du 'registre' statistique qui avec 6 éléments doit bien faire à lui seul dans les 42 octets. Nous arrivons donc à un coût minimum de 138 octets mobilisés à l'utilisation afin de mémoriser les coordonnées des trois sommets.

Tout cela pour démontré, s'il en est besoin, que mon code est certainement très optimisable et M'POisable.
Modifié en dernier par C.Ret le 17 janv. 2013 17:04, modifié 2 fois.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5259
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par bernouilli92 »

Pour ma solution, il faut compter 133.5 octets pour le programme + utilisation de la pile. Les résultats prennent 36.5 octets x 2 soit 73 octets.
HP, Casio, Sharp, Psion, quelques TI et divers autres
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par C.Ret »

J'ai vaguement cherché à optimiser la version BASIC qui présente pas mal de 'répétitions'

Je suis arrivé à un truc du style :

Code : Tout sélectionner

10 DEGREE
15 DIM X(3),Y(3)
20 DEF FN D(I,J)=SQR( (X(I)-X(J))^2 - (Y(I)-Y(J))^2 )
25 DEF FN A(I,J,K)=ACS((FN D(I,K)^2+FN D(J,K)^2-FN D(I,J)^2)/2/FN D(J,K)/FN D(I,K))
31 INPUT "ENTER A (x,y)=";X(1),Y(1)
32 INPUT "ENTER B (x,y)=";X(2),Y(2)
33 INPUT "ENTER C (x,y)=";X(3),Y(3)
41 PRINT "a=";FN D(1,2);" ^A=";Fn A(2,3,1);"°"
42 PRINT "b=";FN D(2,3);" ^B=";Fn A(1,3,2);"°"
43 PRINT "c=";FN D(3,1);" ^C=";Fn A(1,2,3);"°"
50 END
Mais je ne sais pas s'il existe un pocket capable d'exécuter cette version trop ANSI BASIC (et donc plus adpaté à un BASIC Apple, Microsoft ou Commodore !).

En tout cas voilà ce que donne cette version du programme sur un SHARP PC-1211 :

Code : Tout sélectionner

1 FOR X=1 TO 3:INPUT "ENTER (X,Y)=";A(X),A(3+X):NEXT X                               REM Saisie des coordonnées
2 FOR X=1 TO 3:GOSUB 9:A(6+X)=√(ABS (A(X)-A(Y))^2+ABS (A(3+X)-A(3+Y))^2:NEXT X       REM Calcul des distance
3 FOR X=1 TO 3:GOSUB 9:Y=6+Y,A(9+X)=ACS ((A(Y)^2+A(Z)^2-A(6+X)^2)/2A(Y)A(Z):NEXT X   REM Calcul des angles
4 FOR X=7 TO 9:PRINT A(X),A(3+X):NEXT X:END                                          REM Affichage 
9 Y=1+X*(X<3,Z=7+Y*(Y<3:RETURN


A:A(1) = xa    D:A(4) = ya     G:A(7) = a     J:A(10) = ^A°      X:A(24) = x_i  /  y_ i  / i
B:A(2) = xb    E:A(5) = yb     H:A(8) = b     K:A(11) = ^B°      Y:A(25) = x_i  / y_ j   /  j
C:A(3) = xc    F:A(6) = yc     I:A(9) = c     L:A(12) = ^C°      Z:A(26) =                     / k
C'est tout de suite moins lisible. Et il faut avoir la liste des variables et leru affectation pour avoir une chance de s'y retrouver.
Et si même l'auteur de ce code a du mal, je n'ose pas imaginer ce que cela doit donner pour un auditeur lecteur de ce forum !
:x
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6186
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par Marge »

Ma réponse probablement optimisable en RPN pour HP-29c :

Code : Tout sélectionner

GSB 9____ permet un décrément de la mémoire 6 à la mémoire 1 pour l'entrée des données dans le sous-programme 9 (fin de PGM) ; i=6

*LBL 0*
R/S______ entrées de A(x,y), B(x,y), C(x,y)
STO i
DSZ_____ décrémente i et saute si = 0
GTO 0

Ce segment de PGM utilise les valeurs de la pile pour commencer les opérations de soustraction des abscisses et des ordonnées :

STO - 3
Rd
STO - 4
Rd
RCL 5
STO - 1
RCL 6
STO - 2
Rd
-
STO 5
Rd
-
STO 6

On repositionne le compteur i à 6 pour mettre au carré :

GSB 9
*LBL 1*
RCL i
STO * i
DSZ
GTO 1

One more time ! pour sommer et extraire la racine :

GSB 9
*LBL 2*
RCL i
DSZ
RCL i
+
SQR
STO i
DSZ
GTO 2

Commencement d'un salmigondis d'opérations pour la deuxième partie du pb. Numérateurs...

RCL 1
x²
STO 2
CHS
STO 4
STO 6
RCL 3
x²
STO + 4
STO - 2
STO - 6
RCL 5
x²
STO - 2
STO - 4
STO + 6

et dénominateurs :

2
CHS
STO / 2
STO / 4
STO / 6
RCL 1
STO / 4
STO / 6
RCL 3
STO / 2
STO / 6
RCL 5
STO / 2
STO / 4

Rappel des mémoires des cosinus pour transformation en angles

GSB 9
*LBL 3*
RCL i
COS^-1
STO i
DSZ
DSZ
GTO 3
R/S

Sous-programme de mise en mémoire 0 : i=6

*LBL 9*
6
STO 0
RTN
Les côtés et les angles du triangle ABC se trouvent dans les mémoires 1 à 6. Edith ajoute : "DANS LE BAC !"; car en effet, les économies d'octets effectuées sur l'algorithme entraînent cet ordre (R1=b ; R2 = Beta ; R3 =a ; R4=alpha ; R5=c ; R6=gamma)

La pile à 4 niveaux montre ses limites sur l'exercice.
Je crois qu'il y a cependant moyen d'améliorer la deuxième partie à coups de STO * i, etc.

7 mémoires (8 octets chacune il me semble), 79 pas (dont des instructions combinées qui doivent probablement prendre plus d'un octet... au pifomètre, une centaine de pas au total, ce qui nous fait un grand total de 156 octets). Pas mirobolant, mais l'important, c'est de participer ! :D

[EDITH] : "c'est bien, mon garçon, mais ça ne fonctionne pas pour les triangles plats !"
[OUAM] : "oui, oui, ça fera l'objet d'une mise à jour... hum !"
:oops:

Ce qu'il faut savoir :
Après vérification, ça ne fonctionne pas pour tous les triangles plats, mais pour certains, et encore.
A(1,1) B(5,5) C (9,9) renvoie un "Error" (tentative de prendre le cos^-1 de -1, ce qui paraît tout de même orthodoxe... c'est qu'en fait la machine a arrondi à -1,000000001 lors des opérations : si on ne peut plus se fier à HP :!: ) ;
A(3,3) B(5,5) C(7,7) fonctionne à peu près et donne 179,9978562, 0, 0°.

P.S.: on doit aussi pouvoir faire mieux en passant par les transformations de coordonnées cartésiennes en polaires, sur 29 ou 67, par exemple.
Modifié en dernier par Marge le 19 janv. 2013 16:55, modifié 4 fois.
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 454
Enregistré le : 13 janv. 2013 19:44
Localisation : Marseille-est

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par babaorhum »

Merci pour les cours de math et géométrie C.ret ... ca fait loin tout ca ...

J'ai lancé ma 41CX sur "le problème du triangle".

Voilà ce qu'elle m' a sorti :

LBL "TTT"
"Y^ XR/S" ' message saisie des données dans le registre alpha ; on entre chacun des 3 points : Y enter X R/S
PROMPT STO01 x<>Y ' point A
STO02
PROMPT STO03 x<>Y 'point B
STO04
X<>Y XEQ05 STO08 ' on en profite que A et B sont dans la pile pour lancer un XEQ05 et calculer AB
PROMPT STO05 x<>Y 'point C
STO06
x<>Y RCL02 RCL01 ' calcul de AC
XEQ05 STO07 ' calcul de AB par le XEQ05
RCL03 RCL04 RCL05
RCL06 XEQ05 STO09 'caclul de BC par XEQ 05
RCL07 RCL08
XEQ10 STO01 'calcul angle alpha par XEQ 10
RCL07 RCL08 RCL09
XEQ10 STO02 'calcul beta par XEQ 10
RCL08 RCL07 RCL09
XEQ10 STO03 'calcul gamma par XEQ 10
STOP

LBL05 'sous programme calcul norme d'un vecteur X1 Y1 X2 Y2 dans la pile
X<>Y RDN - X^2 RDN
X<>Y - X^2 X<>Y RDN
+ SQRT RTN

LBL10 'Sous programme calcul de acos(A^2+B^2-C^2)/2AB avec A,B,C dans la pile
ENTER^ RDN X<>Y *
LASTX X^2 R^ X^2 +
R^ X^2 - / 1/x 2 /
ACOS RTN END

78 pas 105 octets
+ 09 registres utilisés
résultats mémoires :
01 alpha
02 beta
03 gamma
07 AC
08 AB
09 BC

1/ ca marche
2/ je bute sur l'optimisation de l'utilisation des mémoires avec la pile à 4 niveau
3/ je m'suis bien gratté la tête sur le petit sous programme LBL 10 (j'suis rouillé ...)
4/ en combinant avec le RPN de Marge ... peut être qu'on arrivera à une solution optimisée !

En tournant autour de ce triangle, j'ai une p"tit question pour les connaisseurs que vous êtes :
sur ma 41 j'ai un module MATH1 qui propose des programmes pour les complexes (calcul de norme notamment par la fonction MAGZ) et pour les triangles (notamment la fonction SSS pour le problème présent). Par contre c'est des programmes tout fait et interactifs - on peut utiliser des parties de ces programmes en ROM ou tuer leur interactivité pour utiliser ces routines ?

je ne sais pas si je suis très clair ...
BaBaoRhum
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6186
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par Marge »

Bravo, Babaorum ! Je vois qu'on a eu tous les deux des difficultés sur la formule des cosinus...

Pour répondre à ta question un peu nébuleuse (interactifs ?), si tu demandes si on peut utiliser ces programmes dans d'autres programmes de la RAM (la mémoire que tu peux modifier), la réponse est bien sûr, oui, mais il faut que le module en question soit imbriqué dans la 41. Il est impossible de copier un de ces programmes pour le placer dans la RAM.

Rien ne t'empêche en revanche de lister le programme (*) du module et d'en prendre note pour l'entrer de nouveau ailleurs dans la RAM, à la main par exemple :mrgreen: . Bon courage !

(*) Cela dit, je ne suis pas sûr que cela fonctionne pour toutes les fonctions ROM du module.
Modifié en dernier par Marge le 18 janv. 2013 00:33, modifié 1 fois.
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 454
Enregistré le : 13 janv. 2013 19:44
Localisation : Marseille-est

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par babaorhum »

Merci Marge !

Y'a eu une mise en forme bizarre sur mon post qui rend le pgm pas très lisible ... si ca interesse qq, je le remet sans les commentaires.

Pour l'arccosinus, j'ai traité le calcul par appel du sous programme :

LBL10
ENTER^ RDN X<>Y *
LASTX X^2 R^ X^2 +
R^ X^2 - / 1/x 2 /
ACOS RTN

... qui calcule directement la formule " acos(A^2+B^2-C^2)/2AB " avec A,B,C dans la pile (en position x, y,z).

De ton côté tu as fais ces calculs directement par opérations dans les mémoires, et effectivement, on ne sait pas faire un arccos directement en mémoire ! ;-).
Sinon, je suis impressionné par l'utilisation de l'adressage indirect dans la première partie, que tu manipules à la perfection avec la 29C !

Au bilan, j'ai 2 pas de programme en moins que toi (après vérification le RTN est sur le pas 77) mais j'utilise 2 registres mémoires en plus... je m'incline !
BaBaoRhum
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3637
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par Hobiecat »

babaorhum a écrit :Y'a eu une mise en forme bizarre sur mon post qui rend le pgm pas très lisible ... si ca interesse qq, je le remet sans les commentaires.
Les commentaires peuvent rester : le plus simple est d'utiliser le bouton "Code" dans la fenêtre d'édition des messages et de mettre le programme entre les deux balises, comme pour les "quotes". La police de caractères dans les boites code est à pas fixe, ce qui facilite grandement la lisibilité ! :wink:
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6186
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez P'tit, Optimisez - N°33 (angles & côtés d'un trian

Message par Marge »

Oh, mon programme est assez basique, en fait. Tu rencontreras des gens ici qui font les choses vraiment beaucoup mieux ! Mais un compliment fait toujours plaisir ! merci ! :D

Je vais voir si je peux adapter avec intérêt ton algorithme à ma machine ; je n'ai pas de Roll Up.

Pour la mise en page, tu as la balise

Code : Tout sélectionner

 au-dessus de la fenêtre de texte qui permet de rendre un PGM bien lisible si tu mets les instructions en colonne  :wink:  Je n'ai jamais compris comment aligner les colonnes quand on veut ajouter des commentaires comme le fait C.Ret ou les membres de la pile comme le fait zpalm. Pourtant, C.Ret m'a déjà expliqué il y a longtemps, mais je n'ai jamais réussi à mettre ses conseils en pratique.  :|
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Répondre

Retourner vers « Tous les Pockets »