当前位置: 首页>>代码示例>>C++>>正文


C++ MatrixFr类代码示例

本文整理汇总了C++中MatrixFr的典型用法代码示例。如果您正苦于以下问题:C++ MatrixFr类的具体用法?C++ MatrixFr怎么用?C++ MatrixFr使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。


在下文中一共展示了MatrixFr类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: assert

void GeometryCorrectionTable::apply_correction_to_in_plane_edge(
        const Vector3F& edge_dir, MatrixFr& loop) {
    VectorF bbox_min = loop.colwise().minCoeff();
    VectorF bbox_max = loop.colwise().maxCoeff();
    VectorF bbox_center = 0.5 * (bbox_min + bbox_max);

    size_t num_vts = loop.rows();
    size_t dim = loop.cols();
    assert(dim == 3);
    MatrixFr proj_loop(num_vts, dim);

    for (size_t i=0; i<num_vts; i++) {
        const VectorF& v = loop.row(i) - bbox_center.transpose();
        proj_loop.row(i) = Vector3F(v[0], v[1], 0.0);
    }
    Float target_half_height = 1e3; // Something huge to represent inf
    Float target_half_width = proj_loop.row(0).norm();

    Vector2F correction_1 = lookup(target_half_width, target_half_height);
    Vector2F correction_2 = lookup(target_half_height, target_half_width);
    Float half_width  = 0.5 * (correction_1[0] + correction_2[1])
        + 0.05 * num_offset_pixel;
    half_width = std::max(half_width, min_thickness);

    for (size_t i=0; i<num_vts; i++) {
        loop.row(i) += proj_loop.row(i) *
            (-target_half_width + half_width) / target_half_width;
    }
}
开发者ID:gaoyue17,项目名称:PyMesh,代码行数:29,代码来源:GeometryCorrectionTable.cpp

示例2: apply_z_correction

void GeometryCorrectionTable::apply_z_correction(
        const Vector3F& edge_dir, MatrixFr& loop) {
    //const Float max_z_error = 0.125;
    //const Float max_z_error = 0.09;
    const Float max_z_error = 0.00;
    VectorF bbox_min = loop.colwise().minCoeff();
    VectorF bbox_max = loop.colwise().maxCoeff();
    VectorF bbox_center = 0.5 * (bbox_min + bbox_max);

    Vector3F side_dir = edge_dir.cross(Vector3F::UnitZ());
    Float sin_val = side_dir.norm();
    if (sin_val < 1e-3) return;

    const size_t num_vts = loop.rows();
    for (size_t i=0; i<num_vts; i++) {
        Vector3F v = loop.row(i) - bbox_center.transpose();
        Float side_component = side_dir.dot(v) / sin_val;
        Vector3F proj_v = v - side_component * side_dir / sin_val;
        Float proj_component = proj_v.norm();
        if (proj_component > 1e-3) {
            proj_v -= proj_v / proj_component * (sin_val * max_z_error);
        }
        loop.row(i) = bbox_center + proj_v + side_component * side_dir / sin_val;
    }
}
开发者ID:gaoyue17,项目名称:PyMesh,代码行数:25,代码来源:GeometryCorrectionTable.cpp

示例3: generate_joint

void SimpleInflator::generate_joint(
        const MatrixFr& pts, const VectorI& source_ids, size_t vertex_index) {
    const size_t dim = m_wire_network->get_dim();
    ConvexHullEngine::Ptr convex_hull = ConvexHullEngine::create(dim, "qhull");
    convex_hull->run(pts);

    MatrixFr vertices = convex_hull->get_vertices();
    MatrixIr faces = convex_hull->get_faces();
    VectorI  index_map = convex_hull->get_index_map();

    if (dim == 2) {
        // Need to triangulate the loop.
        const size_t num_vertices = vertices.rows();
        TriangleWrapper tri(vertices, faces);
        tri.run(std::numeric_limits<Float>::max(), false, false, false);
        vertices = tri.get_vertices();
        faces = tri.get_faces();
        assert(vertices.rows() == num_vertices);
    }

    m_vertex_list.push_back(vertices);
    const size_t num_faces = faces.rows();
    for (size_t i=0; i<num_faces; i++) {
        const auto& face = faces.row(i);
        if (dim == 3) {
            auto ori_indices = map_indices(face, index_map);
            if (belong_to_the_same_loop(ori_indices, source_ids)) continue;
        }
        m_face_list.push_back(face.array() + m_num_vertex_accumulated);
        m_face_source_list.push_back(vertex_index+1);
    }

    m_num_vertex_accumulated += vertices.rows();
}
开发者ID:gaoyue17,项目名称:PyMesh,代码行数:34,代码来源:SimpleInflator.cpp

