void TilerEngine::remove_duplicated_vertices(WireNetwork& wire_network, Float tol) { const size_t num_input_vertices = wire_network.get_num_vertices(); DuplicatedVertexRemoval remover(wire_network.get_vertices(), wire_network.get_edges()); remover.run(tol); MatrixFr vertices = remover.get_vertices(); MatrixIr edges = remover.get_faces(); VectorI index_map = remover.get_index_map(); assert(num_input_vertices == index_map.size()); wire_network.set_vertices(vertices); wire_network.set_edges(edges); const size_t num_output_vertices = wire_network.get_num_vertices(); std::vector<std::string> attr_names = wire_network.get_attribute_names(); for (auto itr : attr_names) { const std::string& name = itr; if (wire_network.is_vertex_attribute(name)) { MatrixFr values = wire_network.get_attribute(name); MatrixFr updated_values = MatrixFr::Zero(num_output_vertices, values.cols()); VectorF count = VectorF::Zero(num_output_vertices); for (size_t i=0; i<num_input_vertices; i++) { size_t j = index_map[i]; updated_values.row(j) += values.row(i); count[j] += 1; } for (size_t i=0; i<num_output_vertices; i++) { assert(count[i] > 0); updated_values.row(i) /= count[i]; } wire_network.set_attribute(name, updated_values); } } }
void AABBTiler::evaluate_offset_parameters(WireNetwork& wire_network, const AABBTiler::FuncList& funcs) { const size_t dim = wire_network.get_dim(); const size_t num_vertices = wire_network.get_num_vertices(); const size_t num_unit_vertices = m_unit_wire_network->get_num_vertices(); wire_network.add_attribute("vertex_offset", true); MatrixFr attr_value(num_vertices, dim); ParameterCommon::Variables vars; const MatrixFr& ori_vertices = m_unit_wire_network->get_vertices(); size_t count=0; for (auto f : funcs) { MatrixFr local_offseted_vertices = ori_vertices + m_params->evaluate_offset(vars); attr_value.block(count * num_unit_vertices, 0, num_unit_vertices, dim) = f(local_offseted_vertices); count++; } attr_value = attr_value - wire_network.get_vertices(); wire_network.set_attribute("vertex_offset", attr_value); }
void WireVertexCubicSymmetryAttribute::compute(const WireNetwork& network) { Operators ops = get_symmetry_operators( network.get_dim(), network.center()); VectorI orbit_labels = get_vertex_labels(network.get_vertices(), ops); m_values = orbit_labels.cast<Float>(); }