Rhino C++ API
8.13
|
#include <opennurbs_plus.h>
Public Member Functions | |
ON_SurfaceTreeNode () | |
~ON_SurfaceTreeNode () | |
bool | AdjustParameter () const |
ON_SurfaceTreeNode * | EastNode () const |
const ON_SurfaceTreeNode * | Evaluate (double s, double t, int der_count, int v_stride, double *v, int quadrant=0) const |
const ON_SurfaceTreeNode * | FindLeaf (double s, double t, int quadrant=0) const |
const ON_SurfaceTreeNode * | GetClosestPoint (ON_3dPoint P, double *s, double *t, ON_3dPoint *closestpt=0, double maximum_distance=0.0, const ON_Interval *sdomain=0, const ON_Interval *tdomain=0) const |
int | IntersectSurface (const class ON_SurfaceTreeNode *snodeB, ON_ClassArray< ON_SSX_EVENT > &x, double intersection_tolerance=0.0, double overlap_tolerance=0.0, double fitting_tolerance=0.0, const ON_Interval *surfaceA_udomain=0, const ON_Interval *surfaceA_vdomain=0, const ON_Interval *surfaceB_udomain=0, const ON_Interval *surfaceB_vdomain=0) const |
bool | IsFartherThan (double d, const ON_3dPoint &P) const |
bool | IsFartherThan (double d, const ON_CurveTreeNode *other) const |
bool | IsFartherThan (double d, const ON_SurfaceTreeNode *other) const |
bool | IsNearSingularity (double s0, double s1) const |
bool | IsNearSingularity (double s0, double s1, int &side, double tol=1e-5) const |
bool | IsValid (ON_TextLog *text_log=0, int level=0, int side=-1, const class ON_Surface *surface=0) const |
double | MaximumDistanceUpperBound (const ON_CurveTreeNode *other) const |
double | MaximumDistanceUpperBound (const ON_SurfaceTreeNode *other) const |
double | MaximumDistanceUpperBound (ON_3dPoint P) const |
double | MinimumDistanceLowerBound (const ON_CurveTreeNode *other) const |
double | MinimumDistanceLowerBound (const ON_SurfaceTreeNode *other) const |
double | MinimumDistanceLowerBound (ON_3dPoint P) const |
double | MinimumDistanceUpperBound (const ON_CurveTreeNode *other) const |
double | MinimumDistanceUpperBound (const ON_SurfaceTreeNode *other) const |
double | MinimumDistanceUpperBound (ON_3dPoint P) const |
ON_SurfaceTreeNode * | NextLeaf () const |
ON_SurfaceTreeNode * | NorthNode () const |
ON_SurfaceTreeNode * | PrevLeaf () const |
ON_SurfaceTreeNode * | SouthNode () const |
bool | Split (int dir, double s, ON_SurfaceTreeNode &left_node, ON_SurfaceTreeNode &right_node) const |
int | SplitDir () const |
ON_SurfaceTreeNode * | TreeContaining (const ON_Interval &Urange, const ON_Interval &Vrange) const |
ON_SurfaceTreeNode * | WestNode () const |
Public Attributes | |
ON_BoundingBox | m_bbox |
ON_SurfaceTreeBezier * | m_bez |
unsigned char | m_bezmem |
ON_Interval | m_domain [2] |
ON_SurfaceTreeNode * | m_down [2] |
unsigned char | m_nodemem |
unsigned int | m_nodesn |
serial number of this node More... | |
unsigned char | m_nodetype |
Memory management accounting information. More... | |
unsigned char | m_reserved_ON_SurfaceTreeNode [5] |
keep sizeof() a multiple of 16 More... | |
unsigned int | m_treesn |
serial number of this tree More... | |
ON_SurfaceTreeNode * | m_up |
A surface tree is a simple binary tree of bezier surfaces and is used to speed up geometric calculations.
ON_SurfaceTreeNode::ON_SurfaceTreeNode | ( | ) |
ON_SurfaceTreeNode::~ON_SurfaceTreeNode | ( | ) |
bool ON_SurfaceTreeNode::AdjustParameter | ( | ) | const |
Description: Used to determine if the node's parametization differs from the tree's surface parametization. If the parameterizations are different, then use ON_Surface::GetSurfaceParameterFromNurbFormParameter to convert node parameters to surface parameters and ON_Surface::GetNurbFormParameterFromSurfaceParameter to convert surface parameters to node parameters. Returns: True if the node's parametization differs from the tree's surface parametization. See Also: ON_Surface::GetSurfaceParameterFromNurbFormParameter ON_Surface::GetNurbFormParameterFromSurfaceParameter
ON_SurfaceTreeNode* ON_SurfaceTreeNode::EastNode | ( | ) | const |
const ON_SurfaceTreeNode* ON_SurfaceTreeNode::Evaluate | ( | double | s, |
double | t, | ||
int | der_count, | ||
int | v_stride, | ||
double * | v, | ||
int | quadrant = 0 |
||
) | const |
Description: Evaluate the portion of the surface covered by this node. Parameters: s - [in] t - [in] (s,t) - evaluation parameters with respect to this node's domain. der_count - [in] (>=0) number of derivatives to evaluate v_stride - [in] stride to use for the v[] array v - [out] array of length (der_count+1)*v_stride surface(s,t) is returned in (v[0],...,v[m_dim-1]), Ds is returned in (v[v_stride],...,v[v_stride+m_dim-1]), Dt is returned in (v[2*v_stride],...,v[2*v_stride+m_dim-1]), Dss is returned in (v[3*v_stride],...), Dst is returned in (v[4*v_stride],...), Dtt is returned in (v[5*v_stride],...), etc. quadrant - [in] optional - 1,2,3 or 4 Determines which quadrant to evaluate from when (s,t) is on the side of a leaf node. Values < 1 or > 4 are treated as 1 Returns: If successful, returns a pointer to the leaf node that was used in the evaluation. If null is returned, the evaluation could not be performed. Remarks: If (s,t) is out outside this node's domain, the bezier on the appropriate side is evaluated.
const ON_SurfaceTreeNode* ON_SurfaceTreeNode::FindLeaf | ( | double | s, |
double | t, | ||
int | quadrant = 0 |
||
) | const |
Description: Starting at this node, find the leaf node whose domain contains that parameter (s,t). Parameters: t - [in] quadrant - [in] optional - 1,2,3 or 4 Determines which quadrant to use from when (s,t) is on the side of a leaf node. Values < 1 or > 4 are treated as 1 Returns: Pointer to the node that contains (s,t). If (s,t) is outside this node's domain, then the leaf closest to (s,t) is returned.
const ON_SurfaceTreeNode* ON_SurfaceTreeNode::GetClosestPoint | ( | ON_3dPoint | P, |
double * | s, | ||
double * | t, | ||
ON_3dPoint * | closestpt = 0 , |
||
double | maximum_distance = 0.0 , |
||
const ON_Interval * | sdomain = 0 , |
||
const ON_Interval * | tdomain = 0 |
||
) | const |
int ON_SurfaceTreeNode::IntersectSurface | ( | const class ON_SurfaceTreeNode * | snodeB, |
ON_ClassArray< ON_SSX_EVENT > & | x, | ||
double | intersection_tolerance = 0.0 , |
||
double | overlap_tolerance = 0.0 , |
||
double | fitting_tolerance = 0.0 , |
||
const ON_Interval * | surfaceA_udomain = 0 , |
||
const ON_Interval * | surfaceA_vdomain = 0 , |
||
const ON_Interval * | surfaceB_udomain = 0 , |
||
const ON_Interval * | surfaceB_vdomain = 0 |
||
) | const |
bool ON_SurfaceTreeNode::IsFartherThan | ( | double | d, |
const ON_3dPoint & | P | ||
) | const |
Description: Quickly determine if the shortest distance from the portion of the surface covered by this node to the other object is greater than d. Parameters: d - [in] distance (> 0.0) P - [in] other - [in] Returns: True if if the shortest distance from this node to the other object is greater than d. Put another way, true if returned if for every point Q on the portion of the surface covered by this node and for every point P on the other object Q.DistanceTo(P) > d. Remarks: This is conceptually the same but faster than calling MinimumDistanceUpperBound(other) > d.
bool ON_SurfaceTreeNode::IsFartherThan | ( | double | d, |
const ON_CurveTreeNode * | other | ||
) | const |
bool ON_SurfaceTreeNode::IsFartherThan | ( | double | d, |
const ON_SurfaceTreeNode * | other | ||
) | const |
bool ON_SurfaceTreeNode::IsNearSingularity | ( | double | s0, |
double | s1 | ||
) | const |
Description: Test normalized span parameters to see if they are near a singularity. Parameters: s0 - [in] 0 <= s1 <= 1 s1 - [in] 0 <= s1 <= 1 side - [out] If true south, 1 = east, 2 = north, 3 = west tolerance of normalized parameter Returns: True if the parameters are near a singularity.
bool ON_SurfaceTreeNode::IsNearSingularity | ( | double | s0, |
double | s1, | ||
int & | side, | ||
double | tol = 1e-5 |
||
) | const |
bool ON_SurfaceTreeNode::IsValid | ( | ON_TextLog * | text_log = 0 , |
int | level = 0 , |
||
int | side = -1 , |
||
const class ON_Surface * | surface = 0 |
||
) | const |
double ON_SurfaceTreeNode::MaximumDistanceUpperBound | ( | const ON_CurveTreeNode * | other | ) | const |
double ON_SurfaceTreeNode::MaximumDistanceUpperBound | ( | const ON_SurfaceTreeNode * | other | ) | const |
double ON_SurfaceTreeNode::MaximumDistanceUpperBound | ( | ON_3dPoint | P | ) | const |
Description: Quickly find an upper bound on the longest distance this surface node to the other object. Parameters: P - [in] other - [in] Returns: A distance that is greater than or equal to the longest distance from this surface node to the other object. Put another way, if Q is any point on the portion of the surface covered by this node and P is any point on the other object, then P.DistanceTo(Q) <= MaximumDistanceTo(P);
double ON_SurfaceTreeNode::MinimumDistanceLowerBound | ( | const ON_CurveTreeNode * | other | ) | const |
double ON_SurfaceTreeNode::MinimumDistanceLowerBound | ( | const ON_SurfaceTreeNode * | other | ) | const |
double ON_SurfaceTreeNode::MinimumDistanceLowerBound | ( | ON_3dPoint | P | ) | const |
Description: Quickly find a lower bound on the distance from a P to the portion of the curve covered by this node. Parameters: P - [in] Returns: A distance that is less than or equal to the shortest distance from P to a point on the curve covered by this node. Put another way, if Q is any point on the portion of the curve covered by this node, then P.DistanceTo(Q) >= MinimumDistanceTo(P);
double ON_SurfaceTreeNode::MinimumDistanceUpperBound | ( | const ON_CurveTreeNode * | other | ) | const |
double ON_SurfaceTreeNode::MinimumDistanceUpperBound | ( | const ON_SurfaceTreeNode * | other | ) | const |
double ON_SurfaceTreeNode::MinimumDistanceUpperBound | ( | ON_3dPoint | P | ) | const |
Description: Quickly find an upper bound on the shortest distance from this curve node to the other object. Parameters: P - [in] other - [in] Returns: A distance that is greater than or equal to the shortest distance from this surface node to the other object. Put another way, there exists a point Q on the portion of the surface covered by this node and a point P on the other object such that P.DistanceTo(Q) <= MinimumDistanceUpperBound();
ON_SurfaceTreeNode* ON_SurfaceTreeNode::NextLeaf | ( | ) | const |
Next() moves to the next leaf interval in the surface tree if this node is a leaf node.
ON_SurfaceTreeNode* ON_SurfaceTreeNode::NorthNode | ( | ) | const |
For any SurfaceTreeNode, not just leafs, the NorthNode(), SouthNode(), EastNode() and WestNode() functions returns a pointer to the SurfaceTreeNode of the neighboring region. For example, for any SurfaceTreeNode N with non-null N.NorthNode() we have the relations N.NorthNode()->Domain[0].Includes( N.Domain[0] ) and N.NorthNode()->Domain[1][0] == N.Domain[1][1] Remark: The periodicity of the surface is not considered. So for example every surface has a northern most leaf for which NorthSide() will return nullptr.
ON_SurfaceTreeNode* ON_SurfaceTreeNode::PrevLeaf | ( | ) | const |
Prev() moves to the previous leaf interval in the curve tree if this node is a leaf node.
ON_SurfaceTreeNode* ON_SurfaceTreeNode::SouthNode | ( | ) | const |
bool ON_SurfaceTreeNode::Split | ( | int | dir, |
double | s, | ||
ON_SurfaceTreeNode & | left_node, | ||
ON_SurfaceTreeNode & | right_node | ||
) | const |
Description: Expert user tool to split a surface tree node. Does not modify this node's m_down[] pointers or left and right's m_up pointers. Care must be take to gaurd against memory leaks and double deletes. Parameters: dir - [in] 0 = split first parameter direction 1 = split second parameter direction s - [in] normalized (bezier parameter) 0 < s < 1 The corresponding surface domain parameter is m_domain[dir].ParameterAt(s). left_node - [in] node to hold the left half. right_node - [in] node to hold the right half. Returns: True if input is valid and split was performed.
int ON_SurfaceTreeNode::SplitDir | ( | ) | const |
Description: Reports the direction this node was split or would be split. Parameters: Returns: 0: the node was split in the "u" direction 1: the node was split in the "v" direction -1: otherwise
ON_SurfaceTreeNode* ON_SurfaceTreeNode::TreeContaining | ( | const ON_Interval & | Urange, |
const ON_Interval & | Vrange | ||
) | const |
Description: Find the smallest node that contains the specified parameter range. Parameters: Urange - [in] Vrange - [in] Returns: A pointer to the smallest child node (possibly this) that contains the specified parameter range or nullptr if no such node exists.
ON_SurfaceTreeNode* ON_SurfaceTreeNode::WestNode | ( | ) | const |
ON_BoundingBox ON_SurfaceTreeNode::m_bbox |
Bounding box of the portion of the surface with domain [m_domain.Min(), m_domain.Max()]
ON_SurfaceTreeBezier* ON_SurfaceTreeNode::m_bez |
All leaf nodes have a bezier. Non-leaf nodes may have a nullptr here. The domain of m_bez is always [0,1]x[0,1] and m_domain[] records the portion of the surface that this bezier surface corresponds to.
unsigned char ON_SurfaceTreeNode::m_bezmem |
0 = do not destroy 1 = destroy with delete 2 = destroy with free
ON_Interval ON_SurfaceTreeNode::m_domain[2] |
m_domain records the portion of the surface's domain that this node defines. It is always increasing.
ON_SurfaceTreeNode* ON_SurfaceTreeNode::m_down[2] |
m_down[] moves towards the leaf nodes. Either both m_down[0] and m_down[1] are nullptr, or both are not nullptr. If m_split_dir=0, m_domain is partitioned into a left portion m_down[0]->m_domain and a right portion m_down[1]->m_domain. If m_split_dir=1 m_domain is partitioned into a lower portion m_down[0]->m_domain and an upper portion m_down[1]->m_domain.
unsigned char ON_SurfaceTreeNode::m_nodemem |
0 = do not destroy 1 = destroy with delete 2 = destroy with free
unsigned int ON_SurfaceTreeNode::m_nodesn |
serial number of this node
unsigned char ON_SurfaceTreeNode::m_nodetype |
Memory management accounting information.
8 bits to flag special nodes 1 = root node 2 = meta node (no domain) 4 = beizer parameterization != surface parameterization 8 = south side is singular point 16 = east side is singular point 32 = north side is singular point 64 = west side is singular point
unsigned char ON_SurfaceTreeNode::m_reserved_ON_SurfaceTreeNode[5] |
keep sizeof() a multiple of 16
unsigned int ON_SurfaceTreeNode::m_treesn |
serial number of this tree
ON_SurfaceTreeNode* ON_SurfaceTreeNode::m_up |
m_up moves towards the root node. If m_up is nullptr, the node is the root node.