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 convexe d'un ensemble de carrés


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut Enveloppe convexe d'un ensemble de carrés
    Bonjour,

    Connaissez vous svp un bon algo pour créer un polygone convexe qui englobe un tableau 2D quelconque de carrés (proprité IsVisible vaut aléatoirement false ou true) ?

    Nom : 9.gif
Affichages : 278
Taille : 8,3 Ko

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    D'abord considérer les sommets des carrés qui sont sur la bordure extérieure (donc les sommets des carrés qui ne sont pas entourés de 8 carrés. Ensuite, par exemple, utiliser un parcours de Graham, ou une marche de Jarvis, pour la détermination de l'enveloppe convexe de ces sommets.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut
    Ok merci, lequels des 2 algo est le plus optimisé stp ? En entrée je n'aurai jamais plus de 16 * 4 = 64 points

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Avec n le nombre de points, et h le nombre de points dans l'enveloppe, Jarvis est en 0(nh), donc au pire en O(n2), alors que Graham est en O(n log n), pouvant descendre à O(n) si les points sont pré triés suivant une coordonnée (ou un angle).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut
    C'est parfait , merci encore

  6. #6
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut
    Bonjour,

    J'ai commencé à implémenter cet algo à la sauce Unreal Engine 4.

    Code : 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
    // To find orientation of ordered triplet (p, q, r).
    // The function returns following values
    // 0 --> p, q and r are colinear
    // 1 --> Clockwise
    // 2 --> Counterclockwise
    int32 AInfrastructureGraphManager::GetOrientation(FVector p, FVector q, FVector r)
    {
    	int32 val = (q.Y - p.Y) * (r.X - q.X) - (q.X - p.X) * (r.Y - q.Y);
     
    	if (val == 0) return 0;  // colinear
    	return (val > 0) ? 1 : 2; // clock or counterclock wise
    }
     
    // A function used by library function qsort() to sort an array of
    // points with respect to the first point
    int32 AInfrastructureGraphManager::Compare(FVector p0, FVector p1, FVector p2)
    {
     
    	// Find orientation
    	int32 o = GetOrientation(p0, p1, p2);
    	float a = (p2 - p0).Size();
    	float b = (p1 - p0).Size();
     
     
    	if (o == 0)
    		return (a*a >= b*b) ? -1 : 1;
     
    	return (o == 2) ? -1 : 1;
    }
     
    TArray<FVector> AInfrastructureGraphManager::GetConvexHull(TArray<FVector> Points) {
     
    	TArray<FVector> l_Points;
    	TArray<FVector> l_ConvexHull;
    	int32 l_minYIndex = 0;
     
    	l_Points.Append(Points);
     
    	for (int32 i = 1; i < l_Points.Num(); i++) {
     
    		if ((l_Points[i].Y < l_Points[l_minYIndex].Y) || (l_Points[i].Y == l_Points[l_minYIndex].Y && l_Points[i].X < l_Points[l_minYIndex].X)){
    			l_minYIndex = i;
    		}
     
    	}
     
    	l_Points.Swap(0, l_minYIndex);
     
    	l_ConvexHull.Add(l_Points[0]);
     
    	for (int32 i = 1; i < l_Points.Num() - 1; i++) {
     
    		//J'aimerais trier l_Points de sorte que Compare(l_Points[0], l_Points[i], l_Points[i+1])) vale 1, de sorte que tous les points autres que l_Points[0] soient distribués de façon ordonnées du plus loin au plus rapproché en coordonnées polaire dans le sens inverse des aiguilles d'une montre
    	}
     
    	return l_ConvexHull;
     
    }
    Nom : 10.gif