示例4: NotImplementedError

SelfIntersection::SelfIntersection(
        const MatrixFr& vertices, const MatrixIr& faces)
: m_faces(faces) {
    const size_t num_vertices = vertices.rows();
    const size_t dim = vertices.cols();
    const size_t num_faces = faces.rows();
    const size_t vertex_per_face = faces.cols();

    if (dim != 3) {
        throw NotImplementedError(
                "Self intersection check only support 3D");
    }
    if (vertex_per_face != 3) {
        throw NotImplementedError(
                "Self intersection check only works with triangles");
    }

    m_points.resize(num_vertices);
    for (size_t i=0; i<num_vertices; i++) {
        m_points[i] = Point_3(
                vertices(i,0),
                vertices(i,1),
                vertices(i,2));
    }
}
开发者ID:luozhipi,项目名称:PyMesh,代码行数:25,代码来源:SelfIntersection.cpp

示例5: get_edge_thickness

void SimpleInflator::generate_end_loops() {
    const size_t num_edges = m_wire_network->get_num_edges();

    const MatrixFr vertices = m_wire_network->get_vertices();
    const MatrixIr edges = m_wire_network->get_edges();
    const MatrixFr edge_thickness = get_edge_thickness();
    for (size_t i=0; i<num_edges; i++) {
        const VectorI& edge = edges.row(i);
        const VectorF& v1 = vertices.row(edge[0]);
        const VectorF& v2 = vertices.row(edge[1]);
        Float edge_len = (v2 - v1).norm();
        MatrixFr loop_1 = m_profile->place(v1, v2,
                m_end_loop_offsets[edge[0]],
                edge_thickness(i, 0),
                m_rel_correction, m_abs_correction, m_correction_cap,
                m_spread_const);
        assert(loop_is_valid(loop_1, v1, v2));
        MatrixFr loop_2 = m_profile->place(v1, v2,
                edge_len - m_end_loop_offsets[edge[1]],
                edge_thickness(i, 1),
                m_rel_correction, m_abs_correction, m_correction_cap,
                m_spread_const);
        assert(loop_is_valid(loop_2, v1, v2));
        m_end_loops.push_back(std::make_pair(loop_1, loop_2));
    }
}
开发者ID:gaoyue17,项目名称:PyMesh,代码行数:26,代码来源:SimpleInflator.cpp

示例6: wire_network_to_geomesh

GeoMeshPtr GeogramMeshUtils::wire_network_to_geomesh(
        const MatrixFr& vertices, const Matrix2Ir& edges) {
    const size_t dim = vertices.cols();
    const size_t num_vertices = vertices.rows();
    const size_t num_edges = edges.rows();

    auto geo_mesh = std::make_shared<GeoMesh>(dim, false);
    geo_mesh->vertices.clear();
    geo_mesh->vertices.create_vertices(num_vertices);
    geo_mesh->edges.clear();
    geo_mesh->edges.create_edges(num_edges);

    for (size_t i=0; i<num_vertices; i++) {
        auto& p = geo_mesh->vertices.point(i);
        for (size_t j=0; j<dim; j++) {
            p[j] = vertices(i,j);
        }
    }

    for (size_t i=0; i<num_edges; i++) {
        geo_mesh->edges.set_vertex(i, 0, edges(i,0));
        geo_mesh->edges.set_vertex(i, 1, edges(i,1));
    }

    return geo_mesh;
}
开发者ID:qnzhou,项目名称:PyMesh,代码行数:26,代码来源:GeogramMeshUtils.cpp

示例7: raw_to_geomesh

GeoMeshPtr GeogramMeshUtils::raw_to_geomesh(
        const MatrixFr& vertices, const MatrixIr& faces) {
    const size_t dim = vertices.cols();
    const size_t vertex_per_face = faces.cols();
    const size_t num_vertices = vertices.rows();
    const size_t num_faces = faces.rows();

    if (vertex_per_face != 3) {
        throw NotImplementedError("Converting non-triangle mesh to "
                "Geogram mesh is not yet implemented");
    }

    auto geo_mesh = std::make_shared<GeoMesh>(dim, false);
    geo_mesh->vertices.clear();
    geo_mesh->vertices.create_vertices(num_vertices);
    geo_mesh->facets.clear();
    geo_mesh->facets.create_triangles(num_faces);

    for (size_t i=0; i<num_vertices; i++) {
        auto& p = geo_mesh->vertices.point(i);
        for (size_t j=0; j<dim; j++) {
            p[j] = vertices(i,j);
        }
    }

    for (size_t i=0; i<num_faces; i++) {
        geo_mesh->facets.set_vertex(i, 0, faces(i,0));
        geo_mesh->facets.set_vertex(i, 1, faces(i,1));
        geo_mesh->facets.set_vertex(i, 2, faces(i,2));
    }

    return geo_mesh;
}
开发者ID:qnzhou,项目名称:PyMesh,代码行数:33,代码来源:GeogramMeshUtils.cpp

