Как я могу сказать, содержит ли замкнутый путь данную точку?

В Android у меня есть Объект контуров, который я, оказывается, знаю, определяет замкнутый путь, и я должен выяснить, содержится ли данная точка в пути. То, на что я надеялся, было чем-то вроде

path.contains (интервал x, интервал y)

но это, кажется, не существует.

Определенная причина я ищу это, состоит в том, потому что у меня есть набор форм на экране, определенном как пути, и я хочу выяснить, на какой пользователь нажал. Если существует лучший способ приблизиться к этому, такому как использование различных элементов UI вместо того, чтобы делать его "твердый путь" самостоятельно, я открыт для предложений.

Я открыт для записи алгоритма сам, если я имею к, но это означает другое исследование, которое я предполагаю.

12
задан Tom Seago 8 April 2010 в 04:33
поделиться

2 ответа

Класс android.graphics.Path не имеет такого метода. У класса Canvas есть область отсечения, которая может быть установлена ​​на путь, нет возможности проверить ее относительно точки. Вы можете попробовать Canvas.quickReject, протестировав одноточечный прямоугольник (или 1x1 Rect ). Я не знаю, действительно ли это будет проверять путь или только ограничивающий прямоугольник.

Очевидно, что класс Region отслеживает только содержащий его прямоугольник.

Вы можете рассмотреть возможность рисования каждой из ваших областей в 8-битном растровом изображении альфа-слоя с каждым Path , заполненным собственным значением «цвета» (убедитесь, что сглаживание отключено в вашем Краска ). Это создает своего рода маску для каждого пути, заполненного индексом пути, который его заполнил. Тогда вы можете просто использовать значение пикселя в качестве индекса в вашем списке путей.

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); 
    }

Затем найдите точки,

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

Не забудьте проверить 255 (нет пути), если есть незаполненные точки.

6
ответ дан 2 December 2019 в 05:15
поделиться

Вот что я сделал и, кажется, это работает:

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));

Теперь вы можете использовать метод region.contains(x,y).

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

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

** Обновление от 6/7/2010 **. Метод region.setPath приводит к аварийному завершению работы моего приложения (без предупреждающего сообщения), если rectF слишком велик. Вот мое решение:

// Get the screen rect.  If this intersects with the path's rect
// then lets display this zone.  The rectF will become the 
// intersection of the two rects.  This will decrease the size therefor no more crashes.
Rect drawableRect = new Rect();
mapView.getDrawingRect(drawableRect);

if (rectF.intersects(drawableRect.left, drawableRect.top, drawableRect.right, drawableRect.bottom)) {
   // ... Display Zone.
}
18
ответ дан 2 December 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: