A voir également:
- Logiciel calcul surface polygone irrégulier
- Logiciel calcul surface terrain gratuit - Télécharger - Outils professionnels
- Money logiciel - Télécharger - Comptabilité & Facturation
- Calcul moyenne excel - Guide
- Logiciel calcul plancher bois gratuit - Télécharger - Architecture & Déco
- Logiciel montage vidéo gratuit windows 10 - Guide
17 réponses
Qu'appelles-tu les sommets?
Ces 4 points?
Le point dont la valeur de l'abcisse est la plus élevée
Le point dont la valeur de l'abcisse est la moins élevée
Le point dont la valeur de l'ordonnée est la plus élevée
Le point dont la valeur de l'ordonnée est la moins élevée
Ou plutôt chaque point délimitant une rupture dans un segment (un angle)?
HackTrack
Java Developer
;-)
Ces 4 points?
Le point dont la valeur de l'abcisse est la plus élevée
Le point dont la valeur de l'abcisse est la moins élevée
Le point dont la valeur de l'ordonnée est la plus élevée
Le point dont la valeur de l'ordonnée est la moins élevée
Ou plutôt chaque point délimitant une rupture dans un segment (un angle)?
HackTrack
Java Developer
;-)
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 793
9 juil. 2002 à 09:17
9 juil. 2002 à 09:17
HAckTrack, les sommets d'un polygone sont ses "angles"...
La propriete d'un angle est de changer de direction
Si 3 de tes points consecutifs ne sont pas alignes, le point mediant est alors le sommet...Remarque que si cette methode prend tu temps (en foncion du nombre de points de ton polygone) tu peux privilegier la vitesse a la precision en ne prenant qu'un point sur 2 ou 3 (ou plus,mais tu perds vite en precision...)
J'espere que ca va etre utile...
Bon courage...
*,*
\_/
La propriete d'un angle est de changer de direction
Si 3 de tes points consecutifs ne sont pas alignes, le point mediant est alors le sommet...Remarque que si cette methode prend tu temps (en foncion du nombre de points de ton polygone) tu peux privilegier la vitesse a la precision en ne prenant qu'un point sur 2 ou 3 (ou plus,mais tu perds vite en precision...)
J'espere que ca va etre utile...
Bon courage...
*,*
\_/
Cette classe te permet d'initialiser une liste de points et de tester le fonctionnement de la classe PolySummitFinder
/*
* PolySummitFinderLauncher.java
*
* Created on July 10, 2002, 8:12 AM
*/
package CCM;
import java.util.*;
import java.awt.Point;
/**
*
* @author HackTrack
* @version 1.0
*/
public class PolySummitFinderLauncher {
public static void main(String args[]) {
ArrayList allPoints = new ArrayList();
allPoints.add(new Point(0,0));
allPoints.add(new Point(0,3));
allPoints.add(new Point(0,6));
allPoints.add(new Point(3,6));
allPoints.add(new Point(6,6));
allPoints.add(new Point(11,6));
allPoints.add(new Point(8,2));
allPoints.add(new Point(6,2));
allPoints.add(new Point(4,2));
allPoints.add(new Point(3,2));
PolySummitFinder finder = new PolySummitFinder();
List summits = finder.findSummits(allPoints);
Iterator it = summits.iterator();
int summitCounter = 1;
while(it.hasNext()){
Point p = (Point)it.next();
System.out.println("Sommet " + summitCounter +": ");
System.out.println(" x = " + p.getX());
System.out.println(" y = " + p.getY());
}
System.out.println("Terminé!");
}
}
------------------------------------------------------------------
Cette classe te permet de récupérer une liste de sommets hors d'une liste de points grâce à la méthode findSummit.
/*
* PolySummitFinder.java
*
* Created on July 10, 2002, 8:10 AM
*/
package CCM;
import java.awt.Point;
import java.util.*;
/**
*
* @author HackTrack
* @version 1.0
*/
public class PolySummitFinder {
private ArrayList summits;
public PolySummitFinder() {
summits = new ArrayList();
}
public List findSummits(ArrayList points){
int pointsCount = points.size();
if(pointsCount<3){
System.out.println("Le nuage de points doit compter 3 points au minimum");
}else{
for(int i=0 ; i<pointsCount-2 ; i++){
checkAlignment((Point)points.get(i),(Point)points.get(i+1),(Point)points.get(i+2));
}
checkAlignment((Point)points.get(pointsCount-2),(Point)points.get(pointsCount-1),(Point)points.get(0));
checkAlignment((Point)points.get(pointsCount-1),(Point)points.get(0),(Point)points.get(1));
}
return summits;
}
private void checkAlignment(Point p1, Point p2, Point p3){
//Calcul des valeurs de a et b dans y=ax+b pour les points p1 et p2
if(p1.getX()-p2.getX()==0){
if(p3.getX()!=p1.getX()){
addSummit(p2);
}
}else{
double a = (p1.getY()-p2.getY())/(p1.getX()-p2.getX());
double b = p1.getY()-a*p1.getX();
if(p3.getY()!=a*p3.getX()+b){
addSummit(p2);
}
}
}
private void addSummit(Point newSummit){
summits.add(newSummit);
}
}
;-)
HackTrack
/*
* PolySummitFinderLauncher.java
*
* Created on July 10, 2002, 8:12 AM
*/
package CCM;
import java.util.*;
import java.awt.Point;
/**
*
* @author HackTrack
* @version 1.0
*/
public class PolySummitFinderLauncher {
public static void main(String args[]) {
ArrayList allPoints = new ArrayList();
allPoints.add(new Point(0,0));
allPoints.add(new Point(0,3));
allPoints.add(new Point(0,6));
allPoints.add(new Point(3,6));
allPoints.add(new Point(6,6));
allPoints.add(new Point(11,6));
allPoints.add(new Point(8,2));
allPoints.add(new Point(6,2));
allPoints.add(new Point(4,2));
allPoints.add(new Point(3,2));
PolySummitFinder finder = new PolySummitFinder();
List summits = finder.findSummits(allPoints);
Iterator it = summits.iterator();
int summitCounter = 1;
while(it.hasNext()){
Point p = (Point)it.next();
System.out.println("Sommet " + summitCounter +": ");
System.out.println(" x = " + p.getX());
System.out.println(" y = " + p.getY());
}
System.out.println("Terminé!");
}
}
------------------------------------------------------------------
Cette classe te permet de récupérer une liste de sommets hors d'une liste de points grâce à la méthode findSummit.
/*
* PolySummitFinder.java
*
* Created on July 10, 2002, 8:10 AM
*/
package CCM;
import java.awt.Point;
import java.util.*;
/**
*
* @author HackTrack
* @version 1.0
*/
public class PolySummitFinder {
private ArrayList summits;
public PolySummitFinder() {
summits = new ArrayList();
}
public List findSummits(ArrayList points){
int pointsCount = points.size();
if(pointsCount<3){
System.out.println("Le nuage de points doit compter 3 points au minimum");
}else{
for(int i=0 ; i<pointsCount-2 ; i++){
checkAlignment((Point)points.get(i),(Point)points.get(i+1),(Point)points.get(i+2));
}
checkAlignment((Point)points.get(pointsCount-2),(Point)points.get(pointsCount-1),(Point)points.get(0));
checkAlignment((Point)points.get(pointsCount-1),(Point)points.get(0),(Point)points.get(1));
}
return summits;
}
private void checkAlignment(Point p1, Point p2, Point p3){
//Calcul des valeurs de a et b dans y=ax+b pour les points p1 et p2
if(p1.getX()-p2.getX()==0){
if(p3.getX()!=p1.getX()){
addSummit(p2);
}
}else{
double a = (p1.getY()-p2.getY())/(p1.getX()-p2.getX());
double b = p1.getY()-a*p1.getX();
if(p3.getY()!=a*p3.getX()+b){
addSummit(p2);
}
}
}
private void addSummit(Point newSummit){
summits.add(newSummit);
}
}
;-)
HackTrack
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 793
10 juil. 2002 à 09:54
10 juil. 2002 à 09:54
Toutes ces jolies reponses et personne pour dire merci :-(
*,*
\_/
*,*
\_/
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
choubaka
Messages postés
39407
Date d'inscription
jeudi 4 avril 2002
Statut
Modérateur
Dernière intervention
9 décembre 2024
2 104
10 juil. 2002 à 10:05
10 juil. 2002 à 10:05
sidérant
Chouba
"Les Schtroumpfs sont mes amis passk'ils sont petits"
Chouba
"Les Schtroumpfs sont mes amis passk'ils sont petits"
je reçois à l'instant même vos précieuses réponses et je vous en remercie. j'essaye les differentes methodes pour vous faire part du resultat.
Merci en particulier à HackTrack et à Teebo .
cordialement.
Merci en particulier à HackTrack et à Teebo .
cordialement.
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 793
10 juil. 2002 à 10:53
10 juil. 2002 à 10:53
Haaa :-)))))))))
*,*
\_/
*,*
\_/
je tiens à confirmer le bon fonctionnement du programme de
HackTrack ! idée géniale,programme génial qui marche dès le premier test!!
Merci encore à HackTrack , à Teebo et à Choubaka!
Bravo HackTrack !!
cordialement
André
HackTrack ! idée géniale,programme génial qui marche dès le premier test!!
Merci encore à HackTrack , à Teebo et à Choubaka!
Bravo HackTrack !!
cordialement
André
j'ai aussi testé le programe de HackTrack et je constate qu'il ne marche pas pour les polygone ayant 1 ou plusieurs courbes comme côtés.
donc j'invite André à revérifier le bon fonctionnement du dit programme.
donc j'invite André à revérifier le bon fonctionnement du dit programme.
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 793
11 juil. 2002 à 22:36
11 juil. 2002 à 22:36
Desole, mais autant que je sache, un polygone n'a que des cotes droits, donc le programme marche bien...dans le cas des polygones... ;-)
*,*
\_/
*,*
\_/
Marden
Messages postés
1072
Date d'inscription
dimanche 11 février 2001
Statut
Membre
Dernière intervention
29 janvier 2006
210
12 juil. 2002 à 00:12
12 juil. 2002 à 00:12
Veux-tu bien reformuler le problème ? Parce qu'on peut supposer que les coordonnées saisies le sont à partir de données qui sont déjà à l'image d'un contour.
En général, un nuage de points correspond à un relevé de valeurs selon 2 critères (les coordonnées dans un plan n'étant qu'un cas particulier), dont va chercher la droite de régression.
Si j'ai bien compris, la solution proposée consiste à réduire le nombre de sommets pour obtenir le polygone original, ce qui suppose que les points sont fournis dans l'ordre. Quel est l'intérêt d'un tel problème ?
[ Dans la solution, que vaut "a" quand 2 points successifs ont même abscisse ? N'aurait-on pas une division par 0 ? ]
En général, un nuage de points correspond à un relevé de valeurs selon 2 critères (les coordonnées dans un plan n'étant qu'un cas particulier), dont va chercher la droite de régression.
Si j'ai bien compris, la solution proposée consiste à réduire le nombre de sommets pour obtenir le polygone original, ce qui suppose que les points sont fournis dans l'ordre. Quel est l'intérêt d'un tel problème ?
[ Dans la solution, que vaut "a" quand 2 points successifs ont même abscisse ? N'aurait-on pas une division par 0 ? ]
HackTrack
>
Marden
Messages postés
1072
Date d'inscription
dimanche 11 février 2001
Statut
Membre
Dernière intervention
29 janvier 2006
12 juil. 2002 à 07:39
12 juil. 2002 à 07:39
Salut Marden!
En fait, André utilise un algorithme qui lui renvoie une collection de points qui sont en fait les points délimitant le contour d'une image (on travaille ici dans un plan en 2D, pas en 3D.
Ma (petite) classe Java permet d'extraire les sommets du polygone irrégulier défini par cette collection de points ordonnés.
L'algorithme vérifie l'alignement de 3 points successifs en calculant la valeur de a et b pour l'équation de la droite (y=ax+b) passant par le premier et le deuxième point. L'algorithme vérifie ensuite que le troisième point appartient bien à cette droite en vérifiant l'égalité y=ax+b avec, pour valeur s de x et y, l'abcisse et l'ordonnée du troisième point et, pour valeurs de a et b, les valeurs trouvées précédemment.
Le cas où deux points ont même abcisse est pris en compte:
if(p1.getX()-p2.getX()==0){
//Cas où deux points ont même abcisse
if(p3.getX()!=p1.getX()){
addSummit(p2);
}
}else{
//Cas où deux points n'ont pas même abcisse
double a = (p1.getY()-p2.getY())/(p1.getX()-p2.getX());
double b = p1.getY()-a*p1.getX();
if(p3.getY()!=a*p3.getX()+b){
addSummit(p2);
}
}
Tu as raison en disant que la collection de points délimitant le contour de l'image doit être ordonnée. (Zut alors! J'y avais pas pensé à ça!)
Pourquoi ne complèterais-tu pas l'algorithme pour que l'on puisse ordonné automatiquemen les points d'une collection non ordonnée?
Le premier qui l'a terminé l'ajoute ici, ok?
Ca répond à ta question?
;-)
HackTrack
En fait, André utilise un algorithme qui lui renvoie une collection de points qui sont en fait les points délimitant le contour d'une image (on travaille ici dans un plan en 2D, pas en 3D.
Ma (petite) classe Java permet d'extraire les sommets du polygone irrégulier défini par cette collection de points ordonnés.
L'algorithme vérifie l'alignement de 3 points successifs en calculant la valeur de a et b pour l'équation de la droite (y=ax+b) passant par le premier et le deuxième point. L'algorithme vérifie ensuite que le troisième point appartient bien à cette droite en vérifiant l'égalité y=ax+b avec, pour valeur s de x et y, l'abcisse et l'ordonnée du troisième point et, pour valeurs de a et b, les valeurs trouvées précédemment.
Le cas où deux points ont même abcisse est pris en compte:
if(p1.getX()-p2.getX()==0){
//Cas où deux points ont même abcisse
if(p3.getX()!=p1.getX()){
addSummit(p2);
}
}else{
//Cas où deux points n'ont pas même abcisse
double a = (p1.getY()-p2.getY())/(p1.getX()-p2.getX());
double b = p1.getY()-a*p1.getX();
if(p3.getY()!=a*p3.getX()+b){
addSummit(p2);
}
}
Tu as raison en disant que la collection de points délimitant le contour de l'image doit être ordonnée. (Zut alors! J'y avais pas pensé à ça!)
Pourquoi ne complèterais-tu pas l'algorithme pour que l'on puisse ordonné automatiquemen les points d'une collection non ordonnée?
Le premier qui l'a terminé l'ajoute ici, ok?
Ca répond à ta question?
;-)
HackTrack
Marden
Messages postés
1072
Date d'inscription
dimanche 11 février 2001
Statut
Membre
Dernière intervention
29 janvier 2006
210
>
HackTrack
12 juil. 2002 à 15:07
12 juil. 2002 à 15:07
Salut HackTrack,
Pas facile d'entretenir une discussion quand on a des problèmes de connexion depuis au moins 36 heures !
D'abord, mes excuses pour n'avoir pas noté la présence du test, à cause d'une lecture trop rapide !
Ensuite, pour dire qu'il y a peu de change que je propose le code de la routine de classement des points du contour, ne pratiquant pas le C++ et n'ayant pas envie de m'y lancer (neurones vieillissants !), sachant que ce qui prime est la méthode avec ses algorithmes. L'implémentation ne devrait normalement pas être un problème, même s'il faut pratiquer suffisamment pour être efficace : on arrive alors à "penser dans le langage".
Enfin, ma question s'adressait au départ à André, à savoir de quelles informations il dispose au départ de son problème, et quelle est la méthodologie de saisie.
Par exemple, j'ai une figure sous les yeux, je clique sur un point du contour pour l'enregistrer, puis je passe au point suivant, ... et je quitte en revenant ou non au point de départ (par convention). Auquel cas, je dispose d'une liste de points ordonnée et implicitement des segments joignant 2 points successifs.
Variantes :
* supprimer un point manuellement ou avec ton algorithme,
* ajouter un point en sélectionnant le segment où l'insérer,
* déplacer un point, en modifiant les 2 segments qui y aboutissent.
(je suppose que ce genre de primitives existent dans les éditeurs Web permettant la création de "maps" associées à une image)
Une autre méthode peut consister à jouer sur le contraste (ou la couleur, ...) entre l'intérieur et l'extérieur de la figure. Cette stratégie suppose un maillage plus ou moins fin. Il faut ensuite parcourir le bord de la figure, dans le sens trigonométrique en testant si la maille "devant" et "à droite" est extérieure ou non (ou sens horaire, avec maille "devant" et "à gauche") en notant le sommet à chaque changement de direction. On commence à entrer dans les problèmes de reconnaissance de forme !!!
Supposons une figure en "L". Le "triangle" enveloppe ne répond pas forcément à la figure cherchée.
Prenons maintenant le cas de 2 figures distinctes (ex : 2 cercles). Selon la précision, on obtiendra 2 figures, ou une seule (une sorte de "8") qui répond ou non à la solution. C'est typiquement le problème qu'on rencontre dans le tracé de courbes de niveaux. Où est la limite entre le 2D et le 3D ? Pas évident à dire. Parfois, on peux faire dans le 2D1/2 !!!
Tout çà pour dire que le problème est intéressant et mérite qu'on s'y penche, en notant la démarche et le résultat de ses cogitations dans ses archives (dessins, algos, routines ... largement documentées) parce qu'on pourra s'en resservir plus tard, pour un cas identique (d'expérience : jamais !) ou présentant certaines similitudes.
A suivre ...
Pas facile d'entretenir une discussion quand on a des problèmes de connexion depuis au moins 36 heures !
D'abord, mes excuses pour n'avoir pas noté la présence du test, à cause d'une lecture trop rapide !
Ensuite, pour dire qu'il y a peu de change que je propose le code de la routine de classement des points du contour, ne pratiquant pas le C++ et n'ayant pas envie de m'y lancer (neurones vieillissants !), sachant que ce qui prime est la méthode avec ses algorithmes. L'implémentation ne devrait normalement pas être un problème, même s'il faut pratiquer suffisamment pour être efficace : on arrive alors à "penser dans le langage".
Enfin, ma question s'adressait au départ à André, à savoir de quelles informations il dispose au départ de son problème, et quelle est la méthodologie de saisie.
Par exemple, j'ai une figure sous les yeux, je clique sur un point du contour pour l'enregistrer, puis je passe au point suivant, ... et je quitte en revenant ou non au point de départ (par convention). Auquel cas, je dispose d'une liste de points ordonnée et implicitement des segments joignant 2 points successifs.
Variantes :
* supprimer un point manuellement ou avec ton algorithme,
* ajouter un point en sélectionnant le segment où l'insérer,
* déplacer un point, en modifiant les 2 segments qui y aboutissent.
(je suppose que ce genre de primitives existent dans les éditeurs Web permettant la création de "maps" associées à une image)
Une autre méthode peut consister à jouer sur le contraste (ou la couleur, ...) entre l'intérieur et l'extérieur de la figure. Cette stratégie suppose un maillage plus ou moins fin. Il faut ensuite parcourir le bord de la figure, dans le sens trigonométrique en testant si la maille "devant" et "à droite" est extérieure ou non (ou sens horaire, avec maille "devant" et "à gauche") en notant le sommet à chaque changement de direction. On commence à entrer dans les problèmes de reconnaissance de forme !!!
Supposons une figure en "L". Le "triangle" enveloppe ne répond pas forcément à la figure cherchée.
Prenons maintenant le cas de 2 figures distinctes (ex : 2 cercles). Selon la précision, on obtiendra 2 figures, ou une seule (une sorte de "8") qui répond ou non à la solution. C'est typiquement le problème qu'on rencontre dans le tracé de courbes de niveaux. Où est la limite entre le 2D et le 3D ? Pas évident à dire. Parfois, on peux faire dans le 2D1/2 !!!
Tout çà pour dire que le problème est intéressant et mérite qu'on s'y penche, en notant la démarche et le résultat de ses cogitations dans ses archives (dessins, algos, routines ... largement documentées) parce qu'on pourra s'en resservir plus tard, pour un cas identique (d'expérience : jamais !) ou présentant certaines similitudes.
A suivre ...
HackTrack
>
Marden
Messages postés
1072
Date d'inscription
dimanche 11 février 2001
Statut
Membre
Dernière intervention
29 janvier 2006
16 juil. 2002 à 22:50
16 juil. 2002 à 22:50
Salut Marden!
Salut André!
Comme l'a proposé Marden, je me sui penché sur le problème d'un ensemble de points non ordonnés et ...
... ça y est! Plus qu'un bug à résoudre et je vous envoie le code, avant la fin de la semaine, des classes (Java) permettant de "trier" un set de point non ordonnés.
En clair, sur base d'un ensemble de points, l'application recherche les points délimitant les sommets du polygone contenant tous les points de l'ensemble. Ce qui veut dire que l'application ne recherche que les sommets du polygone. Conséquence, certians sommets ne sont pas repris comme sommets.
Ils peuvent alors être "placés", par l'utilisateur, entre deux sommets triés (méthode: "insertSummit").
Un sommet peut aussi être supprimé (méthode: "deleteSummit")
Deux méthodes permettent aussi de connaître le point précédant ou suivant un point donné suivant le sens horlogique ou antihorlogique (méthodes= "getPointBefore" et "getPointAfter")
Une autre méthode permet de récupérer les points fournis dans l'ensemble de points fournis par l'utilisateur et qui ne sont pas repris comme sommets (autrement dit, les sommets qui sont à insérer via la méthode "insertSummit" par l'utilisateur).
A bientôt pour le code en ligne!
HackTrack
;-)
PS: version 2.0 suivra avec remplissage de couleur, mais alors, orinté Swing.
Salut André!
Comme l'a proposé Marden, je me sui penché sur le problème d'un ensemble de points non ordonnés et ...
... ça y est! Plus qu'un bug à résoudre et je vous envoie le code, avant la fin de la semaine, des classes (Java) permettant de "trier" un set de point non ordonnés.
En clair, sur base d'un ensemble de points, l'application recherche les points délimitant les sommets du polygone contenant tous les points de l'ensemble. Ce qui veut dire que l'application ne recherche que les sommets du polygone. Conséquence, certians sommets ne sont pas repris comme sommets.
Ils peuvent alors être "placés", par l'utilisateur, entre deux sommets triés (méthode: "insertSummit").
Un sommet peut aussi être supprimé (méthode: "deleteSummit")
Deux méthodes permettent aussi de connaître le point précédant ou suivant un point donné suivant le sens horlogique ou antihorlogique (méthodes= "getPointBefore" et "getPointAfter")
Une autre méthode permet de récupérer les points fournis dans l'ensemble de points fournis par l'utilisateur et qui ne sont pas repris comme sommets (autrement dit, les sommets qui sont à insérer via la méthode "insertSummit" par l'utilisateur).
A bientôt pour le code en ligne!
HackTrack
;-)
PS: version 2.0 suivra avec remplissage de couleur, mais alors, orinté Swing.
merci à Marden pour la méthode proposée.
comme la compris HackTrack nous disposons au depart un ensemble de points non ordonnés décrivant le contour (avec éventuellement des bruits) d'une image et l'on souhaite avoir les sommets .il est à noter que le cas où les côtés sont des segments a été résolu par HackTrack .
cordialement
comme la compris HackTrack nous disposons au depart un ensemble de points non ordonnés décrivant le contour (avec éventuellement des bruits) d'une image et l'on souhaite avoir les sommets .il est à noter que le cas où les côtés sont des segments a été résolu par HackTrack .
cordialement
Eaulive
Messages postés
27064
Date d'inscription
jeudi 18 avril 2002
Statut
Modérateur
Dernière intervention
23 juin 2015
290
17 juil. 2002 à 06:49
17 juil. 2002 à 06:49
Oulàlà quel mal de bloc...après tout ça je retourne au café moi...
Ils sont fous ces informaticiens ;-);-);-)
Eaulive...
Vaut mieux un p'tit piment qu'un avion en plastique
Ils sont fous ces informaticiens ;-);-);-)
Eaulive...
Vaut mieux un p'tit piment qu'un avion en plastique
Chose promise, chose dûe!
Voici le code de l'utilitaire qui permet de trouver, sur base d'un nuage de points fournis, les points représentant les sommets du polygône irrégulier contenant tout le nuage de point.
Le package (que j'ai nommé: be.hacktrack.points) contient classes:
- PointsAreaTester qui permet de tester le package
- CircularQueue: implémentation d'une queue circulaire utilisée, dans ce package, pour stocker les sommets du polygône.
- QueueInsertException: exception jetée lors de l'insertion d'un élément dans une CircularQueue
- QueueReadException: exception jetée lors de la lecture d'un élément dans une CircularQueue
- SortException: exception jetée lors de la recherhce et du tri des sommets du polygône (par exemple: si le nombre de points à trier est strictement inférieur à 3)
- PointsArea: classe "principale" disposant de plusieurs méthodes publiques.
* public ArrayList sortPoints(Point2D.Double[] points) throws SortException: extrait les sommets du polygône et les trie suivant le sens trigonométrique
* public CircularQueue insertSummit(Point2D.Double newPoint, Point2D.Double p1, Point2D.Double p2) throws QueueReadException, QueueInsertException: insére le point newPoint entre les sommets p1 et p2
* public boolean removeSummit(Point2D.Double summitToRemove): enlève un sommet au polygône et replace ce sommet dans la liste des points non triés. Renvoi 'true' si le sommet a bien été enlevé
* public CircularQueue deleteSummit(Point2D.Double summitToDelete): supprime définitivement le sommet. Le point est alors 'perdu'
* public List getUnsortedPoint(): renvoie la liste des points non triés
* public int summitCount(): renvoie le nombre de sommets du polygône
* public Point2D.Double getNextSummit(): renvoie le sommet suivant dans le sens trigonométrique
* public Point2D.Double getNextSummit(Point2D.Double aSummit) throws QueueReadException: renvoie le sommet suivant 'aSummit' dans le sens trigonométrique
* public Point2D.Double getPreviousSummit(): renvoie le sommet précédent dans le sens trigonométrique
* public Point2D.Double getPreviousSummit(Point2D.Double aSummit) throws QueueReadException: renvoie le sommet précédant 'aSummit' dans le sens trigonométrique
Assez parlé, voici le code des différentes classes.
Si qqn est intéressé par ce package, qu'il me laisse son adresse e-mail et je le lui envoie.
------------------------ Classe SortException ---------------------------
package be.hacktrack.points;
/**
*
* @author HackTrack
* @version 1.0
*/
public class SortException extends java.lang.Exception {
public SortException() {
super("Minimum 3 points must be given to perform sort");
}
}
----------------------- Classe QueueInsertException -------------------
package be.hacktrack.points;
/**
*
* @author HackTrack
* @version 1.0
*/
public class QueueInsertException extends Exception{
/** Creates new QueueInsertException */
public QueueInsertException(String message) {
super(message);
}
}
------------------- Classe QueueReadException ------------------------
package be.hacktrack.points;
/**
*
* @author HackTrack
* @version 1.0
*/
public class QueueReadException extends java.lang.Exception {
public QueueReadException(String msg) {
super(msg);
}
}
----------------------- Classe CircularQueue ----------------------------
package be.hacktrack.points;
import java.util.*;
/**
*
* @author HackTrack
* @version 1.0
*/
public class CircularQueue{
private ArrayList queue;
private int currentIndex;
public CircularQueue() {
super();
queue = new ArrayList();
currentIndex = 0;
}
public Object getPrevious(Object o) throws QueueReadException{
int index = queue.indexOf(o);
if(index!=-1){
if(index==0){
return queue.get(queue.size()-1);
}else{
return queue.get(index--);
}
}else{
throw new QueueReadException("This Object is not in the queue");
}
}
public Object getPrevious(){
if(currentIndex==0){
currentIndex=queue.size()-1;
return queue.get(currentIndex);
}else{
currentIndex--;
return queue.get(currentIndex);
}
}
public Object getNext(Object o) throws QueueReadException{
int index = queue.indexOf(o);
if(index!=-1){
if(index==queue.size()-1){
return queue.get(0);
}else{
return queue.get(index++);
}
}else{
throw new QueueReadException("This Object is not in the queue");
}
}
public Object getNext(){
if(currentIndex==queue.size()-1){
currentIndex=0;
return queue.get(currentIndex);
}else{
currentIndex++;
return queue.get(currentIndex);
}
}
public void add(Object o){
queue.add(currentIndex,o);
}
public void insertBetween(Object newObject, Object o1, Object o2) throws QueueInsertException{
if(queue.contains(o1) && queue.contains(o2)){
int interval = queue.indexOf(o2)-queue.indexOf(o1);
if(interval==0){
throw new QueueInsertException("The two Object can't be the same");
}else if(interval==1){
queue.add(queue.indexOf(o2), newObject);
}else if(interval==-1){
queue.add(queue.indexOf(o1), newObject);
}else if(interval==queue.size()-1){
queue.add(newObject);
}else{
throw new QueueInsertException("The two Object must be contiguous");
}
}
}
public boolean remove(Object o){
return queue.remove(o);
}
public boolean contains(Object o){
return queue.contains(o);
}
public int size(){
return queue.size();
}
public String toString(){
StringBuffer s = new StringBuffer();;
Iterator it = queue.iterator();
s.append("CircularQueue" + "\n\r");
while(it.hasNext()){
s.append(it.next().toString()+"\n\r");
}
return s.toString();
}
}
-------------------------- Classe PointsArea ----------------------------
package be.hacktrack.points;
import java.awt.geom.Point2D;
import java.util.*;
/**
*
* @author HackTrack
* @version 1.0
*/
public class PointsArea {
private Point2D.Double[] pointsToSort;
private ArrayList pointsRemainingToSort;
private CircularQueue sortedPoints;
private Point2D.Double firstPoint;
private Point2D.Double lastPoint;
private double currentAngle;
public PointsArea(){
initialize();
}
public CircularQueue sortPoints(Point2D.Double[] pointsToSort) throws SortException{
if(pointsToSort.length<3)
throw new SortException();
currentAngle = 0;
//Storing points to sort
this.pointsToSort = pointsToSort;
for(int i=0 ; i<pointsToSort.length; i++){
pointsRemainingToSort.add(pointsToSort[i]);
}
//Find first point
firstPoint = getFirstPoint();
sortedPoints.add(firstPoint);
lastPoint = firstPoint;
//Find second point
pointsRemainingToSort.remove(firstPoint);
lastPoint = getNextPoint();
pointsRemainingToSort.add(firstPoint);
markAsSorted(lastPoint);
//Sorting all other points
while(true){
lastPoint = getNextPoint();
if(lastPoint==firstPoint){
break;
}else{
if(lastPoint==null)
break;
markAsSorted(lastPoint);
}
}
return sortedPoints;
}
public CircularQueue insertSummit(Point2D.Double newPoint, Point2D.Double p1, Point2D.Double p2) throws QueueReadException, QueueInsertException{
sortedPoints.insertBetween(newPoint, p1, p2);
pointsRemainingToSort.remove(newPoint);
return sortedPoints;
}
public boolean removeSummit(Point2D.Double summitToRemove){
pointsRemainingToSort.add(summitToRemove);
return sortedPoints.remove(summitToRemove);
}
public CircularQueue deleteSummit(Point2D.Double summitToDelete){
sortedPoints.remove(summitToDelete);
return sortedPoints;
}
public String toString(){
return sortedPoints.toString();
}
public List getUnsortedPoint(){
return pointsRemainingToSort;
}
public int summitCount(){
return sortedPoints.size();
}
public Point2D.Double getNextSummit(){
return (Point2D.Double)sortedPoints.getNext();
}
public Point2D.Double getNextSummit(Point2D.Double aSummit) throws QueueReadException{
return (Point2D.Double)sortedPoints.getNext(aSummit);
}
public Point2D.Double getPreviousSummit(){
return (Point2D.Double)sortedPoints.getPrevious();
}
public Point2D.Double getPreviousSummit(Point2D.Double aSummit) throws QueueReadException{
return (Point2D.Double)sortedPoints.getPrevious(aSummit);
}
/*
* Private methods
*/
private void initialize(){
pointsRemainingToSort = new ArrayList();;
sortedPoints = new CircularQueue();
lastPoint = null;
}
private Point2D.Double getNextPoint(){
Point2D.Double tempPoint = null;
Iterator it = pointsRemainingToSort.iterator();
double angle = 7;
while(it.hasNext()){
Point2D.Double aPointToSort = (Point2D.Double)it.next();
double tempAngle = calcAngle(lastPoint, aPointToSort);
if(tempAngle>currentAngle){
if(tempAngle<0){
tempAngle += Math.toRadians(360);
}
if(tempAngle==angle){
if(tempPoint==null){
angle = tempAngle;
tempPoint = aPointToSort;
}else{
if(lastPoint.distance(aPointToSort)>lastPoint.distance(tempPoint)){
angle = tempAngle;
tempPoint = aPointToSort;
}
}
}else if(tempAngle<angle){
angle = tempAngle;
tempPoint = aPointToSort;
}
currentAngle = angle;
}
}
return tempPoint;
}
private double calcAngle(Point2D.Double lastPoint, Point2D.Double aPointToSort){
double angle = 0;
double x1 = lastPoint.getX();
double y1 = lastPoint.getY();
double x2 = aPointToSort.getX();
double y2 = aPointToSort.getY();
double dx = x2-x1;
double dy = y2-y1;
if(dx==0){
if(dy==0){
//The two points are overlapping => discard aPointToSort -> pointsRemainingToSort
pointsRemainingToSort.remove(aPointToSort);
}else{
//The two points have same abcisse
if(dx>0){
angle = Math.toRadians(90);
}else{
angle = Math.toRadians(270);
}
}
}else if(dy==0){
//The two points have same ordonnée
if(dy>0){
angle = java.lang.Math.toRadians(0);
}else{
angle = java.lang.Math.toRadians(180);
}
}else{
//The two points have different abcisse and different ordonnée
angle = java.lang.Math.atan(dy/dx);
if(dx<0){
angle += java.lang.Math.toRadians(180);
}
}
return angle;
}
private void markAsSorted(Point2D.Double aPoint){
sortedPoints.add(aPoint);
pointsRemainingToSort.remove(aPoint);
}
private Point2D.Double getFirstPoint(){
firstPoint = pointsToSort[0];
for(int i=1 ; i<pointsToSort.length ; i++){
if(pointsToSort[i].getY()==firstPoint.getY()){
if(pointsToSort[i].getX()<firstPoint.getX()){
firstPoint = pointsToSort[i];
}
}else if(pointsToSort[i].getX()>firstPoint.getX()){
firstPoint = pointsToSort[i];
}
}
return firstPoint;
}
}
------------------------ Classe PointsAreaTester -----------------------
package be.hacktrack.points;
import java.util.*;
import java.awt.geom.Point2D;
/**
*
* @author HackTrack
* @version 1.0
*/
public class PointsAreaTester {
public PointsAreaTester() {
}
public static void main(String args[]) {
Point2D.Double[] pointsToSort = new Point2D.Double[10];
pointsToSort[0] = new Point2D.Double(7,10);
pointsToSort[1] = new Point2D.Double(3,9);
pointsToSort[2] = new Point2D.Double(9,7);
pointsToSort[3] = new Point2D.Double(2,5);
pointsToSort[4] = new Point2D.Double(5,6);
pointsToSort[5] = new Point2D.Double(11,5);
pointsToSort[6] = new Point2D.Double(5,4);
pointsToSort[7] = new Point2D.Double(8,4);
pointsToSort[8] = new Point2D.Double(2,2);
pointsToSort[9] = new Point2D.Double(9,2);
PointsArea area = new PointsArea();
try{
CircularQueue sortedPoints = area.sortPoints(pointsToSort);
System.out.println(sortedPoints.toString());
area.insertSummit(pointsToSort[4], pointsToSort[1], pointsToSort[0]);
System.out.println(sortedPoints.toString());
area.insertSummit(pointsToSort[7], pointsToSort[4], pointsToSort[1]);
System.out.println(sortedPoints.toString());
area.removeSummit( pointsToSort[4]);
System.out.println(sortedPoints.toString());
}catch(QueueReadException qre){
qre.printStackTrace();
}catch(QueueInsertException qie){
qie.printStackTrace();
}catch(SortException se){
se.printStackTrace();
}
}
}
Et voilà, mon cher André, une réponse concrète à la proposition que tu avais formulée ici même.
Le package peut, bien sûr, être amélioré. Si d'aventure qqn s'y attachait, qu'il me fass parvenir son code via CCM.
J'espère que cela pourra vous servir.
A+
;-)
HackTrack
Voici le code de l'utilitaire qui permet de trouver, sur base d'un nuage de points fournis, les points représentant les sommets du polygône irrégulier contenant tout le nuage de point.
Le package (que j'ai nommé: be.hacktrack.points) contient classes:
- PointsAreaTester qui permet de tester le package
- CircularQueue: implémentation d'une queue circulaire utilisée, dans ce package, pour stocker les sommets du polygône.
- QueueInsertException: exception jetée lors de l'insertion d'un élément dans une CircularQueue
- QueueReadException: exception jetée lors de la lecture d'un élément dans une CircularQueue
- SortException: exception jetée lors de la recherhce et du tri des sommets du polygône (par exemple: si le nombre de points à trier est strictement inférieur à 3)
- PointsArea: classe "principale" disposant de plusieurs méthodes publiques.
* public ArrayList sortPoints(Point2D.Double[] points) throws SortException: extrait les sommets du polygône et les trie suivant le sens trigonométrique
* public CircularQueue insertSummit(Point2D.Double newPoint, Point2D.Double p1, Point2D.Double p2) throws QueueReadException, QueueInsertException: insére le point newPoint entre les sommets p1 et p2
* public boolean removeSummit(Point2D.Double summitToRemove): enlève un sommet au polygône et replace ce sommet dans la liste des points non triés. Renvoi 'true' si le sommet a bien été enlevé
* public CircularQueue deleteSummit(Point2D.Double summitToDelete): supprime définitivement le sommet. Le point est alors 'perdu'
* public List getUnsortedPoint(): renvoie la liste des points non triés
* public int summitCount(): renvoie le nombre de sommets du polygône
* public Point2D.Double getNextSummit(): renvoie le sommet suivant dans le sens trigonométrique
* public Point2D.Double getNextSummit(Point2D.Double aSummit) throws QueueReadException: renvoie le sommet suivant 'aSummit' dans le sens trigonométrique
* public Point2D.Double getPreviousSummit(): renvoie le sommet précédent dans le sens trigonométrique
* public Point2D.Double getPreviousSummit(Point2D.Double aSummit) throws QueueReadException: renvoie le sommet précédant 'aSummit' dans le sens trigonométrique
Assez parlé, voici le code des différentes classes.
Si qqn est intéressé par ce package, qu'il me laisse son adresse e-mail et je le lui envoie.
------------------------ Classe SortException ---------------------------
package be.hacktrack.points;
/**
*
* @author HackTrack
* @version 1.0
*/
public class SortException extends java.lang.Exception {
public SortException() {
super("Minimum 3 points must be given to perform sort");
}
}
----------------------- Classe QueueInsertException -------------------
package be.hacktrack.points;
/**
*
* @author HackTrack
* @version 1.0
*/
public class QueueInsertException extends Exception{
/** Creates new QueueInsertException */
public QueueInsertException(String message) {
super(message);
}
}
------------------- Classe QueueReadException ------------------------
package be.hacktrack.points;
/**
*
* @author HackTrack
* @version 1.0
*/
public class QueueReadException extends java.lang.Exception {
public QueueReadException(String msg) {
super(msg);
}
}
----------------------- Classe CircularQueue ----------------------------
package be.hacktrack.points;
import java.util.*;
/**
*
* @author HackTrack
* @version 1.0
*/
public class CircularQueue{
private ArrayList queue;
private int currentIndex;
public CircularQueue() {
super();
queue = new ArrayList();
currentIndex = 0;
}
public Object getPrevious(Object o) throws QueueReadException{
int index = queue.indexOf(o);
if(index!=-1){
if(index==0){
return queue.get(queue.size()-1);
}else{
return queue.get(index--);
}
}else{
throw new QueueReadException("This Object is not in the queue");
}
}
public Object getPrevious(){
if(currentIndex==0){
currentIndex=queue.size()-1;
return queue.get(currentIndex);
}else{
currentIndex--;
return queue.get(currentIndex);
}
}
public Object getNext(Object o) throws QueueReadException{
int index = queue.indexOf(o);
if(index!=-1){
if(index==queue.size()-1){
return queue.get(0);
}else{
return queue.get(index++);
}
}else{
throw new QueueReadException("This Object is not in the queue");
}
}
public Object getNext(){
if(currentIndex==queue.size()-1){
currentIndex=0;
return queue.get(currentIndex);
}else{
currentIndex++;
return queue.get(currentIndex);
}
}
public void add(Object o){
queue.add(currentIndex,o);
}
public void insertBetween(Object newObject, Object o1, Object o2) throws QueueInsertException{
if(queue.contains(o1) && queue.contains(o2)){
int interval = queue.indexOf(o2)-queue.indexOf(o1);
if(interval==0){
throw new QueueInsertException("The two Object can't be the same");
}else if(interval==1){
queue.add(queue.indexOf(o2), newObject);
}else if(interval==-1){
queue.add(queue.indexOf(o1), newObject);
}else if(interval==queue.size()-1){
queue.add(newObject);
}else{
throw new QueueInsertException("The two Object must be contiguous");
}
}
}
public boolean remove(Object o){
return queue.remove(o);
}
public boolean contains(Object o){
return queue.contains(o);
}
public int size(){
return queue.size();
}
public String toString(){
StringBuffer s = new StringBuffer();;
Iterator it = queue.iterator();
s.append("CircularQueue" + "\n\r");
while(it.hasNext()){
s.append(it.next().toString()+"\n\r");
}
return s.toString();
}
}
-------------------------- Classe PointsArea ----------------------------
package be.hacktrack.points;
import java.awt.geom.Point2D;
import java.util.*;
/**
*
* @author HackTrack
* @version 1.0
*/
public class PointsArea {
private Point2D.Double[] pointsToSort;
private ArrayList pointsRemainingToSort;
private CircularQueue sortedPoints;
private Point2D.Double firstPoint;
private Point2D.Double lastPoint;
private double currentAngle;
public PointsArea(){
initialize();
}
public CircularQueue sortPoints(Point2D.Double[] pointsToSort) throws SortException{
if(pointsToSort.length<3)
throw new SortException();
currentAngle = 0;
//Storing points to sort
this.pointsToSort = pointsToSort;
for(int i=0 ; i<pointsToSort.length; i++){
pointsRemainingToSort.add(pointsToSort[i]);
}
//Find first point
firstPoint = getFirstPoint();
sortedPoints.add(firstPoint);
lastPoint = firstPoint;
//Find second point
pointsRemainingToSort.remove(firstPoint);
lastPoint = getNextPoint();
pointsRemainingToSort.add(firstPoint);
markAsSorted(lastPoint);
//Sorting all other points
while(true){
lastPoint = getNextPoint();
if(lastPoint==firstPoint){
break;
}else{
if(lastPoint==null)
break;
markAsSorted(lastPoint);
}
}
return sortedPoints;
}
public CircularQueue insertSummit(Point2D.Double newPoint, Point2D.Double p1, Point2D.Double p2) throws QueueReadException, QueueInsertException{
sortedPoints.insertBetween(newPoint, p1, p2);
pointsRemainingToSort.remove(newPoint);
return sortedPoints;
}
public boolean removeSummit(Point2D.Double summitToRemove){
pointsRemainingToSort.add(summitToRemove);
return sortedPoints.remove(summitToRemove);
}
public CircularQueue deleteSummit(Point2D.Double summitToDelete){
sortedPoints.remove(summitToDelete);
return sortedPoints;
}
public String toString(){
return sortedPoints.toString();
}
public List getUnsortedPoint(){
return pointsRemainingToSort;
}
public int summitCount(){
return sortedPoints.size();
}
public Point2D.Double getNextSummit(){
return (Point2D.Double)sortedPoints.getNext();
}
public Point2D.Double getNextSummit(Point2D.Double aSummit) throws QueueReadException{
return (Point2D.Double)sortedPoints.getNext(aSummit);
}
public Point2D.Double getPreviousSummit(){
return (Point2D.Double)sortedPoints.getPrevious();
}
public Point2D.Double getPreviousSummit(Point2D.Double aSummit) throws QueueReadException{
return (Point2D.Double)sortedPoints.getPrevious(aSummit);
}
/*
* Private methods
*/
private void initialize(){
pointsRemainingToSort = new ArrayList();;
sortedPoints = new CircularQueue();
lastPoint = null;
}
private Point2D.Double getNextPoint(){
Point2D.Double tempPoint = null;
Iterator it = pointsRemainingToSort.iterator();
double angle = 7;
while(it.hasNext()){
Point2D.Double aPointToSort = (Point2D.Double)it.next();
double tempAngle = calcAngle(lastPoint, aPointToSort);
if(tempAngle>currentAngle){
if(tempAngle<0){
tempAngle += Math.toRadians(360);
}
if(tempAngle==angle){
if(tempPoint==null){
angle = tempAngle;
tempPoint = aPointToSort;
}else{
if(lastPoint.distance(aPointToSort)>lastPoint.distance(tempPoint)){
angle = tempAngle;
tempPoint = aPointToSort;
}
}
}else if(tempAngle<angle){
angle = tempAngle;
tempPoint = aPointToSort;
}
currentAngle = angle;
}
}
return tempPoint;
}
private double calcAngle(Point2D.Double lastPoint, Point2D.Double aPointToSort){
double angle = 0;
double x1 = lastPoint.getX();
double y1 = lastPoint.getY();
double x2 = aPointToSort.getX();
double y2 = aPointToSort.getY();
double dx = x2-x1;
double dy = y2-y1;
if(dx==0){
if(dy==0){
//The two points are overlapping => discard aPointToSort -> pointsRemainingToSort
pointsRemainingToSort.remove(aPointToSort);
}else{
//The two points have same abcisse
if(dx>0){
angle = Math.toRadians(90);
}else{
angle = Math.toRadians(270);
}
}
}else if(dy==0){
//The two points have same ordonnée
if(dy>0){
angle = java.lang.Math.toRadians(0);
}else{
angle = java.lang.Math.toRadians(180);
}
}else{
//The two points have different abcisse and different ordonnée
angle = java.lang.Math.atan(dy/dx);
if(dx<0){
angle += java.lang.Math.toRadians(180);
}
}
return angle;
}
private void markAsSorted(Point2D.Double aPoint){
sortedPoints.add(aPoint);
pointsRemainingToSort.remove(aPoint);
}
private Point2D.Double getFirstPoint(){
firstPoint = pointsToSort[0];
for(int i=1 ; i<pointsToSort.length ; i++){
if(pointsToSort[i].getY()==firstPoint.getY()){
if(pointsToSort[i].getX()<firstPoint.getX()){
firstPoint = pointsToSort[i];
}
}else if(pointsToSort[i].getX()>firstPoint.getX()){
firstPoint = pointsToSort[i];
}
}
return firstPoint;
}
}
------------------------ Classe PointsAreaTester -----------------------
package be.hacktrack.points;
import java.util.*;
import java.awt.geom.Point2D;
/**
*
* @author HackTrack
* @version 1.0
*/
public class PointsAreaTester {
public PointsAreaTester() {
}
public static void main(String args[]) {
Point2D.Double[] pointsToSort = new Point2D.Double[10];
pointsToSort[0] = new Point2D.Double(7,10);
pointsToSort[1] = new Point2D.Double(3,9);
pointsToSort[2] = new Point2D.Double(9,7);
pointsToSort[3] = new Point2D.Double(2,5);
pointsToSort[4] = new Point2D.Double(5,6);
pointsToSort[5] = new Point2D.Double(11,5);
pointsToSort[6] = new Point2D.Double(5,4);
pointsToSort[7] = new Point2D.Double(8,4);
pointsToSort[8] = new Point2D.Double(2,2);
pointsToSort[9] = new Point2D.Double(9,2);
PointsArea area = new PointsArea();
try{
CircularQueue sortedPoints = area.sortPoints(pointsToSort);
System.out.println(sortedPoints.toString());
area.insertSummit(pointsToSort[4], pointsToSort[1], pointsToSort[0]);
System.out.println(sortedPoints.toString());
area.insertSummit(pointsToSort[7], pointsToSort[4], pointsToSort[1]);
System.out.println(sortedPoints.toString());
area.removeSummit( pointsToSort[4]);
System.out.println(sortedPoints.toString());
}catch(QueueReadException qre){
qre.printStackTrace();
}catch(QueueInsertException qie){
qie.printStackTrace();
}catch(SortException se){
se.printStackTrace();
}
}
}
Et voilà, mon cher André, une réponse concrète à la proposition que tu avais formulée ici même.
Le package peut, bien sûr, être amélioré. Si d'aventure qqn s'y attachait, qu'il me fass parvenir son code via CCM.
J'espère que cela pourra vous servir.
A+
;-)
HackTrack
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 793
23 juil. 2002 à 09:15
23 juil. 2002 à 09:15
Pas grave, je suis sur que c'est interessant :-DDD
*,*
\_/
*,*
\_/
merci Hardtrack de ta précieuse réponse .
désolé d'abord de cette rupture de dialogue puisque j'étais en vacance. j'ai vu le dernier programme que t'as écrit mais j'arrive pas à le faire tourner .je pense que la méthode se base sur la sélection des angles ) mais j'arrive pas à trouver le bon enchainement de programme.
je sais pas si andré a réussi de le faire tourner si c'est oui il a pris quoi comme donné (points ordonné ou pas ).je pense que le premier probléme était d'ordonner les points moi j'ai réussi à les ordonner
j'attend plus d'explication si c'est possible
mereci d'avance
désolé d'abord de cette rupture de dialogue puisque j'étais en vacance. j'ai vu le dernier programme que t'as écrit mais j'arrive pas à le faire tourner .je pense que la méthode se base sur la sélection des angles ) mais j'arrive pas à trouver le bon enchainement de programme.
je sais pas si andré a réussi de le faire tourner si c'est oui il a pris quoi comme donné (points ordonné ou pas ).je pense que le premier probléme était d'ordonner les points moi j'ai réussi à les ordonner
j'attend plus d'explication si c'est possible
mereci d'avance