Files
opennurbs/opennurbs_pointcloud.h
Bozo The Builder 799431a63b Sync changes from upstream repository
Co-authored-by: Steve Baer <steve@mcneel.com>
Co-authored-by: Nathan Letwory <nathan@mcneel.com>
Co-authored-by: Dale Lear <dalelear@mcneel.com>
2019-11-06 16:24:57 +00:00

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