2016-11-23 6 views
0

У меня есть массив из 4 PointF объектов. Каждая точка в этом массиве представляет собой Угол прямоугольника. Теперь я хочу установить точки в этом массиве в определенном порядке в зависимости от их местоположения. например PointF[0] должна быть точка, и PointF[1] верхнее-левое bottomleft (и так далее в направлении по часовой стрелке).Обнаружение местоположения известных точек в прямоугольнике

Я попытался проверить координаты, например. если координаты точек x и y являются самыми низкими из каждой точки в массиве, она является топиковой (Система координат изображения). И если каждая координата является самой большой, это самая лучшая точка.

Проблема с этим решением заключается в том, что возможно, что точки в этом массиве могут также представлять собой параллелограмм или трапецию, что угол между углами не должен быть 90 градусов.

Вот изображение, где я пытаюсь представить себе, что я хочу добиться:

Example

+0

Подумайте о линиях между точками в виде полиномиальных функций в формате '' y (x) = m * x + b''. '' m'' и '' b'' могут быть рассчитаны по координатам вашего '' PointF''. Это должно заставить вас начать. – f1sh

+0

Я не знаю, правильно ли я понимаю вас, но я думаю, вы имеете в виду, что с помощью 'b', например, я мог бы определить, является ли точка верхним или нижним углом? И с помощью 'm' я мог бы определить, осталось ли это или нет, если это так, то какое значение имеет' m'if, если точка является правильным углом? –

ответ

0

я нашел хорошее решение, которое подходит для моей проблемы.

Сначала я пытаюсь определить верхний левый угол и нижний правый угол прямоугольника. Для этого я вычисляю длину двумерного вектора из источника системы координат. Самый короткий из 4 векторов будет верхний левый угол и самый большой нижний правый угол. В двух других точках я пытаюсь обнаружить через простую координатную проверку с двумя известными точками. Чтобы избежать небольшой ошибки, где верхний правый угол будет проходить через ту же проверку, что и нижний левый, я сортирую точки через их координаты x.

Вот код:

private PointF[] checkPointLocation(PointF[] points){ 

    double minLength = 100000000; 
    double maxLength = 0; 
    int minPos = 0; 
    int maxPos = 0; 

    for(int i = 0; i < points.length; i++){ 
     double vLength = Math.abs(Math.sqrt((points[i].x * points[i].x) + (points[i].y * points[i].y))); 

     if(vLength < minLength) { 
      minLength = vLength; 
      minPos = i; 
     } 
     if(vLength > maxLength) { 
      maxLength = vLength; 
      maxPos = i; 
     } 
    } 

    PointF topLeft = points[minPos]; 
    PointF bottomRight = points[maxPos]; 

    Log.d(TAG, "TopLeft: " + topLeft); 
    Log.d(TAG, "BottomRight: " + bottomRight); 

    PointF topRight = null; 
    PointF bottomLeft = null; 

    Arrays.sort(points, (o1, o2) -> Float.compare(o1.x, o2.x)); 

    for(int i = 0; i < points.length; i++){ 
     PointF p = points[i]; 
     Log.d(TAG, "Point: " + p); 

     if(p.equals(topLeft) || p.equals(bottomRight)) 
      continue; 

     if(bottomLeft == null && p.x < bottomRight.x && p.y > topLeft.y) 
      bottomLeft = p; 

     if(topRight == null && p.x > topLeft.x && p.y < bottomRight.y) 
      topRight = p; 
    } 

    if(topRight == null){ 
     throw new NullPointerException("topRight is null"); 
    } 
    if(bottomLeft == null){ 
     throw new NullPointerException("BottomLeft is null"); 
    } 

    Log.d(TAG, "BottomLeft = " + bottomLeft); 
    Log.d(TAG, "TopRight = " + topRight); 

    PointF[] ccwPoints = {topLeft, bottomLeft, bottomRight, topRight}; 

    return ccwPoints; 
} 

В моем случае, это решение было верно во всех возможных пользовательских входах.