How can I group an array of rectangles into “Islands” of connected regions?

前端 未结 8 2039
难免孤独
难免孤独 2021-02-04 08:12

The problem

I have an array of java.awt.Rectangles. For those who are not familiar with this class, the important piece of information is that they provid

8条回答
  •  闹比i
    闹比i (楼主)
    2021-02-04 08:48

    This is the solution I went for in the end. Can anyone take a guess to its efficiency?

    package java.util;

    import java.awt.Rectangle;
    import java.util.ArrayList;
    import java.util.List;
    
    public class RectGroup extends ArrayList implements List
    {
        public RectGroup(Rectangle... rects)
        {
                super(rects);
        }
    
        public RectGroup()
        {
            super();
        }
    
        public boolean intersects(Rectangle rect)
        {
            for(Rectangle r : this)
                if(rect.intersects(r))
                    return true;
    
            return false;
        }
    
        public List getDistinctGroups()
        {
            List groups = new ArrayList();
            // Create a list of groups to hold grouped rectangles.
    
            for(Rectangle newRect : this)
            {
                List newGroupings = new ArrayList();
                // Create a list of groups that the current rectangle intersects.
    
                for(RectGroup group : groups)
                    if(group.intersects(newRect))
                        newGroupings.add(group);
                // Find all intersecting groups
    
                RectGroup newGroup = new RectGroup(newRect);
                // Create a new group
    
                for(List oldGroup : newGroupings)
                {
                    groups.remove(oldGroup);
                    newGroup.addAll(oldGroup);
                }
                // And merge all the intersecting groups into it
    
                groups.add(newGroup);
                // Add it to the original list of groups
            }
            return groups;
        }
    }
    

提交回复
热议问题