Comment puis-je savoir si un chemin fermé contient un point donné ?

? Tom Seago @ | Original: StackOverFlow

Dans Android, je ai un objet Path qui je sais définit un chemin fermé, et je ai besoin de comprendre si un point donné est contenu dans le chemin . Ce que je espérais était quelque chose le long des lignes de

path.contains ( int x, int y )

mais cela ne semble pas exister .

La raison précise que je cherche ce est parce que je ai une collection de formes sur l'écran définis comme des chemins, et je veux savoir laquelle l'utilisateur a cliqué sur . Se il ya une meilleure façon d' être de cette approche comme l'utilisation de différents éléments de l'interface utilisateur, plutôt que de le faire " à la dure " moi, je suis ouvert aux suggestions .

Je suis ouvert à l'écriture d'un algorithme moi-même si je dois, mais cela signifie que différentes recherches, je suppose.

Top 5 Répondre

1Brian @

La classe «____» n'a pas une telle méthode . La classe Canvas ne ont une zone de découpage qui peut être réglé sur un chemin, il n'y a pas moyen de le tester sur un point . Vous pourriez essayer Canvas.quickReject, tester contre un seul rectangle de point (ou un 1x1 android.graphics.Path ) . Je ne sais pas si ce serait vraiment vérifier contre le chemin ou tout simplement le rectangle englobant, si .

La classe Région clairement que garde la trace du rectangle contenant .

Vous pourriez envisager d'élaborer chacune de vos régions dans une couche alpha Bitmap 8 - bits avec chaque Rect rempli dans sa propre valeur ' de couleur ' ( assurez-vous que l'anti-aliasing est désactivé dans votre «____» ) . Cela crée une sorte de masque pour chaque chemin rempli d'un index pour le chemin qui l'a rempli . Ensuite, vous pouvez simplement utiliser la valeur de pixel comme un indice dans votre liste de chemins .

Path

Ensuite, regardez des points ,

Paint

Soyez sûr de vérifier pour 255 ( pas de chemin ) se il ya des points en carnet .

2Randy Findley @

Voici ce que je ai fait et il semble fonctionner :

Bitmap lookup = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);
//do this so that regions outside any path have a default
//path index of 255
lookup.eraseColor(0xFF000000);

Canvas canvas = new Canvas(lookup);
Paint paint = new Paint();

//these are defaults, you only need them if reusing a Paint
paint.setAntiAlias(false);
paint.setStyle(Paint.Style.FILL);

for(int i=0;i<paths.size();i++)
    {
    paint.setColor(i<<24); // use only alpha value for color 0xXX000000
    canvas.drawPath(paths.get(i), paint); 
    }

Maintenant, vous pouvez utiliser les region.contians ( x y ) méthode .

int pathIndex = lookup.getPixel(x, y);
pathIndex >>>= 24;

** Mise à jour sur 6/7/2010 ** La méthode de region.setPath fera mon application crash ( aucun message d'avertissement ) si le rectF est trop grand . Voici ma solution :

RectF rectF = new RectF();
path.computeBounds(rectF, true);
region = new Region();
region.setPath(path, new Region((int) rectF.left, (int) rectF.top, (int) rectF.right, (int) rectF.bottom));
3Jesse Wilson @

Http://www.opensource.apple.com/source/WebCore/WebCore-658.28/platform/graphics/skia/SkiaUtils.cpp de WebKit a un C ++ de contournement pour le bug de Randy Findley :

Point point = new Point();
mapView.getProjection().toPixels(geoPoint, point);

if (region.contains(point.x, point.y)) {
  // Within the path.
}
4Cal Hinshaw @

Je sais que je suis un peu en retard à la fête, mais je résoudre ce problème en y pensant, comme déterminer si oui ou non un point est dans un polygone .

http://en.wikipedia.org/wiki/Point_in_polygon

Le calcul calcule plus lentement lorsque vous êtes à la recherche au lieu de courbes de Bézier segments de ligne, mais tirant un rayon du point fonctionne toujours.