// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2017 Sebastian Koch and Daniele Panozzo // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. const char *__doc_igl_active_set = R"igl_Qu8mg5v7(// Known Bugs: rows of [Aeq;Aieq] **must** be linearly independent. Should be // using QR decomposition otherwise: // http://www.okstate.edu/sas/v8/sashtml/ormp/chap5/sect32.htm // // ACTIVE_SET Minimize quadratic energy // // 0.5*Z'*A*Z + Z'*B + C with constraints // // that Z(known) = Y, optionally also subject to the constraints Aeq*Z = Beq, // and further optionally subject to the linear inequality constraints that // Aieq*Z <= Bieq and constant inequality constraints lx <= x <= ux // // Inputs: // A n by n matrix of quadratic coefficients // B n by 1 column of linear coefficients // known list of indices to known rows in Z // Y list of fixed values corresponding to known rows in Z // Aeq meq by n list of linear equality constraint coefficients // Beq meq by 1 list of linear equality constraint constant values // Aieq mieq by n list of linear inequality constraint coefficients // Bieq mieq by 1 list of linear inequality constraint constant values // lx n by 1 list of lower bounds [] implies -Inf // ux n by 1 list of upper bounds [] implies Inf // params struct of additional parameters (see below) // Z if not empty, is taken to be an n by 1 list of initial guess values // (see output) // Outputs: // Z n by 1 list of solution values // Returns true on success, false on error // // Benchmark: For a harmonic solve on a mesh with 325K facets, matlab 2.2 // secs, igl/min_quad_with_fixed.h 7.1 secs //)igl_Qu8mg5v7"; const char *__doc_igl_adjacency_list = R"igl_Qu8mg5v7(// Constructs the graph adjacency list of a given mesh (V,F) // Templates: // T should be a eigen sparse matrix primitive type like int or double // Inputs: // F #F by dim list of mesh faces (must be triangles) // sorted flag that indicates if the list should be sorted counter-clockwise // Outputs: // A vector > containing at row i the adjacent vertices of vertex i // // Example: // // Mesh in (V,F) // vector > A; // adjacency_list(F,A); // // See also: edges, cotmatrix, diag)igl_Qu8mg5v7"; const char *__doc_igl_arap_precomputation = R"igl_Qu8mg5v7(// Compute necessary information to start using an ARAP deformation // // Inputs: // V #V by dim list of mesh positions // F #F by simplex-size list of triangle|tet indices into V // dim dimension being used at solve time. For deformation usually dim = // V.cols(), for surface parameterization V.cols() = 3 and dim = 2 // b #b list of "boundary" fixed vertex indices into V // Outputs: // data struct containing necessary precomputation)igl_Qu8mg5v7"; const char *__doc_igl_arap_solve = R"igl_Qu8mg5v7(// Inputs: // bc #b by dim list of boundary conditions // data struct containing necessary precomputation and parameters // U #V by dim initial guess)igl_Qu8mg5v7"; const char *__doc_igl_avg_edge_length = R"igl_Qu8mg5v7(// Compute the average edge length for the given triangle mesh // Templates: // DerivedV derived from vertex positions matrix type: i.e. MatrixXd // DerivedF derived from face indices matrix type: i.e. MatrixXi // DerivedL derived from edge lengths matrix type: i.e. MatrixXd // Inputs: // V eigen matrix #V by 3 // F #F by simplex-size list of mesh faces (must be simplex) // Outputs: // l average edge length // // See also: adjacency_matrix)igl_Qu8mg5v7"; const char *__doc_igl_barycenter = R"igl_Qu8mg5v7(// Computes the barycenter of every simplex // // Inputs: // V #V x dim matrix of vertex coordinates // F #F x simplex_size matrix of indices of simplex corners into V // Output: // BC #F x dim matrix of 3d vertices //)igl_Qu8mg5v7"; const char *__doc_igl_barycentric_coordinates = R"igl_Qu8mg5v7(// Compute barycentric coordinates in a tet // // Inputs: // P #P by 3 Query points in 3d // A #P by 3 Tet corners in 3d // B #P by 3 Tet corners in 3d // C #P by 3 Tet corners in 3d // D #P by 3 Tet corners in 3d // Outputs: // L #P by 4 list of barycentric coordinates // )igl_Qu8mg5v7"; const char *__doc_igl_barycentric_to_global = R"igl_Qu8mg5v7(// Converts barycentric coordinates in the embree form to 3D coordinates // Embree stores barycentric coordinates as triples: fid, bc1, bc2 // fid is the id of a face, bc1 is the displacement of the point wrt the // first vertex v0 and the edge v1-v0. Similarly, bc2 is the displacement // wrt v2-v0. // // Input: // V: #Vx3 Vertices of the mesh // F: #Fxe Faces of the mesh // bc: #Xx3 Barycentric coordinates, one row per point // // Output: // #X: #Xx3 3D coordinates of all points in bc)igl_Qu8mg5v7"; const char *__doc_igl_bbw = R"igl_Qu8mg5v7(// Compute Bounded Biharmonic Weights on a given domain (V,Ele) with a given // set of boundary conditions // // Templates // DerivedV derived type of eigen matrix for V (e.g. MatrixXd) // DerivedF derived type of eigen matrix for F (e.g. MatrixXi) // Derivedb derived type of eigen matrix for b (e.g. VectorXi) // Derivedbc derived type of eigen matrix for bc (e.g. MatrixXd) // DerivedW derived type of eigen matrix for W (e.g. MatrixXd) // Inputs: // V #V by dim vertex positions // Ele #Elements by simplex-size list of element indices // b #b boundary indices into V // bc #b by #W list of boundary values // data object containing options, initial guess --> solution and results // Outputs: // W #V by #W list of *unnormalized* weights to normalize use // igl::normalize_row_sums(W,W); // Returns true on success, false on failure)igl_Qu8mg5v7"; const char *__doc_igl_boundary_conditions = R"igl_Qu8mg5v7(// Compute boundary conditions for automatic weights computation. This // function expects that the given mesh (V,Ele) has sufficient samples // (vertices) exactly at point handle locations and exactly along bone and // cage edges. // // Inputs: // V #V by dim list of domain vertices // Ele #Ele by simplex-size list of simplex indices // C #C by dim list of handle positions // P #P by 1 list of point handle indices into C // BE #BE by 2 list of bone edge indices into C // CE #CE by 2 list of cage edge indices into *P* // Outputs: // b #b list of boundary indices (indices into V of vertices which have // known, fixed values) // bc #b by #weights list of known/fixed values for boundary vertices // (notice the #b != #weights in general because #b will include all the // intermediary samples along each bone, etc.. The ordering of the // weights corresponds to [P;BE] // Returns false if boundary conditions are suspicious: // P and BE are empty // bc is empty // some column of bc doesn't have a 0 (assuming bc has >1 columns) // some column of bc doesn't have a 1 (assuming bc has >1 columns))igl_Qu8mg5v7"; const char *__doc_igl_boundary_facets = R"igl_Qu8mg5v7(// BOUNDARY_FACETS Determine boundary faces (edges) of tetrahedra (triangles) // stored in T (analogous to qptoolbox's `outline` and `boundary_faces`). // // Templates: // IntegerT integer-value: e.g. int // IntegerF integer-value: e.g. int // Input: // T tetrahedron (triangle) index list, m by 4 (3), where m is the number of tetrahedra // Output: // F list of boundary faces, n by 3 (2), where n is the number of boundary faces // //)igl_Qu8mg5v7"; const char *__doc_igl_boundary_loop = R"igl_Qu8mg5v7(// Compute list of ordered boundary loops for a manifold mesh. // // Templates: // Index index type // Inputs: // F #V by dim list of mesh faces // Outputs: // L list of loops where L[i] = ordered list of boundary vertices in loop i //)igl_Qu8mg5v7"; const char *__doc_igl_cat = R"igl_Qu8mg5v7(// Perform concatenation of a two matrices along a single dimension // If dim == 1, then C = [A;B]. If dim == 2 then C = [A B] // // Template: // Scalar scalar data type for sparse matrices like double or int // Mat matrix type for all matrices (e.g. MatrixXd, SparseMatrix) // MatC matrix type for output matrix (e.g. MatrixXd) needs to support // resize // Inputs: // A first input matrix // B second input matrix // dim dimension along which to concatenate, 1 or 2 // Outputs: // C output matrix // )igl_Qu8mg5v7"; const char *__doc_igl_collapse_edge = R"igl_Qu8mg5v7(See collapse_edge for the documentation.)igl_Qu8mg5v7"; const char *__doc_igl_colon = R"igl_Qu8mg5v7(// Colon operator like matlab's colon operator. Enumerats values between low // and hi with step step. // Templates: // L should be a eigen matrix primitive type like int or double // S should be a eigen matrix primitive type like int or double // H should be a eigen matrix primitive type like int or double // T should be a eigen matrix primitive type like int or double // Inputs: // low starting value if step is valid then this is *always* the first // element of I // step step difference between sequential elements returned in I, // remember this will be cast to template T at compile time. If lowhi then step must be negative. // Otherwise I will be set to empty. // hi ending value, if (hi-low)%step is zero then this will be the last // element in I. If step is positive there will be no elements greater // than hi, vice versa if hi smoothness only, 1->constraints only) // Outputs: // R #F by 3 the representative vectors of the interpolated field // S #V by 1 the singularity index for each vertex (0 = regular))igl_Qu8mg5v7"; const char *__doc_igl_copyleft_marching_cubes = R"igl_Qu8mg5v7(// marching_cubes( values, points, x_res, y_res, z_res, vertices, faces ) // // performs marching cubes reconstruction on the grid defined by values, and // points, and generates vertices and faces // // Input: // values #number_of_grid_points x 1 array -- the scalar values of an // implicit function defined on the grid points (<0 in the inside of the // surface, 0 on the border, >0 outside) // points #number_of_grid_points x 3 array -- 3-D positions of the grid // points, ordered in x,y,z order: // points[index] = the point at (x,y,z) where : // x = (index % (xres -1), // y = (index / (xres-1)) %(yres-1), // z = index / (xres -1) / (yres -1) ). // where x,y,z index x, y, z dimensions // i.e. index = x + y*xres + z*xres*yres // xres resolutions of the grid in x dimension // yres resolutions of the grid in y dimension // zres resolutions of the grid in z dimension // Output: // vertices #V by 3 list of mesh vertex positions // faces #F by 3 list of mesh triangle indices //)igl_Qu8mg5v7"; const char *__doc_igl_copyleft_swept_volume = R"igl_Qu8mg5v7(// Compute the surface of the swept volume of a solid object with surface // (V,F) mesh under going rigid motion. // // Inputs: // V #V by 3 list of mesh positions in reference pose // F #F by 3 list of mesh indices into V // transform function handle so that transform(t) returns the rigid // transformation at time t∈[0,1] // steps number of time steps: steps=3 --> t∈{0,0.5,1} // grid_res number of grid cells on the longest side containing the // motion (isolevel+1 cells will also be added on each side as padding) // isolevel distance level to be contoured as swept volume // Outputs: // SV #SV by 3 list of mesh positions of the swept surface // SF #SF by 3 list of mesh faces into SV)igl_Qu8mg5v7"; const char *__doc_igl_copyleft_tetgen_tetrahedralize = R"igl_Qu8mg5v7(// Mesh the interior of a surface mesh (V,F) using tetgen // // Inputs: // V #V by 3 vertex position list // F #F list of polygon face indices into V (0-indexed) // switches string of tetgen options (See tetgen documentation) e.g. // "pq1.414a0.01" tries to mesh the interior of a given surface with // quality and area constraints // "" will mesh the convex hull constrained to pass through V (ignores F) // Outputs: // TV #V by 3 vertex position list // TT #T by 4 list of tet face indices // TF #F by 3 list of triangle face indices // Returns status: // 0 success // 1 tetgen threw exception // 2 tetgen did not crash but could not create any tets (probably there are // holes, duplicate faces etc.) // -1 other error)igl_Qu8mg5v7"; const char *__doc_igl_cotmatrix = R"igl_Qu8mg5v7(// Constructs the cotangent stiffness matrix (discrete laplacian) for a given // mesh (V,F). // // Templates: // DerivedV derived type of eigen matrix for V (e.g. derived from // MatrixXd) // DerivedF derived type of eigen matrix for F (e.g. derived from // MatrixXi) // Scalar scalar type for eigen sparse matrix (e.g. double) // Inputs: // V #V by dim list of mesh vertex positions // F #F by simplex_size list of mesh faces (must be triangles) // Outputs: // L #V by #V cotangent matrix, each row i corresponding to V(i,:) // // See also: adjacency_matrix // // Note: This Laplacian uses the convention that diagonal entries are // **minus** the sum of off-diagonal entries. The diagonal entries are // therefore in general negative and the matrix is **negative** semi-definite // (immediately, -L is **positive** semi-definite) //)igl_Qu8mg5v7"; const char *__doc_igl_covariance_scatter_matrix = R"igl_Qu8mg5v7(// Construct the covariance scatter matrix for a given arap energy // Inputs: // V #V by Vdim list of initial domain positions // F #F by 3 list of triangle indices into V // energy ARAPEnergyType enum value defining which energy is being used. // See ARAPEnergyType.h for valid options and explanations. // Outputs: // CSM dim*#V/#F by dim*#V sparse matrix containing special laplacians along // the diagonal so that when multiplied by V gives covariance matrix // elements, can be used to speed up covariance matrix computation)igl_Qu8mg5v7"; const char *__doc_igl_cross_field_mismatch = R"igl_Qu8mg5v7(// Inputs: // V #V by 3 eigen Matrix of mesh vertex 3D positions // F #F by 3 eigen Matrix of face (quad) indices // PD1 #F by 3 eigen Matrix of the first per face cross field vector // PD2 #F by 3 eigen Matrix of the second per face cross field vector // isCombed boolean, specifying whether the field is combed (i.e. matching has been precomputed. // If not, the field is combed first. // Output: // Handle_MMatch #F by 3 eigen Matrix containing the integer mismatch of the cross field // across all face edges //)igl_Qu8mg5v7"; const char *__doc_igl_cut_mesh_from_singularities = R"igl_Qu8mg5v7(// Given a mesh (V,F) and the integer mismatch of a cross field per edge // (mismatch), finds the cut_graph connecting the singularities (seams) and the // degree of the singularities singularity_index // // Input: // V #V by 3 list of mesh vertex positions // F #F by 3 list of faces // mismatch #F by 3 list of per corner integer mismatch // Outputs: // seams #F by 3 list of per corner booleans that denotes if an edge is a // seam or not //)igl_Qu8mg5v7"; const char *__doc_igl_deform_skeleton = R"igl_Qu8mg5v7(// Deform a skeleton. // // Inputs: // C #C by 3 list of joint positions // BE #BE by 2 list of bone edge indices // vA #BE list of bone transformations // Outputs // CT #BE*2 by 3 list of deformed joint positions // BET #BE by 2 list of bone edge indices (maintains order) //)igl_Qu8mg5v7"; const char *__doc_igl_directed_edge_orientations = R"igl_Qu8mg5v7(// Determine rotations that take each edge from the x-axis to its given rest // orientation. // // Inputs: // C #C by 3 list of edge vertex positions // E #E by 2 list of directed edges // Outputs: // Q #E list of quaternions //)igl_Qu8mg5v7"; const char *__doc_igl_directed_edge_parents = R"igl_Qu8mg5v7(// Recover "parents" (preceding edges) in a tree given just directed edges. // // Inputs: // E #E by 2 list of directed edges // Outputs: // P #E list of parent indices into E (-1) means root //)igl_Qu8mg5v7"; const char *__doc_igl_doublearea = R"igl_Qu8mg5v7(// DOUBLEAREA computes twice the area for each input triangle[quad] // // Templates: // DerivedV derived type of eigen matrix for V (e.g. derived from // MatrixXd) // DerivedF derived type of eigen matrix for F (e.g. derived from // MatrixXi) // DeriveddblA derived type of eigen matrix for dblA (e.g. derived from // MatrixXd) // Inputs: // V #V by dim list of mesh vertex positions // F #F by simplex_size list of mesh faces (must be triangles or quads) // Outputs: // dblA #F list of triangle[quad] double areas (SIGNED only for 2D input) // // Known bug: For dim==3 complexity is O(#V + #F)!! Not just O(#F). This is a big deal // if you have 1million unreferenced vertices and 1 face)igl_Qu8mg5v7"; const char *__doc_igl_doublearea_single = R"igl_Qu8mg5v7(// Single triangle in 2D! // // This should handle streams of corners not just single corners)igl_Qu8mg5v7"; const char *__doc_igl_doublearea_quad = R"igl_Qu8mg5v7(// DOUBLEAREA_QUAD computes twice the area for each input quadrilateral // // Inputs: // V #V by dim list of mesh vertex positions // F #F by simplex_size list of mesh faces (must be quadrilaterals) // Outputs: // dblA #F list of quadrilateral double areas //)igl_Qu8mg5v7"; const char *__doc_igl_dqs = R"igl_Qu8mg5v7(// Dual quaternion skinning // // Inputs: // V #V by 3 list of rest positions // W #W by #C list of weights // vQ #C list of rotation quaternions // vT #C list of translation vectors // Outputs: // U #V by 3 list of new positions)igl_Qu8mg5v7"; const char *__doc_igl_edge_lengths = R"igl_Qu8mg5v7(// Constructs a list of lengths of edges opposite each index in a face // (triangle/tet) list // // Templates: // DerivedV derived from vertex positions matrix type: i.e. MatrixXd // DerivedF derived from face indices matrix type: i.e. MatrixXi // DerivedL derived from edge lengths matrix type: i.e. MatrixXd // Inputs: // V eigen matrix #V by 3 // F #F by 2 list of mesh edges // or // F #F by 3 list of mesh faces (must be triangles) // or // T #T by 4 list of mesh elements (must be tets) // Outputs: // L #F by {1|3|6} list of edge lengths // for edges, column of lengths // for triangles, columns correspond to edges [1,2],[2,0],[0,1] // for tets, columns correspond to edges // [3 0],[3 1],[3 2],[1 2],[2 0],[0 1] //)igl_Qu8mg5v7"; const char *__doc_igl_edge_topology = R"igl_Qu8mg5v7(// Initialize Edges and their topological relations (assumes an edge-manifold // mesh) // // Output: // EV : #Ex2, Stores the edge description as pair of indices to vertices // FE : #Fx3, Stores the Triangle-Edge relation // EF : #Ex2: Stores the Edge-Triangle relation // // TODO: This seems to be a inferior duplicate of edge_flaps.h: // - unused input parameter V // - roughly 2x slower than edge_flaps // - outputs less information: edge_flaps reveals corner opposite edge // - FE uses non-standard and ambiguous order: FE(f,c) is merely an edge // incident on corner c of face f. In contrast, edge_flaps's EMAP(f,c) reveals // the edge _opposite_ corner c of face f)igl_Qu8mg5v7"; const char *__doc_igl_eigs = R"igl_Qu8mg5v7(See eigs for the documentation.)igl_Qu8mg5v7"; const char *__doc_igl_embree_ambient_occlusion = R"igl_Qu8mg5v7(// Compute ambient occlusion per given point // // Inputs: // ei EmbreeIntersector containing (V,F) // P #P by 3 list of origin points // N #P by 3 list of origin normals // Outputs: // S #P list of ambient occlusion values between 1 (fully occluded) and // 0 (not occluded) //)igl_Qu8mg5v7"; const char *__doc_igl_embree_line_mesh_intersection = R"igl_Qu8mg5v7(// Project the point cloud V_source onto the triangle mesh // V_target,F_target. // A ray is casted for every vertex in the direction specified by // N_source and its opposite. // // Input: // V_source: #Vx3 Vertices of the source mesh // N_source: #Vx3 Normals of the point cloud // V_target: #V2x3 Vertices of the target mesh // F_target: #F2x3 Faces of the target mesh // // Output: // #Vx3 matrix of baricentric coordinate. Each row corresponds to // a vertex of the projected mesh and it has the following format: // id b1 b2. id is the id of a face of the source mesh. b1 and b2 are // the barycentric coordinates wrt the first two edges of the triangle // To convert to standard global coordinates, see barycentric_to_global.h)igl_Qu8mg5v7"; const char *__doc_igl_embree_reorient_facets_raycast = R"igl_Qu8mg5v7(// Orient each component (identified by C) of a mesh (V,F) using ambient // occlusion such that the front side is less occluded than back side, as // described in "A Simple Method for Correcting Facet Orientations in // Polygon Meshes Based on Ray Casting" [Takayama et al. 2014]. // // Inputs: // V #V by 3 list of vertex positions // F #F by 3 list of triangle indices // rays_total Total number of rays that will be shot // rays_minimum Minimum number of rays that each patch should receive // facet_wise Decision made for each face independently, no use of patches // (i.e., each face is treated as a patch) // use_parity Use parity mode // is_verbose Verbose output to cout // Outputs: // I #F list of whether face has been flipped // C #F list of patch ID (output of bfs_orient > manifold patches))igl_Qu8mg5v7"; const char *__doc_igl_exact_geodesic = R"igl_Qu8mg5v7( // Exact geodesic algorithm for triangular mesh with the implementation from https://code.google.com/archive/p/geodesic/, // and the algorithm first described by Mitchell, Mount and Papadimitriou in 1987 // // Inputs: // V #V by 3 list of 3D vertex positions // F #F by 3 list of mesh faces // VS #VS by 1 vector specifying indices of source vertices // FS #FS by 1 vector specifying indices of source faces // VT #VT by 1 vector specifying indices of target vertices // FT #FT by 1 vector specifying indices of target faces // Output: // D #VT+#FT by 1 vector of geodesic distances of each target w.r.t. the nearest one in the source set // // Note: // Specifying a face as target/source means its center. //)igl_Qu8mg5v7"; const char *__doc_igl_heat_geodesics_precompute = R"igl_Qu8mg5v7( // Precompute factorized solvers for computing a fast approximation of // geodesic distances on a mesh (V,F). [Crane et al. 2013] // // Inputs: // V #V by dim list of mesh vertex positions // F #F by 3 list of mesh face indices into V // Outputs: // data precomputation data (see heat_geodesics_solve) //)igl_Qu8mg5v7"; const char *__doc_igl_heat_geodesics_solve = R"igl_Qu8mg5v7( // Compute fast approximate geodesic distances using precomputed data from a // set of selected source vertices (gamma) // // Inputs: // data precomputation data (see heat_geodesics_precompute) // gamma #gamma list of indices into V of source vertices // Outputs: // D #V list of distances to gamma //)igl_Qu8mg5v7"; const char *__doc_igl_find_cross_field_singularities = R"igl_Qu8mg5v7(// Inputs: // V #V by 3 eigen Matrix of mesh vertex 3D positions // F #F by 3 eigen Matrix of face (quad) indices // Handle_MMatch #F by 3 eigen Matrix containing the integer mismatch of the cross field // across all face edges // Output: // isSingularity #V by 1 boolean eigen Vector indicating the presence of a singularity on a vertex // singularityIndex #V by 1 integer eigen Vector containing the singularity indices //)igl_Qu8mg5v7"; const char *__doc_igl_fit_rotations = R"igl_Qu8mg5v7(// Known issues: This seems to be implemented in Eigen/Geometry: // Eigen::umeyama // // FIT_ROTATIONS Given an input mesh and new positions find rotations for // every covariance matrix in a stack of covariance matrices // // Inputs: // S nr*dim by dim stack of covariance matrices // single_precision whether to use single precision (faster) // Outputs: // R dim by dim * nr list of rotations //)igl_Qu8mg5v7"; const char *__doc_igl_fit_rotations_planar = R"igl_Qu8mg5v7(// FIT_ROTATIONS Given an input mesh and new positions find 2D rotations for // every vertex that best maps its one ring to the new one ring // // Inputs: // S nr*dim by dim stack of covariance matrices, third column and every // third row will be ignored // Outputs: // R dim by dim * nr list of rotations, third row and third column of each // rotation will just be identity //)igl_Qu8mg5v7"; const char *__doc_igl_fit_rotations_SSE = R"igl_Qu8mg5v7(See fit_rotations_SSE for the documentation.)igl_Qu8mg5v7"; const char *__doc_igl_floor = R"igl_Qu8mg5v7(// Floor a given matrix to nearest integers // // Inputs: // X m by n matrix of scalars // Outputs: // Y m by n matrix of floored integers)igl_Qu8mg5v7"; const char *__doc_igl_forward_kinematics = R"igl_Qu8mg5v7(// Given a skeleton and a set of relative bone rotations compute absolute // rigid transformations for each bone. // // Inputs: // C #C by dim list of joint positions // BE #BE by 2 list of bone edge indices // P #BE list of parent indices into BE // dQ #BE list of relative rotations // dT #BE list of relative translations // Outputs: // vQ #BE list of absolute rotations // vT #BE list of absolute translations)igl_Qu8mg5v7"; const char *__doc_igl_gaussian_curvature = R"igl_Qu8mg5v7(// Compute discrete local integral gaussian curvature (angle deficit, without // averaging by local area). // // Inputs: // V #V by 3 eigen Matrix of mesh vertex 3D positions // F #F by 3 eigen Matrix of face (triangle) indices // Output: // K #V by 1 eigen Matrix of discrete gaussian curvature values //)igl_Qu8mg5v7"; const char *__doc_igl_get_seconds = R"igl_Qu8mg5v7(// Return the current time in seconds since program start // // Example: // const auto & tictoc = []() // { // static double t_start = igl::get_seconds(); // double diff = igl::get_seconds()-t_start; // t_start += diff; // return diff; // }; // tictoc(); // ... // part 1 // cout<<"part 1: "< //IGL_INLINE void winding_number_3( // const double * V, // const int n, // const DerivedF * F, // const int m, // const double * O, // double * S); // 2d)igl_Qu8mg5v7"; const char *__doc_igl_writeMESH = R"igl_Qu8mg5v7(// save a tetrahedral volume mesh to a .mesh file // // Templates: // Scalar type for positions and vectors (will be cast as double) // Index type for indices (will be cast to int) // Input: // mesh_file_name path of .mesh file // V double matrix of vertex positions #V by 3 // T #T list of tet indices into vertex positions // F #F list of face indices into vertex positions // // Known bugs: Holes and regions are not supported)igl_Qu8mg5v7"; const char *__doc_igl_writeOBJ = R"igl_Qu8mg5v7(// Write a mesh in an ascii obj file // Inputs: // str path to outputfile // V #V by 3 mesh vertex positions // F #F by 3|4 mesh indices into V // CN #CN by 3 normal vectors // FN #F by 3|4 corner normal indices into CN // TC #TC by 2|3 texture coordinates // FTC #F by 3|4 corner texture coord indices into TC // Returns true on success, false on error // // Known issues: Horrifyingly, this does not have the same order of // parameters as readOBJ.)igl_Qu8mg5v7"; const char *__doc_igl_writePLY = R"igl_Qu8mg5v7(// Write a mesh in an ascii ply file // Inputs: // str path to outputfile // V #V by 3 mesh vertex positions // F #F by 3 mesh indices into V // N #V by 3 normal vectors // UV #V by 2 texture coordinates // Returns true on success, false on error)igl_Qu8mg5v7"; const char *__doc_igl_readPLY= R"igl_Qu8mg5v7(// Read a mesh from an ascii ply file, filling in vertex positions, // mesh indices, normals and texture coordinates // Inputs: // str path to .obj file // Outputs: // V double matrix of vertex positions #V by 3 // F #F list of face indices into vertex positions // N double matrix of corner normals #N by 3 // UV #V by 2 texture coordinates // Returns true on success, false on errors)igl_Qu8mg5v7"; const char *__doc_igl_seam_edges=R"igl_Qu8mg5v7(// Finds all UV-space boundaries of a mesh. // // Inputs: // V #V by dim list of positions of the input mesh. // TC #TC by 2 list of 2D texture coordinates of the input mesh // F #F by 3 list of triange indices into V representing a // manifold-with-boundary triangle mesh // FTC #F by 3 list of indices into TC for each corner // Outputs: // seams Edges where the forwards and backwards directions have different // texture coordinates, as a #seams-by-4 matrix of indices. Each row is // organized as [ forward_face_index, forward_face_vertex_index, // backwards_face_index, backwards_face_vertex_index ] such that one side // of the seam is the edge: // F[ seams( i, 0 ), seams( i, 1 ) ], F[ seams( i, 0 ), (seams( i, 1 ) + 1) % 3 ] // and the other side is the edge: // F[ seams( i, 2 ), seams( i, 3 ) ], F[ seams( i, 2 ), (seams( i, 3 ) + 1) % 3 ] // boundaries Edges with only one incident triangle, as a #boundaries-by-2 // matrix of indices. Each row is organized as // [ face_index, face_vertex_index ] // such that the edge is: // F[ boundaries( i, 0 ), boundaries( i, 1 ) ], F[ boundaries( i, 0 ), (boundaries( i, 1 ) + 1) % 3 ] // foldovers Edges where the two incident triangles fold over each other // in UV-space, as a #foldovers-by-4 matrix of indices. // Each row is organized as [ forward_face_index, forward_face_vertex_index, // backwards_face_index, backwards_face_vertex_index ] // such that one side of the foldover is the edge: // F[ foldovers( i, 0 ), foldovers( i, 1 ) ], F[ foldovers( i, 0 ), (foldovers( i, 1 ) + 1) % 3 ] // and the other side is the edge: // F[ foldovers( i, 2 ), foldovers( i, 3 ) ], F[ foldovers( i, 2 ), (foldovers( i, 3 ) + 1) % 3 ])igl_Qu8mg5v7";