示例8: create_mesh

    CarveMeshPtr create_mesh(const MatrixFr& vertices, const MatrixIr& faces) {
        const size_t num_vertices = vertices.rows();
        const size_t num_faces = faces.rows();

        if (vertices.cols() != 3) {
            throw NotImplementedError("Only 3D mesh is supported.");
        }
        if (faces.cols() != 3) {
            throw NotImplementedError("Only triangle mesh is supported.");
        }

        std::vector<CarveVector> points;

        for (size_t i=0; i<num_vertices; i++) {
            const auto& v = vertices.row(i);
            CarveVector p;
            p.v[0] = v[0];
            p.v[1] = v[1];
            p.v[2] = v[2];
            points.push_back(p);
        }

        std::vector<int> raw_faces;
        raw_faces.reserve(num_faces * 4);
        for (size_t i=0; i<num_faces; i++) {
            raw_faces.push_back(3);
            raw_faces.push_back(faces(i,0));
            raw_faces.push_back(faces(i,1));
            raw_faces.push_back(faces(i,2));
        }

        return CarveMeshPtr(new CarveMesh(points, num_faces, raw_faces));
    }
开发者ID:gaoyue17,项目名称:PyMesh,代码行数:33,代码来源:CarveEngine.cpp

示例9: remover

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);
        }
    }
}
开发者ID:gaoyue17,项目名称:PyMesh,代码行数:35,代码来源:TilerEngine.cpp

示例10: compute_vertex_grid

 HashGrid::Ptr compute_vertex_grid(const MatrixFr& vertices, Float cell_size) {
     const size_t dim = vertices.cols();
     const size_t num_vertices = vertices.rows();
     HashGrid::Ptr grid = HashGrid::create(cell_size, dim);
     for (size_t i=0; i<num_vertices; i++) {
         const VectorF& v = vertices.row(i);
         grid->insert(i, v);
     }
     return grid;
 }
开发者ID:gaoyue17,项目名称:PyMesh,代码行数:10,代码来源:MeshValidation.cpp

示例11: extract_mesh

    void extract_mesh(const C3t3& c3t3,
            MatrixFr& vertices, MatrixIr& faces, MatrixIr& voxels) {
        const Tr& tr = c3t3.triangulation();
        size_t num_vertices = tr.number_of_vertices();
        size_t num_faces = c3t3.number_of_facets_in_complex();
        size_t num_voxels = c3t3.number_of_cells_in_complex();

        vertices.resize(num_vertices, 3);
        faces.resize(num_faces, 3);
        voxels.resize(num_voxels, 4);

        std::map<Tr::Vertex_handle, int> V;
        size_t inum = 0;
        for(auto vit = tr.finite_vertices_begin();
                vit != tr.finite_vertices_end(); ++vit) {
            V[vit] = inum;
            const auto& p = vit->point();
            vertices.row(inum) = Vector3F(p.x(), p.y(), p.z()).transpose();
            assert(inum < num_vertices);
            inum++;
        }
        assert(inum == num_vertices);

        size_t face_count = 0;
        for(auto fit = c3t3.facets_in_complex_begin();
                fit != c3t3.facets_in_complex_end(); ++fit) {
            assert(face_count < num_faces);
            for (int i=0; i<3; i++) {
                if (i != fit->second) {
                    const auto& vh = (*fit).first->vertex(i);
                    assert(V.find(vh) != V.end());
                    const int vid = V[vh];
                    faces(face_count, i) = vid;
                }
            }
            face_count++;
        }
        assert(face_count == num_faces);

        size_t voxel_count = 0;
        for(auto cit = c3t3.cells_in_complex_begin() ;
                cit != c3t3.cells_in_complex_end(); ++cit ) {
            assert(voxel_count < num_voxels);
            for (int i=0; i<4; i++) {
                assert(V.find(cit->vertex(i)) != V.end());
                const size_t vid = V[cit->vertex(i)];
                voxels(voxel_count, i) = vid;
            }
            voxel_count++;
        }
        assert(voxel_count == num_voxels);
    }
开发者ID:gaoyue17,项目名称:PyMesh,代码行数:52,代码来源:CGALMeshGen.cpp

示例12: RuntimeError

