Tester si un point est présent dans un polygone
Salut à tous,
Je cherche à implémenter une fonction ayant pour but de tester la présence d'un point à l'intérieur d'un polygone.
Le point est défini par une latitude et une longitude.
Exemple : -15.8933; 67,4433
Le polygone quand à lui est défini par toute une série de points définis comme ci-dessus.
Si quelqu'un a une idée de comment procéder ?
Merci d'avance.
Exemple d'utilisation de GeneralPath ou Path2D
Salut à tous et merci pour vos réponses...
Effectivement, les coordonnées de mon Polygone sont des latitudes et longitudes sous forme décimale. Donc, apparemment la classe Polygon ne convient pas à mes besoins mais j'ai tout de même créé ma propre classe Polygone :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class Polygone extends Polygon{
private Vector vecteurPoints;
/** Creates a new instance of Polygone */
public Polygone() {
vecteurPoints = new Vector();
}
public void addPoint(Point2D unPoint){
vecteurPoints.addElement(unPoint);
}
} |
Ensuite, j'essaie d'utiliser une fonction VerifPosicion() faisant appel à la méthode Contains de Polygon mais sans succès...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| //Verifie qu'une position ne se situe pas dans la liste des polygones
public int verifPosicion(String uneLatitude, String uneLongitude, Vector listePolygones){
System.out.println("lat " + uneLatitude);
System.out.println("long " + uneLongitude);
Point2D unPoint = new Point2D.Double(Double.parseDouble(uneLatitude), Double.parseDouble(uneLongitude));
//Parcours de la liste des polygones
for(int i = 0; i < listePolygones.size(); i++){
Polygone tempPoly = (Polygone)listePolygones.get(i);
if (tempPoly.contains(unPoint)){
return 1;
}
}
return 0;
} |
Est-ce un comportement normal ? A priori oui...
Dois-je utiliser plutôt un GeneralPath et si oui est-ce que quelqu'un pourrait me fournir un exemple de fonction permettant de tester la présence d'un point dans une liste de polygones ?
Merci d'avance...
GeneralPath --> problème de Java Heap Space !
Alors voici le code testé :
Code:
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
| public class Polygone implements Shape {
/** List of points.
* For convenience only, we should be able to get them out of the PathIterator of the delegated path.
*/
private List<Point2D> pointList;
/** Delegated path.
*/
private GeneralPath delegated;
/** Creates a new instance.
*/
public Polygone() {
pointList = new LinkedList<Point2D>();
delegated = new GeneralPath();
}
/** Add some more point to the polygon.
* @param points Points to be added.
*/
public void addPoint(List<Point2D> points){
// Add to convenient list.
for (Point2D p : points) {
pointList.add(p);
}
// Reset path.
delegated.reset();
// Re-create shape.
Iterator<Point2D> it = pointList.iterator();
Point2D p = it.next();
delegated.moveTo((float)p.getX(), (float)p.getY());
while (it.hasNext()) {
p = it.next();
delegated.lineTo((float)p.getX(), (float)p.getY());
}
delegated.closePath();
}
// Pour toutes les autres methodes de l'interface Shape, deleger a delegated.
// ex:
/** {@inheritDoc}
*/
public boolean contains(Point2D p) {
return delegated.contains(p);
} |
Et le message d'erreur obtenu :
Code:
1 2 3 4 5
| Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2906)
at java.awt.geom.Path2D$Float.needRoom(Path2D.java:283)
at java.awt.geom.Path2D$Float.lineTo(Path2D.java:354)
at utilitaires.Polygone.addPoint(Polygone.java:63) |
Je précise que je manipule 15 000 points.
Comment faire pour augmenter la mémoire allouée par NetBeans ?
problème de java heap space
j'ai changé Double en Float et mis -Xmx512m en paramètre de JVM...
sans succès...
j'essaie d'externaliser le processus en lançant un script Matlab mais ce n'est pas encore au point...
je sèche...