View  Edit  Attributes  History  Attach  Print  Search

ACCUEIL | ARDUINO > S'INSTALLER > DEBUTER > APPROFONDIR | PROCESSING | MECATRONIQUE | MATERIEL | OUTILS | TESTS | Plus...|
Python > Shell > ATELIERS Python + Qt > PyQt apps > PyQt+Arduino | Mes Robots | RepRap | Mes lib'Arduino | Mes shields Arduino | Mes distros | Les Mini-PC |
ATELIERS ARDUINO| VIDEOS | COMPRENDRE | REFERENCES | CODER | TECHNIQUE | GNU/LINUX | LIENS | Rien à voir |

Outils > Processing

Processing : Math : Fonction calculant la valeur des angles d'un triangle quelconque dont on connaît les 3 côtés.

Explication

  • Ce programme se base sur le théorème de Al-Kashi ou théorème de Pythagore généralisé qui permet de calculer les angles d'un triangle quelconque connaissant la longueur des 3 côtés.
  • Une telle fonction sera utile notamment pour la calcul automatique des angles d'un bras robotisé pour préhension d'une balle dont la position sera calculée par reconnaissance visuelle à l'aide d'une webcam.

Ressources utiles

Résultat du test de la fonction

Voici le résultat obtenu par la fonction, en comparaison avec les valeurs calculées par le logiciel libre de géométrie Geogebra :

Le résultat est donc correct.

Le programme


// Programme processing
// généré avec le générateur de code Processing
// www.mon-club-elec.fr
// par X. HINAULT - Juillet 2011 - tous droits réservés

/////////////// Description du programme ////////////
// Utilise la souris
// Utilise le clavier

/*
Test calcul angle d'un triangle quelconque dont on connait les 3 cotes (application du théorème de Al-Kashi)
Voir : http://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_d%27Al-Kashi
*/


// XXXXXXXXXXXXXXXXXXXXXX ENTETE DECLARATIVE XXXXXXXXXXXXXXXXXXXXXX

// inclusion des librairies utilisées

// déclaration objets

// déclaration variables globales
int xmin, xmax, ymin, ymax; // coordonnées de la zone à tester


//------ déclaration des variables de couleur utiles ----
int jaune=color(255,255,0);
int vert=color(0,255,0);
int rouge=color(255,0,0);
int bleu=color(0,0,255);
int noir=color(0,0,0);
int blanc=color(255,255,255);
int bleuclair=color(0,255,255);
int violet=color(255,0,255);


// XXXXXXXXXXXXXXXXXXXXXX  Fonction SETUP XXXXXXXXXXXXXXXXXXXXXX

void setup(){ // fonction d'initialisation exécutée 1 fois au démarrage

        // ---- initialisation paramètres graphiques utilisés
        colorMode(RGB, 255,255,255); // fixe format couleur R G B pour fill, stroke, etc...
        fill(0,0,255); // couleur remplissage RGB - noFill() si pas de remplissage
        stroke (0,0,0); // couleur pourtour RGB - noStroke() si pas de pourtour
        rectMode(CORNER); // origine rectangle : CORNER = coin sup gauche | CENTER : centre
        imageMode(CORNER); // origine image : CORNER = coin sup gauche | CENTER : centre
        ellipseMode(CENTER); // origine cercles / ellipses : CENTER : centre (autres : RADIUS, CORNERS, CORNER
        //strokeWeight(0); // largeur pourtour
        frameRate(15);// Images par seconde

        // --- initialisation fenêtre de base ---
        size(600, 600); // ouvre une fenêtre xpixels  x ypixels
        background(0,0,0); // couleur fond fenetre

// --- initialisation des objets et fonctionnalités utilisées ---


} // fin fonction Setup

// XXXXXXXXXXXXXXXXXXXXXX Fonction Draw XXXXXXXXXXXXXXXXXXXX

