mirror of
https://github.com/mcneel/opennurbs.git
synced 2026-03-02 12:37:02 +08:00
Co-authored-by: Steve Baer <steve@mcneel.com> Co-authored-by: Nathan Letwory <nathan@mcneel.com> Co-authored-by: Dale Lear <dalelear@mcneel.com>
250 lines
7.0 KiB
C++
250 lines
7.0 KiB
C++
/* $NoKeywords: $ */
|
|
/*
|
|
//
|
|
// Copyright (c) 1993-2012 Robert McNeel & Associates. All rights reserved.
|
|
// OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert
|
|
// McNeel & Associates.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
|
|
// ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
|
|
// MERCHANTABILITY ARE HEREBY DISCLAIMED.
|
|
//
|
|
// For complete openNURBS copyright information see <http://www.opennurbs.org>.
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
*/
|
|
|
|
#if !defined(OPENNURBS_POINTCLOUD_INC_)
|
|
#define OPENNURBS_POINTCLOUD_INC_
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Class ON_PointCloud - unordered set of points
|
|
// ON_PointField - point height field
|
|
//
|
|
|
|
class ON_CLASS ON_PointCloud : public ON_Geometry
|
|
{
|
|
ON_OBJECT_DECLARE(ON_PointCloud);
|
|
|
|
public:
|
|
ON_PointCloud();
|
|
ON_PointCloud(
|
|
int // initial point array capacity
|
|
);
|
|
ON_PointCloud( const ON_PointCloud& );
|
|
~ON_PointCloud();
|
|
|
|
ON_PointCloud(const ON_3dPoint* P0, int count);
|
|
|
|
// 0<dim<4 stride is dim+is_rat
|
|
ON_PointCloud(const double* P0, int dim, bool is_rat, int count);
|
|
ON_PointCloud& operator=( const ON_PointCloud& );
|
|
|
|
ON_3dPoint& operator[](int);
|
|
const ON_3dPoint& operator[](int) const;
|
|
|
|
/*
|
|
Description:
|
|
Get a point cloud point from an ON_COMPONENT_INDEX.
|
|
Parameters:
|
|
ci - [in] a component index with m_typ set to ON_COMPONENT_INDEX::pointcloud_point
|
|
and 0 <= m_index and m_index < m_P.Count().
|
|
Returns:
|
|
Point at [ci.m_index] or ON_3dPoint::UnsetPoint if ci is not valid.
|
|
*/
|
|
ON_3dPoint Point( ON_COMPONENT_INDEX ci ) const;
|
|
|
|
void Destroy();
|
|
|
|
/*
|
|
Description:
|
|
Call when the memory pool used the point cloud's arrays is
|
|
no longer in existence.
|
|
*/
|
|
void EmergencyDestroy();
|
|
|
|
bool IsValid( class ON_TextLog* text_log = nullptr ) const override;
|
|
|
|
// virtual ON_Object override
|
|
void Dump( ON_TextLog& ) const override; // for debugging
|
|
|
|
// virtual ON_Object override
|
|
bool Write( ON_BinaryArchive& ) const override;
|
|
|
|
// virtual ON_Object override
|
|
bool Read( ON_BinaryArchive& ) override;
|
|
|
|
// virtual ON_Object override
|
|
ON::object_type ObjectType() const override;
|
|
|
|
// virtual ON_Geometry override
|
|
int Dimension() const override;
|
|
|
|
// virtual ON_Geometry GetBBox override
|
|
bool GetBBox( double* boxmin, double* boxmax, bool bGrowBox = false ) const override;
|
|
|
|
// virtual ON_Geometry GetTightBoundingBox override
|
|
bool GetTightBoundingBox( class ON_BoundingBox& tight_bbox, bool bGrowBox = false, const class ON_Xform* xform = nullptr ) const override;
|
|
|
|
// virtual ON_Geometry override
|
|
bool Transform(
|
|
const ON_Xform&
|
|
) override;
|
|
|
|
// virtual ON_Geometry override
|
|
bool IsDeformable() const override;
|
|
|
|
// virtual ON_Geometry override
|
|
bool MakeDeformable() override;
|
|
|
|
// virtual ON_Geometry override
|
|
bool SwapCoordinates(
|
|
int, int // indices of coords to swap
|
|
) override;
|
|
|
|
|
|
/*
|
|
Description:
|
|
Get the index of the point in the point cloud that is closest
|
|
to P.
|
|
Parameters:
|
|
P - [in]
|
|
closest_point_index - [out]
|
|
maximum_distance - [in] optional distance constraint.
|
|
If maximum_distance > 0, then only points Q with
|
|
|P-Q| <= maximum_distance are tested.
|
|
Returns:
|
|
True if a point is found; in which case *closest_point_index
|
|
is the index of the point. False if no point is found
|
|
or the input is not valid.
|
|
See Also:
|
|
ON_GetClosestPointInPointList
|
|
*/
|
|
bool GetClosestPoint(
|
|
ON_3dPoint P,
|
|
int* closest_point_index,
|
|
double maximum_distance = 0.0
|
|
) const;
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// Interface
|
|
//
|
|
int PointCount() const;
|
|
void AppendPoint( const ON_3dPoint& );
|
|
void InvalidateBoundingBox(); // call if you change values of points
|
|
|
|
// for ordered streams
|
|
void SetOrdered(bool bOrdered); // true if set is ordered stream
|
|
bool IsOrdered() const; // true if set is ordered stream
|
|
|
|
// for height fields
|
|
bool HasPlane() const; // true if set is height field above a plane
|
|
void SetPlane( const ON_Plane& );
|
|
const ON_Plane& Plane();
|
|
double Height(int);
|
|
|
|
/*
|
|
Returns:
|
|
True if m_N.Count() == m_P.Count().
|
|
*/
|
|
bool HasPointNormals() const;
|
|
|
|
/*
|
|
Returns:
|
|
True if m_C.Count() == m_P.Count().
|
|
*/
|
|
bool HasPointColors() const;
|
|
|
|
/*
|
|
Returns:
|
|
True if m_V.Count() == m_P.Count().
|
|
*/
|
|
bool HasPointValues() const;
|
|
|
|
/*
|
|
Returns:
|
|
Number of points that are hidden.
|
|
*/
|
|
int HiddenPointCount() const;
|
|
unsigned int HiddenPointUnsignedCount() const;
|
|
|
|
/*
|
|
Description:
|
|
Destroys the m_H[] array and sets m_hidden_count=0.
|
|
*/
|
|
void DestroyHiddenPointArray();
|
|
|
|
/*
|
|
Returns:
|
|
If the point cloud has some hidden points, then an array
|
|
of length PointCount() is returned and the i-th
|
|
element is true if the i-th vertex is hidden.
|
|
If no ponts are hidden, nullptr is returned.
|
|
*/
|
|
const bool* HiddenPointArray() const;
|
|
|
|
/*
|
|
Description:
|
|
Set the runtime hidden point flag.
|
|
Parameters:
|
|
point_index - [in] point vertex index
|
|
bHidden - [in] true to hide vertex
|
|
*/
|
|
void SetHiddenPointFlag( int point_index, bool bHidden );
|
|
|
|
/*
|
|
Description:
|
|
Returns true if the point is hidden. This is a runtime
|
|
setting that is not saved in 3dm files.
|
|
Parameters:
|
|
point_index - [in]
|
|
Returns:
|
|
True if the point is hidden.
|
|
*/
|
|
bool PointIsHidden( int point_index ) const;
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// Implementation
|
|
ON_3dPointArray m_P;
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// Implementation - OPTIONAL point normal
|
|
// Either m_N[] has zero count or it has the same
|
|
// count as m_P[], in which case m_N[j] reports
|
|
// the color assigned to m_P[j].
|
|
ON_SimpleArray<ON_3dVector> m_N;
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// Implementation - OPTIONAL point color
|
|
// Either m_C[] has zero count or it has the same
|
|
// count as m_P[], in which case m_C[j] reports
|
|
// the color assigned to m_P[j].
|
|
ON_SimpleArray<ON_Color> m_C;
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// Implementation - OPTIONAL point value (intensity)
|
|
// Either m_V[] has zero count or it has the same
|
|
// count as m_P[], in which case m_V[j] reports
|
|
// the value assigned to m_P[j].
|
|
ON_SimpleArray<double> m_V;
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// Implementation - RUNTIME point visibility - not saved in 3dm files.
|
|
// If m_H.Count() = m_P.Count(), then
|
|
// m_H[j] is true if the point m_P[j]
|
|
// is hidden. Otherwise, all points are visible.
|
|
// m_hidden_count = number of true values in the m_H[] array.
|
|
ON_SimpleArray<bool> m_H;
|
|
unsigned int m_hidden_count = 0;
|
|
|
|
ON_Plane m_plane;
|
|
ON_BoundingBox m_bbox;
|
|
unsigned int m_flags = 0; // bit 1 is set if ordered
|
|
// bit 2 is set if plane is set
|
|
|
|
};
|
|
|
|
#endif
|