IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

Comment savoir si un polygone est circonscriptible?


Sujet :

Mathématiques

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 25
    Points : 16
    Points
    16
    Par défaut Comment savoir si un polygone est circonscriptible?
    Bonjour je n'arrive pas à trouver une methode pour savoir si à partir d'un polygone non croisé et convexe, le polygone est circonscriptible c'est à dire que tous ses cotés sont tangents à un même cercle: lorsque le cercle est inscrit dans le polygone.
    Je dois implémenter cette algo en C à partir d'une structure qui prends en arguments la liste des sommets du polygone.
    Merci de me donner des idées...

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    euh...

    Faut pas charrier quand même...

    On va pas faire tous tes exercices à ta place....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Voici une méthode:
    1) Prendre 3 côtés du polygone, définissant trois droites.
    A partir de là, définir l'ensemble des points équidistants de ces trois droites.
    Rappel: Les points équidistants de deux droites forment une paire de droites perpendiculaires si les deux droites sont sécantes, ou bien une seule droite si les deux droites sont parallèles.
    Résultat des courses on trouve:
    4 points si aucune paire de droites parmi les 3 n'est constituée de droites parallèles.
    2 points sinon.
    Partant de là chacun des 4 points (ou des 2 points) est candidat pour être le centre d'un cercle inscrit pour le polygone, il suffit donc de mesurer ses distances aux côtés du polygone AUTRES que les 3 premiers et de comparer les nombres trouvés avec la distance commune aux trois côtés initiaux.
    Suggestion: faire un dessin
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Bonjour
    Voila je fais le projet avec Alexis0788 et j'ai programmé une fonction qui calcule le point d'intersection de deux droites; Je l'ai testé et elle n'est pas super precise dans le resultat obtenue mais elle pourra peut être faire l'affaire, voici le prototype puis le code source (en C)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //determine si les deux côtés s'intersectent et renvoie l'adresse du point d'intersection si c'est le cas sinon renvoie NULL;
    //côtéun=points un et deux; côtédeux=points trois et quatre
    //La fonction n'est pas tres precise
    point *pointintersection(point *un,point *deux,point *trois,point *quatre);
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    point *pointintersection(point *un,point *deux,point *trois,point *quatre)
    {
        point *pinter;//Le point d'intersection
        assert(pinter=(point *)malloc(sizeof(point)));
        assert(pinter->nom=(char *)malloc(sizeof(char)));
        float pente1, pente2, p1, p2;//y=(pente1 * x)+p1  et  y=(pente2 * x)+p2
        //vecteur1 correspond au premier côté défini par les points un et deux
        //vecteur2 correspond au deuxième côté défini par les points trois et quatre
        float vecteur1abscisse=(deux->abscisse)-(un->abscisse);
        float vecteur1ordonnee=(deux->ordonnee)-(un->ordonnee);
        float vecteur2abscisse=(quatre->abscisse)-(trois->abscisse);
        float vecteur2ordonnee=(quatre->ordonnee)-(trois->ordonnee);
        float determinant=(vecteur1abscisse*vecteur2ordonnee)-(vecteur2abscisse*vecteur1ordonnee);
        if(determinant==0) //les deux côtés sont parallèles
        {
            printf("\nPasse dans la 1 condition\n");
     
            pinter=NULL;//il n'y a pas de point d'intersection
        }
        else if(un->abscisse==deux->abscisse) //le côté un est une droite verticale
        {
            pinter->abscisse=un->abscisse;
            pinter->nom="point intersection";
            if(trois->ordonnee==quatre->ordonnee) //le côté deux est une droite horizontale
            {
                printf("\nPasse dans la 2 condition\n");
     
                pinter->ordonnee=trois->ordonnee;
            }
            else //le côté deux est une droite quelconque, donc d'équation y=mx+p
            {
                printf("\nPasse dans la 3 condition\n");
     
                pente2=((quatre->ordonnee)-(trois->ordonnee))/((quatre->abscisse)-(trois->abscisse));//pente du côté deux
                p2=(trois->ordonnee)-((pente2)*(trois->abscisse));//y=(pente2 * x)+p2
                pinter->ordonnee=((pente2)*(pinter->abscisse))+p2;
            }
        }
        else if(un->ordonnee==deux->ordonnee) //le côté un est une droite horizontale
        {
            pinter->ordonnee=un->ordonnee;
            pinter->nom="point intersection";
            if(trois->abscisse==quatre->abscisse) //le côté deux est une droite verticale
            {
                printf("\nPasse dans la 4 condition\n");
     
                pinter->abscisse=trois->abscisse;
            }
            else //le côté deux est une droite quelconque, donc d'équation y=mx+p
            {
                printf("\nPasse dans la 5 condition\n");
     
                pente2=((quatre->ordonnee)-(trois->ordonnee))/((quatre->abscisse)-(trois->abscisse));//pente du côté deux
                p2=(trois->ordonnee)-((pente2)*(trois->abscisse));//y=(pente2 * x)+p2
                pinter->abscisse=((pinter->ordonnee)-(p2))/pente2;
            }
        }
        else if((un->abscisse != deux->abscisse) && (un->ordonnee != deux->ordonnee)) //le côté un est une droite quelconque, donc d'équation y=mx+p
        {
            pinter->nom="point intersection";
            if(trois->abscisse==quatre->abscisse) //le côté deux est une droite verticale
            {
                printf("\nPasse dans la 6 condition\n");
     
                pinter->abscisse=trois->abscisse;
                pente1=((deux->ordonnee)-(un->ordonnee))/((deux->abscisse)-(un->abscisse));//pente du côté un
                p1=(un->ordonnee)-((pente1)*(un->abscisse));//y=(pente1 * x)+p1
                pinter->ordonnee=((pente1)*(pinter->abscisse))+p1;
            }
            else if(trois->ordonnee==quatre->ordonnee) //le côté deux est une droite horizontale
            {
                printf("\nPasse dans la 7 condition\n");
     
                pinter->ordonnee=trois->ordonnee;
                pente1=((deux->ordonnee)-(un->ordonnee))/((deux->abscisse)-(un->abscisse));//pente du côté un
                p1=(un->ordonnee)-((pente1)*(un->abscisse));//y=(pente1 * x)+p1
                pinter->abscisse=((pinter->ordonnee)-(p1))/pente1;
     
                printf("\npente1 vaut: %f\n",pente1);
                printf("\np1 vaut: %f\n",p1);
            }
            else //les deux côtés sont des droites quelconques, donc d'équation y=mx+p
            {
                printf("\nPasse dans la 8 condition\n");
     
                pente1=((deux->ordonnee)-(un->ordonnee))/((deux->abscisse)-(un->abscisse));//pente du côté un
                p1=(un->ordonnee)-((pente1)*(un->abscisse));//y=(pente1 * x)+p1
                pente2=((quatre->ordonnee)-(trois->ordonnee))/((quatre->abscisse)-(trois->abscisse));//pente du côté deux
                p2=(trois->ordonnee)-((pente2)*(trois->abscisse));//y=(pente2 * x)+p2
                pinter->abscisse=(p2-p1)/(pente1-pente2);
                pinter->ordonnee=((pente1)*(pinter->abscisse))+p1;
                pinter->nom="point intersection";
            }
        }
     
        return pinter;
    }

    ...maintenant comment determiner le centre et le rayon du cercle inscrit dans le polygone en rappelant que le polygone est non croisé et convexe .
    Auriez-vous une idée sur l'algorithme à mettre en oeuvre (je ne vous demande en aucun cas le code tout fait mais des explications si vous en avez bien entendu )
    Merci d'avance !!

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Re-bonjour!
    J'ai trouvé une manière d'avoir l'équation de la bissectrice d'un angle à l'aide du produit scalaire sur ce forum:
    http://forums.futura-sciences.com/thread39936.html
    ...mais je ne sais pas comment récuperer les coordonnées du vecteur AM dans le produit scalaire!
    Si vous pouviez m'expliquer...
    Merci.

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par alexis0788 Voir le message
    Merci de me donner des idées...
    centre = intersection concourante des bissectrices (si elle existe)
    rayon = distance du centre à l'un des cotés (cf. distance d'un point a une droite)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    centre = intersection concourante des bissectrices (si elle existe)
    Pourquoi un singulier ?
    Prend le cas du triangle. Il y a pour chaque angle 2 bissectrices (intérieure et extérieure).
    Les trois bissectrices intérieures sont concourantes certes, mais chaque bissectrice intérieure est également concourante avec les deux autres bissectrices extérieures donnant trois centres de cercles dits 'ex-inscrits'. Il y a donc 4 cercles tangents aux 3 côtés d'un triangle.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Zavonen Voir le message
    Il y a donc 4 cercles tangents aux 3 côtés d'un triangle.
    Certe, certe... c'est tout à fait exact.

    Je me demande juste si le PO voulait aussi les cercles exinscrits.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Bonjour!
    Seul le centre et le rayon du cercle inscrit sont cherchés pour notre projet...

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par 20051438 Voir le message
    Bonjour!
    Seul le centre et le rayon du cercle inscrit sont cherchés pour notre projet...
    Dans ce cas, la méthode du post #6 devrait suffire.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  11. #11
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Bonjour juste pour vous dire que j'ai résolu mon problème.
    J'ai réalisé l'algo pour un cercle inscrit et circonscrit.
    Il faut prendre deux bissectrices(cercle inscrit) ou médiatrices(cercle circonscrit) du polygone voir leur point d'intersection, le stocker puis faire une boucle sur le polygone pour tester si ce point appartient aux autres bissectrices(/médiatrices).

  12. #12
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Citation Envoyé par alexis0788 Voir le message
    Bonjour juste pour vous dire que j'ai résolu mon problème.
    J'ai réalisé l'algo pour un cercle inscrit et circonscrit.
    Il faut prendre deux bissectrices(cercle inscrit)
    Peux tu m'expliquer comment tu distingues les bissectrices intérieures des bissectrices extérieures (en toute généralité)?
    PS: Je connais une réponse c'est juste pour voir comment tu t'y prends.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Bonjour!
    Les bissectrices sont vues dans notre algorithme comme des droites, donc deux bissectrices différentes auront un seul point d'intersection, ensuite on compare ce point d'intersection avec celui des autres bissectrices pour voir si il est identique;
    En fait on ne se preoccupe pas des bissectrices exterieures...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment savoir si une variable est initialisée ?
    Par nabix dans le forum Général Python
    Réponses: 8
    Dernier message: 10/03/2005, 15h12
  2. Comment savoir si un Shell est terminé ?
    Par Mr Capone dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 21/02/2005, 17h05
  3. [Access] Comment savoir qu'un champs est vide ?
    Par Oberown dans le forum ASP
    Réponses: 9
    Dernier message: 25/10/2004, 10h47
  4. Unix - Comment savoir si un fichier est ouvert
    Par freddyboy dans le forum C
    Réponses: 7
    Dernier message: 06/10/2004, 15h53
  5. Comment savoir qu'une fonction est standard ?
    Par D[r]eadLock dans le forum C
    Réponses: 5
    Dernier message: 24/03/2003, 14h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo