Rhino C++ API
8.14
|
#include <opennurbs_subd.h>
Public Member Functions | |
ON_SubDMatrix ()=default | |
bool | EvaluateSubdivisionPoint (unsigned int component_index, const double *point_ring, size_t point_ring_count, size_t point_ring_stride, double subd_point[3]) const |
bool | EvaluateSurfacePoint (const double *point_ring, size_t point_ring_count, size_t point_ring_stride, bool bUndefinedNormalIsPossible, class ON_SubDSectorSurfacePoint &limit_point) const |
bool | EvaluateSurfacePoint (const double *point_ring, size_t point_ring_count, size_t point_ring_stride, bool bUndefinedNormalIsPossible, double limit_point[3], double limit_tangent1[3], double limit_tangent2[3], double limit_normal[3]) const |
bool | IsValid () const |
bool | IsValidPointRing (const double *point_ring, size_t point_ring_count, size_t point_ring_stride) const |
unsigned int | SetFromSectorType (ON_SubDSectorType sector_type) |
double | TestComponentRing (const ON_SubDComponentPtr *component_ring, size_t component_ring_count) const |
double | TestEvaluation () const |
double | TestMatrix () const |
Static Public Member Functions | |
static bool | EvaluateCosAndSin (unsigned int j, unsigned int n, double *cos_theta, double *sin_theta) |
static const ON_SubDMatrix & | FromCache (ON_SubDSectorType sector_type) |
static double | TestEvaluation (const unsigned int subd_recursion_count, ON_SubDSectorIterator sit, ON_SimpleArray< ON_SubDComponentPtr > &component_ring, ON_SimpleArray< ON_3dPoint > &subd_points, class ON_SubDSectorSurfacePoint &limit_point) |
static double | TestEvaluation (ON_SubDSectorType sector_type, unsigned int minimum_sector_face_count, unsigned int maximum_sector_face_count, ON_TextLog *text_log) |
Public Attributes | |
const double * | m_L1 = nullptr |
const double * | m_L2 = nullptr |
const double * | m_LP = nullptr |
unsigned int | m_R = 0 |
the matrix m_S is m_R x m_R (m_R = m_sector_type.PointRingCount()) More... | |
const double *const * | m_S = nullptr |
ON_SubDSectorType | m_sector_type |
Static Public Attributes | |
static const ON_SubDMatrix | Empty |
|
default |
|
static |
Description: Precise evaluation of cos(a) and cos(a) where a = i/n pi. These values are required for high qualitiy limit surface evaluation. Parameters: j - [in] n - [in] cos_theta - [out] cos(j/n pi) sin_theta - [out] sin(j/n pi)
bool ON_SubDMatrix::EvaluateSubdivisionPoint | ( | unsigned int | component_index, |
const double * | point_ring, | ||
size_t | point_ring_count, | ||
size_t | point_ring_stride, | ||
double | subd_point[3] | ||
) | const |
bool ON_SubDMatrix::EvaluateSurfacePoint | ( | const double * | point_ring, |
size_t | point_ring_count, | ||
size_t | point_ring_stride, | ||
bool | bUndefinedNormalIsPossible, | ||
class ON_SubDSectorSurfacePoint & | limit_point | ||
) | const |
bool ON_SubDMatrix::EvaluateSurfacePoint | ( | const double * | point_ring, |
size_t | point_ring_count, | ||
size_t | point_ring_stride, | ||
bool | bUndefinedNormalIsPossible, | ||
double | limit_point[3], | ||
double | limit_tangent1[3], | ||
double | limit_tangent2[3], | ||
double | limit_normal[3] | ||
) | const |
|
static |
Description: Get the subdivision matrix information for the case specified by the input parameters. This information is retrieved from a cache. In some cases, it will be calculated the first time it is needed.
Parameters: facet_type - [in] vertex_tag - [in] valence - [in] The input parameters identify the subdivision case. Remarks: Every member function of ON_SubDMatrix, including this one is thread safe.
bool ON_SubDMatrix::IsValid | ( | ) | const |
bool ON_SubDMatrix::IsValidPointRing | ( | const double * | point_ring, |
size_t | point_ring_count, | ||
size_t | point_ring_stride | ||
) | const |
unsigned int ON_SubDMatrix::SetFromSectorType | ( | ON_SubDSectorType | sector_type | ) |
Description: Set the values in this ON_SubDMatrix so the information can be used to evaluate the case identified by the input parameters. Parameters: facet_type - [in] vertex_tag - [in] sector_edge_count - [in] The input parameters identify the subdivision case. Returns: R > 0: Success. The matrix is R x R. 0: Failure.
double ON_SubDMatrix::TestComponentRing | ( | const ON_SubDComponentPtr * | component_ring, |
size_t | component_ring_count | ||
) | const |
double ON_SubDMatrix::TestEvaluation | ( | ) | const |
Description: Run evaluation tests on this subdivision case. Returns: >= 0.0: Test passed. Maximum deviation found in any test is returned. ON_UNSET_VALUE: Test failed.
|
static |
Description: Test cached subdivision matrix on sector identified by sit. Parameters: subd_type - [in] subd_recursion_count - [in] number of times to subdivide sit - [in] vertex to subdivide component_ring - [out] subd_points - [out] limit_point - [out] limit_tangent0 - [out] limit_tangent1 - [out] limit_normal - [out]
|
static |
Description: Run evaluation tests on a range of subdivision cases. Parameters: sector_type - [in] If ON_SubDSectorType::Empty, then all supported sector types types are tested. minimum_sector_face_count - [in] If 0, then testing begins at ON_SubDSectorType::MinimumSectorFaceCount(vertex_tag) when testing vertex_tag types maximum_sector_face_count - [in] If 0, then testing stops at ON_SubD::maximum_evaluation_valence. text_log - [out] If not nullptr, then a brief written report is printed for each test case. Returns: >= 0.0: Test passed. Maximum deviation found in any test is returned. ON_UNSET_VALUE: Test failed.
double ON_SubDMatrix::TestMatrix | ( | ) | const |
Returns: ON_UNSET_VALUE - serious error >= 0: Maximum value of numbers that should be zero in and ideal world.
When the matrices, eigenvalues and eigenvectors are correctly calculated, this returned value is in the range from 1e-16 to 5e-13 as valence goes from 3 to 100. For valences < 100, if a value larger than 1.0e-12 occurs, there is a bug in the code.
|
static |
const double* ON_SubDMatrix::m_L1 = nullptr |
m_L1 and m_L2 = tangent space evaluation vectors. The arrays m_L1[] and m_L2[] have m_R elements. If (vertexR[0], ..., vertexR[R-1]) is a list of standard vertex ring points, then the two vectors V1 = m_L1[0]*vertexR[0] + ... + m_L1[R-1]*vertexR[R-1]. V2 = m_L2[0]*vertexR[0] + ... + m_L2[R-1]*vertexR[R-1]. span the tangent plane and N = V1 x V2 is perpendicular to the limit tangent plane. In general and almost always in practice, V1 and V2 are not unit vectors and it is best to normalize V1 and V2 before taking the cross product. m_L1 and m_L2 are subdominant eigenvectors of Transpose(m_S). When the subdominant eigenvalue has geometric multiplicity 2, m_L1 and m_L2 span the same space as m_E1 and m_E2. The values stored in m_L1 and m_L2 are chosen to provide accurate evaluation. In come common cases m_L1 and m_L2 are equal to m_E1 and m_E2, but not in all cases.
const double* ON_SubDMatrix::m_L2 = nullptr |
const double* ON_SubDMatrix::m_LP = nullptr |
m_LP[] = limit point evaluation vector. The array m_LP[] has m_R elements. If (vertexR[0], ..., vertexR[R-1]) is a list of standard vertex ring points, then Limit point = m_LP[0]*vertexR[0] + ... + m_LP[R-1]*vertexR[R-1]. m_LP is the eigenvector of Transpose(m_S) with eigenvalue = 1. Length(m_LP) = 1.
unsigned int ON_SubDMatrix::m_R = 0 |
the matrix m_S is m_R x m_R (m_R = m_sector_type.PointRingCount())
const double* const* ON_SubDMatrix::m_S = nullptr |
The term "standard vertex ring points" is used below.
Let "C" be an interior vertex (m_vertex_tag is smooth or dart), (E[0], ...., E[N-1]) is a radially sorted list of its edges, (F[0], ..., F[N-1]) is a radially sorted list of its faces (F[i] is between E[i] and E[(i+1)N]), (P[0], ..., P[N-1]) are the vertices on the edges opposide Cn (P[i] is on E[i].
C is a "standard" smooth vertex if all edges E[i] are smooth with sharpness = 0, and all faces f[i] are quads.
C is a "standard" dart vertex if edge E[0] is a crease, edges E[1], ..., E[N-1] are smooth with sharpness = 0,
and all faces F[i] are quads. /// If If "C" is a boundary vertex (m_vertex_tag is crease or corner), the conditions listed above are satisfied except E[0] and E[N-1] are crease edges, E[1], ..., E[N-2] are smooth edges with sharpness = 0, and faces f[0], ..., F[N-2] are quads.
If C is a standard interior smooth or dart vertex, then the "standard vertex ring" is the list of 2*N+1 points (C, P[0], Q[0], ...., P[N-1], Q[N-1]), where Q[I] is the vertex of quad F[i] diagonally across from C.
If C is a standard boundary vertex, then the "standard vertex ring" is the list of 2*N points (C, P[0], Q[0], ...., P[N-1]). m_S = R x R subdivision matrix If (vertexR[0], ..., vertexR[R-1]) is a list of standard vertex ring points, then then the location of the subdivided ring points (vertexR1[0], ..., vertexR1[R-1]) can be calculated from m_S. vertexR1[i] = m_S[i][0]*vertexR[0] + ... + m_S[i][R-1]*vertexR[R-1]
ON_SubDSectorType ON_SubDMatrix::m_sector_type |