2012-07-30 3 views
0

J'ai actuellement quelques formes de polygones comme indiqué ci-dessous qui est en cours d'élaboration sur mon MapView avec le code suivantAndroid Trouver l'intersection du polygone?

enter image description here

CustomPolygon customPolygon= data.getCustomPolygonList().get(i); 
      Path path = new Path(); 
      path.setFillType(Path.FillType.EVEN_ODD); 
      for(int n=0;n<customPolygon.getCorrdinateList().size();n++) 
      { 

       GeoPoint sector1 = new GeoPoint((int)(customPolygon.getCorrdinateList().get(n).getLatitude()*1e6), (int)((customPolygon.getCorrdinateList().get(n).getLongitude())*1e6)); 
       if(n==0){ 
        mapView.getProjection().toPixels(sector1, point1_draw); 
        path.moveTo(point1_draw.x,point1_draw.y); 
       }else 
       { 
        mapView.getProjection().toPixels(sector1, point1_draw); 
        path.lineTo(point1_draw.x,point1_draw.y); 
       } 
      } 

      path.close(); 
      canvas.drawPath(path, paint); 

En ce moment je suis figurant sur comment puis-je savoir si le ONTAP le bouton coupe l'un des polygones. Par exemple, s'il croise l'un des polygones, un message affichera le polygone actuel.

Je suis bloqué à la partie ontap pour la superposition.

@Override 
public boolean onTap(GeoPoint p, MapView) { 



     Point point1_draw = new Point();  
     mapView.getProjection().toPixels(p, point1_draw); 


     for (int i =0;i<data.getCustomPolygonList().size();i++) 
     { 
      CustomPolygon customPolygon= data.getCustomPolygonList().get(i); 
      for(int n=0;n<customPolygon.getCorrdinateList().size();n++) 
      { 
      } 

     } 

    return true; 
} 
+0

Vous avez un type: 'getCorrdinateList' devrait être' getCoordinateList'. Pour le réparer, cliquez dessus et appuyez sur Ctrl-Maj-R dans la plupart des EDI. –

+0

oh typo, c'est une classe personnalisée pour stocker le polygone coordiner – ericlee

Répondre

1

Je suppose que vous avez besoin de code pour vérifier si le bouton est à l'intérieur d'un polygone droit?

Je ne peux pas vous donner le code en ce moment, mais voici un algorithme approximatif:

for each line segment in the polygon 
    calculate the dot product for the line segment and the line formed by the starting vertex and the point to check 
    if all dot products have the same sign, the point is inside the polygon 

Notez que pour que cela fonctionne, vous devez le polygone d'avoir un enroulement en continu, à savoir tous les sommets sont soit ajoutés dans le sens horaire ou antihoraire. De plus, cette approche peut ne pas toujours fonctionner pour les polygones concaves. Ainsi, vous pourriez vouloir diviser des polygones concaves en une série de polygones convexes.

Pour plus général (mais aussi plus coûteux) algorithmes ont un regard sur cette page wiki: http://en.wikipedia.org/wiki/Point_in_polygon

Une autre source d'information (avec un code): How can I determine whether a 2D Point is within a Polygon?

+0

ceci est vrai seulement pour les polygones convexes. –

+0

@MarekR, avez-vous vu mes notes? En outre, cette approche peut ne pas toujours fonctionner pour les polygones concaves - cela peut fonctionner pour certains points et ne pas fonctionner pour d'autres. – Thomas

+0

ouais je n'ai pas tout lu. Désolé pour ça. De toute façon votre algorithme est faux car il ne devrait pas être un produit scalaire mais un produit croisé! –

0

Je suis surpris que android. graphics.Path et android.graphics.PathMeasure ne fournit pas d'API pour cela. Cela devrait. L'algotithme est described here.

Questions connexes