コード例 #1
0
void algorithms::KDDecomposer<IROBOT>::build_edges(bool clear_nodes)
{
    all_boundaries.clear();
    std::vector<CONFIG> all_corners;
    std::vector<const CONFIG*> corner_configs;
    all_corners.reserve(1000000);
    corner_configs.reserve(200000);
    get_unique_crn_cfgs(corner_configs, all_corners);
    
    std::clock_t    t0 = std::clock();
    all_boundaries.reserve(300000);
    // Build all boundaries
    std::vector<int> containing_cells;
    for (const CONFIG* cfg : corner_configs) {
        containing_cells.clear();
        ContainedCells(cfg->vector(), containing_cells);
        if(containing_cells.size() == 0)
            continue;
        for (int i = 0; i < containing_cells.size() - 1; ++i) {
            for (int j = i + 1; j < containing_cells.size(); ++j) {
                if (is_adjacent(containing_cells[i], containing_cells[j]))
                    continue;
                int fix_dim = compute_fix_dim(containing_cells[i], containing_cells[j]);
                // If the fixed dimension is not one, then it is degenerate case
                if (fix_dim == -1)
                    continue;
                int boundary_index = get_new_boundary(containing_cells[i], containing_cells[j]);
                cells[containing_cells[i]].add_boundary(boundary_index);
                cells[containing_cells[j]].add_boundary(boundary_index);
                double weight = IROBOT::heuristic(robot_, CONFIG(cells[containing_cells[i]].center()), CONFIG(cells[containing_cells[j]].center()));
                all_boundaries[boundary_index].set_weight(weight);
                all_boundaries[boundary_index].set_fix_dim(fix_dim);
            }
        }
    }
    for (int i = 0; i < all_boundaries.size(); ++i) {
        compute_bound(i);
    }

    
    std::clock_t    t2 = std::clock();
    all_boundaries.shrink_to_fit();
    if(clear_nodes) nodes.clear();
    nodes.shrink_to_fit();
    for (Cell<IROBOT>& cell : cells)
        cell.shrink_to_fit();
    std::clock_t    t3 = std::clock();
}
コード例 #2
0
	void canvas::get_bound(rect* bound)
	{
		compute_bound(bound);
	}