Android: Как проверить, содержит ли путь троянную точку?
Я попытался бы разработать приложение, в котором я могу составить планметрию. Таким образом, каждая комната имеет свой собственный идентификатор или имя, и, если я касаюсь комнаты, я хочу показать Toast Message с этим ID или именем. Проблема в том, как проверить, если и какой путь тронут!
Я видел много дискуссий по темам, которые говорили об этой проблеме. Кто-то говорит использовать метод getBounds, а после, содержит метод проверки, если затронутая точка находится в Rect. Но, я думаю, метод getBounds возвращает наименьшее Rect, содержащее путь, правильно?
Таким образом, номера имеют разные пользовательские геометрические формы, и по этой причине, если я получу границы около двух закрытых комнат, метод может вернуть общий набор точек. Плохо! В каждом номере есть только их площадь. Как я могу решить эту проблему?
В iOS я мог бы использовать метод PathContainsPoint, но, к сожалению, Android Path не имеет чего-то подобного.
Я надеюсь, что кто-то может мне помочь
спасибо заранее
Ответы
Ответ 1
Хорошо, я решил свою проблему. Я отправляю код примера:
Path p;
Region r;
@Override
public void onDraw(Canvas canvas) {
p = new Path();
p.moveTo(50, 50);
p.lineTo(100, 50);
p.lineTo(100, 100);
p.lineTo(80, 100);
p.close();
canvas.drawPath(p, paint);
RectF rectF = new RectF();
p.computeBounds(rectF, true);
r = new Region();
r.setPath(p, new Region((int) rectF.left, (int) rectF.top, (int) rectF.right, (int) rectF.bottom));
}
public boolean onTouch(View view, MotionEvent event) {
Point point = new Point();
point.x = event.getX();
point.y = event.getY();
points.add(point);
invalidate();
Log.d(TAG, "point: " + point);
if(r.contains((int)point.x,(int) point.y))
Log.d(TAG, "Touch IN");
else
Log.d(TAG, "Touch OUT");
return true;
}
Ответ 2
Вот мысль: создайте новый путь, который является крошечным квадратом вокруг точки, которая была затронута, а затем пересечь этот путь с вашим пути, который нужно протестировать, используя path.op() и посмотреть, не является ли результат пустым.
Ответ 3
Как говорит Эдвард Фальк, лучший способ - использовать path.op(), потому что Region является квадратным. И одна точка может быть в 2 или 3 регионах. Например: введите здесь описание изображения. Все регионы будут содержать синюю точку, но на самом деле только точка4 содержит эту точку.
int x, y;
Path tempPath = new Path(); // Create temp Path
tempPath.moveTo(x,y); // Move cursor to point
RectF rectangle = new RectF(x-1, y-1, x+1, y+1); // create rectangle with size 2xp
tempPath.addRect(rectangle, Path.Direction.CW); // add rect to temp path
tempPath.op(pathToDetect, Path.Op.DIFFERENCE); // get difference with our PathToCheck
if (tempPath.isEmpty()) // if out path cover temp path we get empty path in result
{
Log.d(TAG, "Path contains this point");
return true;
}
else
{
Log.d(TAG, "Path don't contains this point");
return false;
}