void CGALConvexHull3D::run(const MatrixFr& points) {
    std::list<Point_3> cgal_pts;
    const size_t num_pts = points.rows();
    const size_t dim = points.cols();
    if (dim != 3) {
        std::stringstream err_msg;
        err_msg << "Invalid dim: " << dim << "  Expect dim=3.";
        throw RuntimeError(err_msg.str());
    }

    for (size_t i=0; i<num_pts; i++) {
        const VectorF& p = points.row(i);
        cgal_pts.push_back(Point_3(p[0], p[1], p[2]));
    }

    Polyhedron_3 hull;
    CGAL::convex_hull_3(cgal_pts.begin(), cgal_pts.end(), hull);
    assert(hull.is_closed());
    assert(hull.is_pure_triangle());

    const size_t num_vertices = hull.size_of_vertices();
    const size_t num_faces = hull.size_of_facets();

    m_vertices.resize(num_vertices, dim);
    m_faces.resize(num_faces, 3);

    size_t vertex_count=0;
    for (auto itr=hull.vertices_begin(); itr!=hull.vertices_end(); itr++) {
        const Point_3& p = itr->point();
        m_vertices.coeffRef(vertex_count, 0) = p.x();
        m_vertices.coeffRef(vertex_count, 1) = p.y();
        m_vertices.coeffRef(vertex_count, 2) = p.z();
        itr->id() = vertex_count;
        vertex_count++;
    }

    size_t face_count=0;
    for (auto f_itr=hull.facets_begin(); f_itr!=hull.facets_end(); f_itr++) {
        size_t edge_count=0;
        auto h_itr = f_itr->facet_begin();
        do {
            m_faces.coeffRef(face_count, edge_count) = h_itr->vertex()->id();
            edge_count++;
            h_itr++;
        } while (h_itr != f_itr->facet_begin());
        face_count++;
    }

    compute_index_map(points);
    reorient_faces();
}
开发者ID:luozhipi,项目名称:PyMesh,代码行数:51,代码来源:CGALConvexHull3D.cpp

示例13: extract_surface_boundary_raw

Boundary::Ptr Boundary::extract_surface_boundary_raw(
        MatrixFr& vertices, MatrixIr& faces) {
    VectorF flattened_vertices = Eigen::Map<VectorF>(vertices.data(),
            vertices.rows() * vertices.cols());
    VectorI flattened_faces = Eigen::Map<VectorI>(faces.data(),
            faces.rows() * faces.cols());
    VectorI voxels = VectorI::Zero(0);

    MeshFactory factory;
    Mesh::Ptr mesh = factory.load_data(flattened_vertices, flattened_faces,
            voxels, vertices.cols(), faces.cols(), 0).create();

    return extract_surface_boundary(*mesh);
}
开发者ID:qnzhou,项目名称:PyMesh,代码行数:14,代码来源:Boundary.cpp

示例14: reorientate_triangles

    void reorientate_triangles(const MatrixFr& vertices, MatrixIr& faces,
            const VectorF& n) {
        assert(vertices.cols() == 3);
        assert(faces.cols() == 3);

        const VectorI& f = faces.row(0);
        const Vector3F& v0 = vertices.row(f[0]);
        const Vector3F& v1 = vertices.row(f[1]);
        const Vector3F& v2 = vertices.row(f[2]);

        Float projected_area = (v1-v0).cross(v2-v0).dot(n);
        if (projected_area < 0) {
            faces.col(2).swap(faces.col(1));
        }
    }
开发者ID:luozhipi,项目名称:PyMesh,代码行数:15,代码来源:BoundaryRemesher.cpp

示例15: run

VectorF FastWindingNumberEngine::run(const MatrixFr& queries) {
    const auto num_vertices = m_vertices.rows();
    const auto num_faces = m_faces.rows();
    const auto num_queries = queries.rows();
    using Vector = HDK_Sample::UT_Vector3T<float>;
    using Engine = HDK_Sample::UT_SolidAngle<float, float>;

    std::vector<Vector> vertices(num_vertices);
    for (size_t i=0; i<num_vertices; i++) {
        vertices[i][0] = static_cast<float>(m_vertices(i, 0));
        vertices[i][1] = static_cast<float>(m_vertices(i, 1));
        vertices[i][2] = static_cast<float>(m_vertices(i, 2));
    }

    Engine engine;
    engine.init(num_faces, m_faces.data(), num_vertices, vertices.data());

    VectorF winding_numbers(num_queries);
    for (size_t i=0; i<num_queries; i++) {
        Vector q;
        q[0] = static_cast<float>(queries(i, 0));
        q[1] = static_cast<float>(queries(i, 1));
        q[2] = static_cast<float>(queries(i, 2));
        winding_numbers[i] = engine.computeSolidAngle(q);
    }
    winding_numbers /= 4 * M_PI;

    return winding_numbers;
}
开发者ID:qnzhou,项目名称:PyMesh,代码行数:29,代码来源:FastWindingNumberEngine.cpp


注:本文中的MatrixFr类示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。