You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.4 KiB
97 lines
3.4 KiB
// This file is part of libigl, a simple c++ geometry processing library.
|
|
//
|
|
// Copyright (C) 2023 Alec Jacobson <alecjacobson@gmail.com>
|
|
//
|
|
// 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/.
|
|
|
|
|
|
#ifndef IGL_ISOLINES_INTRINSIC_H
|
|
#define IGL_ISOLINES_INTRINSIC_H
|
|
#include "igl_inline.h"
|
|
|
|
#include <Eigen/Core>
|
|
|
|
|
|
namespace igl
|
|
{
|
|
/// Compute isolines of a scalar field on a triangle mesh intrinsically.
|
|
///
|
|
/// See isolines.h for details.
|
|
///
|
|
/// @param[in] F #F by 3 list of mesh triangle indices into some V
|
|
/// @param[in] S #S by 1 list of per-vertex scalar values
|
|
/// @param[in] vals #vals by 1 list of values to compute isolines for
|
|
/// @param[out] iB #iB by 3 list of barycentric coordinates so that
|
|
/// iV.row(i) = iB(i,0)*V.row(F(iFI(i,0)) +
|
|
/// iB(i,1)*V.row(F(iFI(i,1)) +
|
|
/// iB(i,2)*V.row(F(iFI(i,2))
|
|
/// @param[out] iF #iB list of triangle indices for each row of iB (all
|
|
/// points will either lie on an edge or vertex: an arbitrary incident face
|
|
/// will be given).
|
|
/// @param[out] iE #iE by 2 list of edge indices into iB
|
|
/// @param[out] I #iE by 1 list of indices into vals indicating which value
|
|
/// each segment belongs to
|
|
///
|
|
/// \see isolines, edge_crossings
|
|
template <
|
|
typename DerivedF,
|
|
typename DerivedS,
|
|
typename Derivedvals,
|
|
typename DerivediB,
|
|
typename DerivediFI,
|
|
typename DerivediE,
|
|
typename DerivedI>
|
|
void isolines_intrinsic(
|
|
const Eigen::MatrixBase<DerivedF> & F,
|
|
const Eigen::MatrixBase<DerivedS> & S,
|
|
const Eigen::MatrixBase<Derivedvals> & vals,
|
|
Eigen::PlainObjectBase<DerivediB> & iB,
|
|
Eigen::PlainObjectBase<DerivediFI> & iFI,
|
|
Eigen::PlainObjectBase<DerivediE> & iE,
|
|
Eigen::PlainObjectBase<DerivedI> & I);
|
|
/// \overload
|
|
///
|
|
/// @param[in] val scalar value to compute isoline at
|
|
/// @param[in] uE #uE by 2 list of unique undirected edges
|
|
/// @param[in] EMAP #F*3 list of indices into uE, mapping each directed edge to unique
|
|
/// undirected edge so that uE(EMAP(f+#F*c)) is the unique edge
|
|
/// corresponding to E.row(f+#F*c)
|
|
/// @param[in] uEC #uE+1 list of cumulative counts of directed edges sharing each
|
|
/// unique edge so the uEC(i+1)-uEC(i) is the number of directed edges
|
|
/// sharing the ith unique edge.
|
|
/// @param[in] uEE #E list of indices into E, so that the consecutive segment of
|
|
/// indices uEE.segment(uEC(i),uEC(i+1)-uEC(i)) lists all directed edges
|
|
/// sharing the ith unique edge.
|
|
///
|
|
/// \see unique_edge_map
|
|
template <
|
|
typename DerivedF,
|
|
typename DerivedS,
|
|
typename DeriveduE,
|
|
typename DerivedEMAP,
|
|
typename DeriveduEC,
|
|
typename DeriveduEE,
|
|
typename DerivediB,
|
|
typename DerivediFI,
|
|
typename DerivediE>
|
|
void isolines_intrinsic(
|
|
const Eigen::MatrixBase<DerivedF> & F,
|
|
const Eigen::MatrixBase<DerivedS> & S,
|
|
const Eigen::MatrixBase<DeriveduE> & uE,
|
|
const Eigen::MatrixBase<DerivedEMAP> & EMAP,
|
|
const Eigen::MatrixBase<DeriveduEC> & uEC,
|
|
const Eigen::MatrixBase<DeriveduEE> & uEE,
|
|
const typename DerivedS::Scalar val,
|
|
Eigen::PlainObjectBase<DerivediB> & iB,
|
|
Eigen::PlainObjectBase<DerivediFI> & iFI,
|
|
Eigen::PlainObjectBase<DerivediE> & iE);
|
|
}
|
|
|
|
#ifndef IGL_STATIC_LIBRARY
|
|
# include "isolines_intrinsic.cpp"
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|