2015-07-16 2 views
0

ImageРаспаковка Силуэты Координаты

Из образа я разместил там, у меня есть все координаты из этих прямоугольников в рисунке C, сохраненных в массиве класса рис.

Рисунок:

public abstract class Figure { 

    private int left, right, height; 
    protected Coordinates[] coords; 

    public Figure() { 

    } 

    public Figure(int left, int right, int height, Coordinates[] coords) { 

     this.left = left; 
     this.right = right; 
     this.height = height; 
     this.coords = coords; 
    } 

    public int getRight() { 
     return right; 
    } 

    public int getLeft() { 
     return left; 
    } 

    public int getHeight() { 
     return height; 
    } 

    public Coordinates[] getCoords() { 
     return coords; 
    } 

    public abstract void setCoordinates(); 

    public abstract void showCoordinates(); 
} 

Координаты:

public class Coordinates { 

    private float x, y; 

    public Coordinates() { 

    } 

    public Coordinates(float x, float y) { 
     this.x = x; 
     this.y = y; 
    } 

    public float getX() { 
     return x; 
    } 

    public float getY() { 
     return y; 
    } 
} 

Дело в том, что я должен найти координаты силуэта от всего графа так, как это на рисунке D (see the image), используя координаты из уже упомянутого массива.

Пример (см эталонное изображение):

1st Rectangle Coordinates are: (1,0)(1,11)(5,11)(5,0) 
2nd Rectangle Coordinates are: (2,0)(2,6)(7,6)(7,0) 
3rd Rectangle Coordinates are: (3,0)(3,13)(9,13)(9,0) 
4th Rectangle Coordinates are: (12,0)(12,7)(16,7)(7,0) 
5th Rectangle Coordinates are: (14,0)(14,3)(25,3)(25,0) 
6th Rectangle Coordinates are: (19,0)(19,18)(22,18)(22,0) 
7th Rectangle Coordinates are: (23,0)(23,13)(29,13)(29,0) 
8th Rectangle Coordinates are: (24,0)(24,4)(28,4)(28,0) 


The Coordinates of the Silhouettes from all those rectangles should be: 
(1,11)(3,13)(9,0)(12,7)(16,3)(19,18)(22,3)(23,13)(29,0) 
This is where I'm stuck thinking how I'll get these coordinates. 

Я не прошу кого-то, чтобы сделать это для меня или что-то в этом роде, я просто хочу думать, откуда начать дело все, что я пытался до сих пор не удалось, поэтому любые советы или идеи пригодится! Огромное спасибо заранее! Спокойной ночи.

ответ

0

Похоже, вы пытаетесь получить объединение каждого кластера перекрывающихся прямоугольников. Класс Java java.awt.geom.Rectangle имеет метод createUnion(Rectangle2D), который «поглотит» второй прямоугольник в первый (через «объединение»). Однако это не решает проблему кластеризации.

Если количество прямоугольников, которые вы пытаетесь обработать, относительно невелико, и кластеризация необходима только в одном измерении (то есть по горизонтали), самым прямым способом было бы сохранить список прямоугольников, которые еще не были кластеризовать, прокручивать каждый неклассифицированный прямоугольник, удалять первый прямоугольник в свой собственный новый «кластер», а затем выполнять пересечение со всеми другими неклассифицированными прямоугольниками, чтобы определить, должна ли пара кластеризоваться. Для этого подходит метод java.awt.geom.Rectangle2D.intersects(Rectangle). Если они пересекаются, то пересекающийся прямоугольник должен быть удален из списка неклассифицированных прямоугольников и добавлен в текущий кластер.

Класс Rectangle2D не совсем соответствует вашему хранению координат, но сопоставление будет достаточно простым.

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