void  draw() { // fonction exécutée en boucle


//---- test de calcul ----

/* exemple 1
float r1=5; // longueur 1er coté
float r2=3; // longueur 2ème coté
float r3=7.38815; // longueur 3ème côté
//*/


/* exemple 2
float r1=5; // longueur 1er coté
float r2=3; // longueur 2ème coté
float r3=5.58127; // longueur 3ème côté
//*/


//* exemple 3
float r1=5; // longueur 1er coté
float r2=3; // longueur 2ème coté
float r3=2.42893; // longueur 3ème côté
//*/

float monAngle=0.0;

//float calculAngleRadAlKashi( float adj1, float adj2, float opp)

monAngle=calculAngleRadAlKashi(r1,r2,r3);

monAngle=degrees(monAngle); // conversion en degrés

println("Angle="+monAngle);

monAngle=calculAngleRadAlKashi(r1,r3,r2);

monAngle=degrees(monAngle); // conversion en degrés

println("Angle="+monAngle);

monAngle=calculAngleRadAlKashi(r2,r3,r1);

monAngle=degrees(monAngle); // conversion en degrés

println("Angle="+monAngle);
/*
        // Test si le curseur est dans une zone donnée
        xmin=0; xmax=10; ymin=0; ymax=10; // coordonnées de la zone à tester

        if (mouseX > xmin && mouseX < xmax &&
            mouseY > ymin && mouseY < ymax) {

        // ici instructions à exécuter si souris dans la zone

          }
        else {

        // ici instructions à exécuter si souris pas dans la zone

        }

        // Test si un bouton de la souris est appuyé - à distinguer de la fonction mousePressed
        if (mousePressed == true) {
        } else {
}
*/




        while(true); // stoppe boucle draw

} // fin de la fonction draw()

// XXXXXXXXXXXXXXXXXXXXXX Autres Fonctions XXXXXXXXXXXXXXXXXXXXXX

//------------ fonction théorème de Al-Kashi ---------------------

/*

Cette fonction renvoie la valeur d'un angle d'un triangle quelconque connaissant
la longueur des 3 côtés du triangle, à savoir des 2 cotés adjacents et du coté opposé à cet angle.

Cette fonction applique le theoreme de Al-Kashi (ou théorème de Pythagore élargi)
Voir notamment : http://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_d%27Al-Kashi

Formule du theoreme de Al-Kashi :

                  (adj1² + adj2² - opp²)
angle =  acos   ( ------------------------- )
                  (2 x adj1 x adj2)

*/


float calculAngleRadAlKashi( float adj1, float adj2, float opp) {
// avec :
// adj1 et adj2 la longueur des 2 cotés adjacents à l'angle à calculer
//opp la longueur du coté opposé à l'angle à calculer

 //----------- variables utilisées par la fonction
 float D; // variable calcul dénominateur
 float N;  // variable calcul numérateur
 float calculAngleRad; // variable angle à calculer

 //----------- calcul du dénominateur : (adj1² + adj2² - opp²) ---------

 D=pow(adj1,2) + pow (adj2,2) - pow(opp,2);


 //----------- calcul du numérateur :  (2 x adj1 x adj2) ---------------

 N=2*adj1*adj2;

 //-------------- calcul final de l'angle ----------------------------

 calculAngleRad=acos(D/N); // calcule l'angle en radians

 //----- renvoi de la valeur calculée ----
 return (calculAngleRad);

}


//---------------------- fin fonction théorème Al-Kashi ------------------

/*
// Fonctions de gestion des évènements de la souris

void mousePressed() { // fonction appelée si bouton souris appuyé

        if (mouseButton == LEFT) { // test si appui bouton gauche
                println("Clic gauche !");
        }

        if (mouseButton == RIGHT) { // test si appui bouton droit
                println("Clic droit !");
        }

}

void mouseDragged() { // fonction appelée si appui sur un bouton et souris se déplace

}

void mouseReleased() { // fonction appelée si bouton souris relaché

}

void mouseClicked() { // fonction appelée si bouton souris enfoncé puis relâché

}

void mouseMoved() { //fonction appelée si la souris se déplace sans être appuyée

}

//------------ gestion évènement clavier ---------

void keyPressed() { // si une touche est appuyée

        if(key=='a') { // si touche a enfoncee

        }

        if (key == CODED) { // si appui d'une touche particulière (les touches spéciales up, down, etc.. cf Keycode)
                if (keyCode == UP) { // si touche Haut appuyée
                } else if (keyCode == DOWN) {// si touche BAS appuyée
                }

        } //--- fin si appui touche spéciale --

} //--- fin si touche enfoncee

*/


//XXXXXXXXXXXXXXXXXX Fin du programme XXXXXXXXXXXXXXXXX