def _cells_to_rects(self, cells): """ Converts the extents of a list of cell grid coordinates (i,j) into a list of rect tuples (x,y,w,h). The set should be disjoint, but may or may not be minimal. """ # Since this function is generally used to generate clipping regions # or other screen-related graphics, we should try to return large # rectangular blocks if possible. # For now, we just look for horizontal runs and return those. cells = array(cells) y_sorted = sort_points(cells, index=1) # sort acoording to row rownums = sort(array(tuple(set(cells[:,1])))) row_start_indices = searchsorted(y_sorted[:,1], rownums) row_end_indices = left_shift(row_start_indices, len(cells)) rects = [] for rownum, start, end in zip(rownums, row_start_indices, row_end_indices): # y_sorted is sorted by the J (row) coordinate, so after we # extract the column indices, we need to sort them before # passing them to find_runs(). grid_column_indices = sort(y_sorted[start:end][:,0]) #pdb.set_trace() #print grid_column_indices.shape for span in find_runs(grid_column_indices): x = self._cell_lefts[span[0]] y = self._cell_bottoms[rownum] w = (span[-1] - span[0] + 1) * self._cell_extents[0] h = self._cell_extents[1] rects.append((x,y,w,h)) return rects
def _cells_to_rects(self, cells): """ Converts the extents of a list of cell grid coordinates (i,j) into a list of rect tuples (x,y,w,h). The set should be disjoint, but may or may not be minimal. """ # Since this function is generally used to generate clipping regions # or other screen-related graphics, we should try to return large # rectangular blocks if possible. # For now, we just look for horizontal runs and return those. cells = array(cells) y_sorted = sort_points(cells, index=1) # sort acoording to row rownums = sort(array(tuple(set(cells[:, 1])))) row_start_indices = searchsorted(y_sorted[:, 1], rownums) row_end_indices = left_shift(row_start_indices, len(cells)) rects = [] for rownum, start, end in zip(rownums, row_start_indices, row_end_indices): # y_sorted is sorted by the J (row) coordinate, so after we # extract the column indices, we need to sort them before # passing them to find_runs(). grid_column_indices = sort(y_sorted[start:end][:, 0]) #pdb.set_trace() #print grid_column_indices.shape for span in find_runs(grid_column_indices): x = self._cell_lefts[span[0]] y = self._cell_bottoms[rownum] w = (span[-1] - span[0] + 1) * self._cell_extents[0] h = self._cell_extents[1] rects.append((x, y, w, h)) return rects
def arg_find_runs(int_array, order='ascending'): """ This function is like find_runs(), but it returns a list of tuples indicating the start and end indices of runs in the input *int_array*. """ if len(int_array) == 0: return [] assert len(int_array.shape)==1, "find_runs() requires a 1D integer array." if order == 'ascending': increment = 1 elif order == 'descending': increment = -1 else: increment = 0 rshifted = right_shift(int_array, int_array[0]-increment) start_indices = concatenate([[0], nonzero(int_array - (rshifted+increment))[0]]) end_indices = left_shift(start_indices, len(int_array)) return zip(start_indices, end_indices)