Affichages : 214
Taille : 13,2 Ko

    C'est galère dans UE4 d'utiliser une librairie externe c++, donc je ne peux utiliser qsort(). Du coup quel algo de tri (de sorte que tous les points autres que l_Points[0] soit distribués de façon ordonnées du plus loin au plus rapproché en coordonnées polaire dans le sens inverse des aiguilles d'une montre) me conseillez vous svp ? Je souhaite qu'au final, en parcourant le tableau, Compare(l_Points[0], l_Points[i], l_Points[i+1])) renvoie toujours 1.

  7. #7
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 453
    Points
    1 453
    Par défaut
    //J'aimerais trier l_Points de sorte que Compare(l_Points[0], l_Points[i], l_Points[i+1])) vale 1, de sorte que tous les points autres que l_Points[0] soient distribués de façon ordonnées du plus loin au plus rapproché en coordonnées polaire dans le sens inverse des aiguilles d'une montre
    }
    Ne suffit-il pas de trouver le premier ? (qui serait le prochain point à inclure)
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  8. #8
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut
    Je cherche un algo optimal de tri, que me conseillez vous svp ?

  9. #9
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Enveloppe convexe d'un ensemble de carrés
    Bonjour,

    J'ai peut-être mal compris la demande, parce que les deux conditions requises (1 et 2) me paraissent inconciliables:
    Citation Envoyé par guitz Voir le message
    ... Du coup quel algo de tri (de sorte que tous les points autres que l_Points[0] soit distribués de façon ordonnée du plus loin au plus rapproché en coordonnées polaires dans le sens inverse des aiguilles d'une montre me conseillez vous svp ? Je souhaite qu'au final, en parcourant le tableau, Compare(l_Points[0], l_Points[i], l_Points[i+1])) renvoie toujours 1.
    Les points successifs définiraient une spirale s'enroulant autour de son centre sans le sens trigonométrique (Rho diminuant lorsque l'angle polaire augmente) - ce qui ne peut être le cas d'un ensemble quelconque de points.

    Il faut choisir l'un ou l'autre: ordre décroissant des distances, ou disposition dans le sens trigonométrique.
    Exemple (en se rapportant à vue d'oeuil au centre (P0): (3 4 5 1 2) ou (5 2 4 3 1).
    L'ordre le plus "naturel" est celui des angles polaires, directement reliés au parcours de l'enveloppe dans le sens trigonométrique.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  10. #10
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut
    Salut wiwaxia,

    En fait tu vas mieux comprendre ce que je veux obtenir si tu fais les Swap() suivants sur mon croquis bleu (ordre souhaité des P1, ... , Pn) :

    Swap (P1,P5);
    Swap (P3,P4);

    La convexité est obtenue après ..

  11. #11
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    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 057
    Points : 9 396
    Points
    9 396
    Par défaut
    Sur le croquis bleu, les points PO à P5 sont déjà triés selon l'angle, en ordre trigonométrique inverse, si on considère que le centre est un point un peu en dessous à droite de P2.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  12. #12
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut
    Bonjour,

    Les points sont aléatoires, le croquis est juste un exemple.

    Je sais quel algo de tri utiliser pour par exemple une distance de la plus grande à la plus petite avec P0, mais quel algo utiliser de façon à ce que Compare(l_Points[0], l_Points[i], l_Points[i+1])) renvoie toujours 1 (voir croquis bleu) ?
    Merci

Discussions similaires

  1. Enveloppe convexe : quel algo
    Par zenux dans le forum Développement 2D, 3D et Jeux
    Réponses: 6
    Dernier message: 17/02/2008, 18h54
  2. Enveloppe convexe masque
    Par coolzy dans le forum Images
    Réponses: 7
    Dernier message: 14/05/2007, 16h33
  3. Enveloppe Convexe 3D
    Par ToTo13 dans le forum 3D
    Réponses: 3
    Dernier message: 02/05/2007, 16h19
  4. enveloppe convexe
    Par hamdouch dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 15/04/2006, 17h37
  5. Calcul d'enveloppe convexe + triangulation
    Par Celelibi dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 24/11/2005, 18h02

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