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

Algorithmes et structures de données Discussion :

Enveloppe intérieure


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 28
    Points : 25
    Points
    25
    Par défaut Enveloppe intérieure
    Bonsoir,
    je suis à la recherche de pistes et d'idées pour répondre au problème que l'on me soumet et que je dois traiter dans un programme C++ :

    J'ai un ensemble de droite (entre 100 et 150) définies par leurs équations.
    Elles sont tracées en bleu sur le graphe ci-dessous.
    Il faut que j'arrive à trouver l'ensemble des points qui définissent "l'enveloppe intérieure" (je ne sais pas si c'est le terme approprié) de ces droites.
    Elle est tracée en rouge.

    Nom : traces.PNG
Affichages : 128
Taille : 37,4 Ko

    J'ai cherché du coté des enveloppes convexes, j'ai trouvé un code en c++ qui fonctionne mais c'est pour une enveloppe extérieure...
    Je n'ai pas forcément les bons mots clés pour la recherche ?

    Merci d'avance pour votre aide.

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Je traiterai cela comme si c'était une image :
    - 1 - je trace toutes les droites
    - 2 - je pars du centre

    Méthode 1 :
    - 3 - je vais dans une direction (n'importe laquelle) jusqu'à rencontrer une droite (pixel coloré car image)
    - 4 - j'effectue un simple parcours dans le sens que je souhaite jusqu'à revenir au pixel de départ.

    Méthode 2 :
    - 3 - je lâche un germe (comme pour la numérotation des composantes connexes) qui se propage et qui est limité par la présence des droites.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #3
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    Bonsoir,
    Je pense que ça peut se faire de façon 'Exacte' assez rapidement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    nbre_droites est le nombre de droites ( 100 à 150 dans l'exemple)
    Pour i = 1 a nbre_droites
      Pour j = I+1 a nbre_droites
           x0,Y0 = intersection des droites i et J
           pour k = 1 a nbre_droites 
               si k <> i  et k<> j alors
                  La droite Dk divise le plan en 2 demi-plans, est-ce que ce point (x0,y0) est dans le même demi-plan que (0,0), si oui, on continue, sinon on jette ce point (x0,y0) ; pas la peine de regarder les autres Droites Dk  pour ce couple i,j.
                  Autrement dit, Quel est le signe de ak* x0 + bk*y0 + ck  ? Si ce nombre n'est pas du même signe que ck, alors ce point x0,y0 est inutile
               fin
          Next k 
          Si (x0,y0) est utile, on incrémente un tableau, avec : les coordonnées x0,Y0, et les n° des 2 droites i et j
       Next j
    Next i
    C'est fini ...
    On a tous les points utiles, et on a ce qu'il faut pour les ordonner.
    Reste une petite galère si 3 droites se croisent en un même point.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 28
    Points : 25
    Points
    25
    Par défaut
    Bonsoir,
    je voulais vous remercier tous les deux pour votre aide.
    J'ai pris un peu de temps pour vous répondre car j'ai testé la solution détaillée proposée par tbc92.
    J'ai fait un exemple avec une demi-douzaine de courbes formant un polygone autour de l'origine.
    Après quelques mises au points (dans mon code), ça marche.
    Dans mon cas réel d’application, la physique du truc fait que les chances d'avoir 3 droites se croisant en un même point sont inexistantes. Merci d'avoir attiré mon attention sur ce cas particulier.

    Il me reste à tester cela au boulot avec des données réelles.

    Bravo encore pour la solution ainsi que sur la clarté et la propreté de l'algo.

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    Merci pour le feedback.
    En terme de temps de traitement, cet algorithme est en gros en n*n*racine(n) .
    Pour n entre 100 et 150, ça fait un nombre de calculs 'raisonnable'.

    J'ai en tête un aménagement de cet algorithme. Pour 100 droites, je pense que le rapport bénéfice / inconvénients est équilibré.

    Mais si tu as besoin d'un temps de traitement optimisé, ou si tu es amené à traiter 500 ou 1000 droites, n'hésite pas à faire signe.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #6
    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
    Citation Envoyé par tbc92 Voir le message
    En terme de temps de traitement, cet algorithme est en gros en n*n*racine(n) .
    ...
    Mais si tu as besoin d'un temps de traitement optimisé, ou si tu es amené à traiter 500 ou 1000 droites, n'hésite pas à faire signe.
    Tiens je suis tombé sur cet article, qui devrait résoudre le problème :

    http://arxiv.org/pdf/1412.6619.pdf

    "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

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

Discussions similaires

  1. Point à l'intérieur d'un triangle ?
    Par remi77 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 15/05/2017, 14h49
  2. Réponses: 6
    Dernier message: 03/03/2004, 14h31
  3. AnsiString à l'intérieur de la dll
    Par FredericB dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/02/2004, 20h41
  4. [Algo] Point à l'intérieur d'un polygone ?
    Par kebby dans le forum C++Builder
    Réponses: 5
    Dernier message: 23/05/2003, 13h22
  5. savoir si 1 point est a l'intérieur d'un cercle ...
    Par skarladevobsy dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 23/05/2002, 18h14

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