Я придумал это простое решение, я не обращал внимания на производительность, потому что мне нужно, чтобы оно было простым.
Я создал класс с объектами Path и PathMeasure, mapPath - этоэкземпляр этого класса.Я взял координаты x и y из touchEvent и передал их в качестве параметров своей функции.
Я использую простую функцию для вычисления расстояния между двумя векторами, моими пикселями на пути и вектором, полученным из touchEvent.
Итерация, пока я не получу минимальное расстояние между ними.
Когда я получаю координаты x и y моего пути, где мне нужно разместить свой объект, я просто переводю объект в эти координаты.
Это так просто, но немного грязно :) Надеюсь, кто-нибудь может использовать его когда-нибудь, в час нужды.Ура;)
//Find point on path closest to touch coordinates
public float[] findMinDistanceVector(int x, int y) {
float[] xy = new float[2];
float[] ten = new float[2];
float distanceVectorOld = Float.MAX_VALUE;
float distanceVectorNew = 0;
float[] minXY = new float[2];
for (float distance = 0; distance < mapPath.pathMeasure.getLength();distance++) {
mapPath.pathMeasure.getPosTan(distance, xy, ten);
distanceVectorNew = dist(x, y, xy[0], xy[1]);
if (distanceVectorNew < distanceVectorOld) {
minXY[0] = xy[0];
minXY[1] = xy[1];
distanceVectorOld = distanceVectorNew;
}
}
return minXY;
}
public float dist(float x1, float y1, float x2, float y2) {
float distX = x1 - x2;
float distY = y1 - y2;
// Pythagora's theorem
return FloatMath.sqrt(distX * distX + distY * distY);
}