86f4bb48be
- C3d aggiornamento delle librerie ( 117960).
1312 lines
71 KiB
C++
1312 lines
71 KiB
C++
////////////////////////////////////////////////////////////////////////////////
|
|
/**
|
|
\file
|
|
\brief \ru Построение контуров.
|
|
\en Contours construction. \~
|
|
|
|
*/
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef __CONTOUR_GRAPH_H
|
|
#define __CONTOUR_GRAPH_H
|
|
|
|
|
|
#include <templ_p_array.h>
|
|
#include <cur_contour.h>
|
|
#include <curve.h> // for PlaneCurveSPtr
|
|
#include <map>
|
|
|
|
|
|
class MATH_CLASS MpEdge;
|
|
class MATH_CLASS ProgressBarWrapper;
|
|
class IProgressIndicator;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Вершина.
|
|
\en Vertex. \~
|
|
\details \ru Вершина цикла. Соединяет два ребра цикла - предыдущее и следующее.\n
|
|
\en Vertex of a loop. Connects two edges of a loop - the previous and the next one.\n \~
|
|
\ingroup Algorithms_2D
|
|
*/
|
|
// ---
|
|
class MATH_CLASS MpVertex : public TapeBase {
|
|
private:
|
|
MbCartPoint point; ///< \ru Точка. \en A point.
|
|
MpEdge * begEdge; ///< \ru Предыдущее ребро. \en The previous edge.
|
|
MpEdge * endEdge; ///< \ru Последующее ребро. \en The next edge.
|
|
|
|
public:
|
|
/// \ru Конструктор по точке. \en Constructor by point.
|
|
MpVertex( const MbCartPoint & initP )
|
|
: point( initP )
|
|
, begEdge( nullptr )
|
|
, endEdge( nullptr )
|
|
{}
|
|
|
|
/// \ru Деструктор. \en Destructor.
|
|
virtual ~MpVertex();
|
|
|
|
/**\ru \name Операции с вершиной.
|
|
\en \name Operations on vertex.
|
|
\{ */
|
|
|
|
/// \ru Выдать декартову точку вершины. \en Get the Cartesian point of a vertex.
|
|
const MbCartPoint & GetCartPoint() const { return point; }
|
|
/// \ru Выдать декартову точку вершины. \en Get the Cartesian point of a vertex.
|
|
void GetCartPoint( MbCartPoint & cp ) const { cp = point; }
|
|
/// \ru Установить декартову точку вершины. \en Set the Cartesian point of a vertex.
|
|
void SetCartPoint( MbCartPoint & cp ) { point = cp; }
|
|
/** \} */
|
|
/**\ru \name Операции с указателями на ребра.
|
|
\en \name Operations on pointers to edges.
|
|
\{ */
|
|
/// \ru Изменить предыдущее ребро. \en Change the previous edge.
|
|
void SetBegEdge( MpEdge * edge ) { begEdge = edge; }
|
|
/// \ru Изменить последующее ребро. \en Change the next edge.
|
|
void SetEndEdge( MpEdge * edge ) { endEdge = edge; }
|
|
/// \ru Предыдущее ребро. \en The previous edge.
|
|
MpEdge * GetBegEdge() const { return begEdge; }
|
|
/// \ru Последующее ребро. \en The next edge.
|
|
MpEdge * GetEndEdge() const { return endEdge; }
|
|
/** \} */
|
|
/**\ru \name Операции преобразования.
|
|
\en \name Transformation operations.
|
|
\{ */
|
|
|
|
/** \brief \ru Преобразовать.
|
|
\en Transform. \~
|
|
\details \ru Преобразовать в соответствии с матрицей.\n
|
|
\en Transform according to the matrix.\n \~
|
|
\param[in] matr - \ru Матрица трансформации.
|
|
\en Transformation matrix. \~
|
|
*/
|
|
void Transform( const MbMatrix & matr );
|
|
|
|
/** \brief \ru Переместить.
|
|
\en Move. \~
|
|
\details \ru Переместить на вектор.\n
|
|
\en Move by a vector.\n \~
|
|
\param[in] to - \ru Вектор перемещения.
|
|
\en Movement vector. \~
|
|
*/
|
|
void Move( const MbVector & to );
|
|
|
|
/** \brief \ru Повернуть.
|
|
\en Rotate. \~
|
|
\details \ru Повернуть на угол вокруг точки.\n
|
|
\en Rotate at angle around a point.\n \~
|
|
\param[in] pnt - \ru Точка - центр поворота.
|
|
\en A point is a rotation center. \~
|
|
\param[in] angle - \ru Двумерный нормализованный вектор, задающий угол вращения.
|
|
\en A two-dimensional normalized vector determining the rotation angle. \~
|
|
*/
|
|
void Rotate( const MbCartPoint & pnt, const MbDirection & angle );
|
|
/** \} */
|
|
|
|
private:
|
|
MpVertex( const MpVertex & ); // \ru Не реализовано \en Not implemented
|
|
void operator = ( const MpVertex & ); // \ru Не реализовано \en Not implemented
|
|
|
|
DECLARE_PERSISTENT_CLASS_NEW_DEL ( MpVertex )
|
|
}; // MpVertex
|
|
|
|
IMPL_PERSISTENT_OPS( MpVertex )
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Ребро.
|
|
\en Edge. \~
|
|
\details \ru Ребро цикла.\n
|
|
\en A loop edge.\n \~
|
|
\ingroup Algorithms_2D
|
|
*/
|
|
// ---
|
|
class MATH_CLASS MpEdge : public TapeBase {
|
|
private :
|
|
const MbCurve * baseCurve; ///< \ru Базовая кривая. \en The base curve.
|
|
ptrdiff_t name; ///< \ru Имя базовой кривой. \en The base curve name.
|
|
double tBeg; ///< \ru Параметр начала ребра. \en The edge start parameter.
|
|
double tEnd; ///< \ru Параметр конца ребра. \en The edge end parameter.
|
|
bool sense; ///< \ru Признак совпадения направления с кривой. \en Flag of coincidence of direction with the curve.
|
|
uint type; ///< \ru Тип кривой. \en Curve type.
|
|
MpVertex * begVertex; ///< \ru Вершина-начало. \en The start vertex.
|
|
MpVertex * endVertex; ///< \ru Вершина-конец. \en The end vertex.
|
|
|
|
public:
|
|
|
|
/** \brief \ru Конструктор.
|
|
\en Constructor. \~
|
|
\details \ru Конструктор по кривой.\n
|
|
\en Constructor by curve.\n \~
|
|
\param[in] c - \ru Базовая кривая.
|
|
\en Base curve. \~
|
|
\param[in] t1 - \ru Начальный параметр ребра.
|
|
\en The edge start parameter. \~
|
|
\param[in] t2 - \ru Конечный параметр ребра.
|
|
\en The edge end parameter. \~
|
|
\param[in] s - \ru Признак совпадения направления с кривой.
|
|
\en Flag of coincidence of direction and the curve. \~
|
|
*/
|
|
MpEdge( const MbCurve * c, double t1, double t2, bool s );
|
|
|
|
/** \brief \ru Конструктор.
|
|
\en Constructor. \~
|
|
\details \ru Конструктор по кривой.\n
|
|
\en Constructor by curve.\n \~
|
|
\param[in] c - \ru Базовая кривая.
|
|
\en Base curve. \~
|
|
\param[in] s - \ru Признак совпадения направления с кривой.
|
|
\en Flag of coincidence of direction and the curve. \~
|
|
*/
|
|
MpEdge( const MbCurve * c, bool s );
|
|
|
|
/// \ru Копирующий конструктор. \en Copy-constructor.
|
|
MpEdge( const MpEdge & );
|
|
|
|
/** \brief \ru Конструктор.
|
|
\en Constructor. \~
|
|
\details \ru Конструктор ребра с нулевой базовой кривой.\n
|
|
\en Constructor of edge with null base curve.\n \~
|
|
\param[in] t1 - \ru Начальный параметр ребра.
|
|
\en The edge start parameter. \~
|
|
\param[in] t2 - \ru Конечный параметр ребра.
|
|
\en The edge end parameter. \~
|
|
\param[in] s - \ru Признак совпадения направления с кривой.
|
|
\en Flag of coincidence of direction and the curve. \~
|
|
\param[in] n - \ru Имя базовой кривой.
|
|
\en The base curve name. \~
|
|
\param[in] t - \ru Тип кривой.
|
|
\en A curve type. \~
|
|
*/
|
|
MpEdge( double t1, double t2, bool s, ptrdiff_t n, uint t );
|
|
|
|
/// \ru Деструктор. \en Destructor.
|
|
virtual ~MpEdge();
|
|
|
|
/**\ru \name Функции доступа к данным.
|
|
\en \name Functions for access to data.
|
|
\{ */
|
|
/// \ru Выдать кривую, по которой проходит ребро. \en Get the curve the edge passes through.
|
|
const MbCurve * GetCurve() const { return baseCurve; }
|
|
/// \ru Имя базовой кривой. \en The base curve name.
|
|
ptrdiff_t GetName() const { return name; }
|
|
/// \ru Выдать направление по отношению к кривой. \en Get the direction relative to the curve.
|
|
bool GetSense() const { return sense; }
|
|
/// \ru Выдать вершину-начало. \en Get the start vertex.
|
|
MpVertex * GetBegVertex() const { return begVertex; }
|
|
/// \ru Выдать вершину-конец. \en Get the end vertex.
|
|
MpVertex * GetEndVertex() const { return endVertex; }
|
|
/// \ru Начальный параметр. \en Get the start parameter.
|
|
double GetTBeg() const { return tBeg; }
|
|
/// \ru Конечный параметр. \en End parameter.
|
|
double GetTEnd() const { return tEnd; }
|
|
/// \ru Тип кривой. \en Curve type.
|
|
uint GetType() const { return type; }
|
|
|
|
/// \ru Выдать декартову точку вершины-начала. \en Get the Cartesian point of the start vertex.
|
|
void GetBegPoint( MbCartPoint & cp ) const;
|
|
/// \ru Выдать декартову точку вершины-конца. \en Get the Cartesian point of the end vertex.
|
|
void GetEndPoint( MbCartPoint & cp ) const;
|
|
/// \ru Выдать касательный вектор в начальной вершине. \en Get the tangent vector at the start point.
|
|
void GetBegTangent( MbDirection & tan ) const;
|
|
/// \ru Выдать касательный вектор в конечной вершине. \en Get the tangent vector at the end vertex.
|
|
void GetEndTangent( MbDirection & tan ) const;
|
|
/// \ru Выдать кривизну в начальной вершине. \en Get the curvature at the start point.
|
|
double GetBegCurvature() const;
|
|
/// \ru Выдать кривизну в конечной вершине. \en Get the curvature at the end point.
|
|
double GetEndCurvature() const;
|
|
/** \} */
|
|
/**\ru \name Функции изменения данных.
|
|
\en \name Functions for changing data.
|
|
\{ */
|
|
/// \ru Выдать кривую, по которой проходит ребро. \en Get the curve the edge passes through.
|
|
void SetCurve( const MbCurve * newCurve ) { baseCurve = newCurve; }
|
|
/// \ru Установить имя базовой кривой. \en Set name of the base curve.
|
|
void SetName( ptrdiff_t n ) { name = n; }
|
|
/// \ru Установить направление по отношению к кривой. \en Set the direction relative to the curve.
|
|
void SetSense( bool s ) { sense = s; }
|
|
/// \ru Установить вершину-начало. \en Set the start vertex.
|
|
void SetBegVertex( MpVertex * vert ) { begVertex = vert; }
|
|
/// \ru Установить вершину-конец. \en Set the end vertex.
|
|
void SetEndVertex( MpVertex * vert ) { endVertex = vert; }
|
|
/// \ru Установить начальный параметр. \en Set the start parameter.
|
|
void SetTBeg( double t ) { tBeg = t; }
|
|
/// \ru Установить конечный параметр. \en Set the end parameter.
|
|
void SetTEnd( double t ) { tEnd = t; }
|
|
|
|
/// \ru Изменить ориентацию. \en Change the orientation.
|
|
void Reverse();
|
|
/// \ru Создать кривую. \en Create a curve.
|
|
MbCurve * MakeCurve() const;
|
|
/** \} */
|
|
/**\ru \name Операции преобразования.
|
|
\en \name Transformation operations.
|
|
\{ */
|
|
|
|
/** \brief \ru Преобразовать.
|
|
\en Transform. \~
|
|
\details \ru Преобразовать в соответствии с матрицей.\n
|
|
\en Transform according to the matrix.\n \~
|
|
\param[in] matr - \ru Матрица трансформации.
|
|
\en Transformation matrix. \~
|
|
*/
|
|
void Transform( const MbMatrix & matr );
|
|
|
|
/** \brief \ru Переместить.
|
|
\en Move. \~
|
|
\details \ru Переместить на вектор.\n
|
|
\en Move by a vector.\n \~
|
|
\param[in] to - \ru Вектор перемещения.
|
|
\en Movement vector. \~
|
|
*/
|
|
void Move( const MbVector & to );
|
|
|
|
/** \brief \ru Повернуть.
|
|
\en Rotate. \~
|
|
\details \ru Повернуть на угол вокруг точки.\n
|
|
\en Rotate at angle around a point.\n \~
|
|
\param[in] pnt - \ru Точка - центр поворота.
|
|
\en A point is a rotation center. \~
|
|
\param[in] angle - \ru Двумерный нормализованный вектор, задающий угол вращения.
|
|
\en A two-dimensional normalized vector determining the rotation angle. \~
|
|
*/
|
|
void Rotate( const MbCartPoint & pnt, const MbDirection & angle );
|
|
/** \} */
|
|
|
|
private:
|
|
void operator = ( const MpEdge & ); // \ru Не реализовано \en Not implemented
|
|
|
|
DECLARE_PERSISTENT_CLASS_NEW_DEL ( MpEdge )
|
|
}; // MpEdge
|
|
|
|
IMPL_PERSISTENT_OPS( MpEdge )
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Цикл.
|
|
\en Loop. \~
|
|
\details \ru Цикл. Набор ребер.\n
|
|
\en Loop. Set of edges.\n \~
|
|
\ingroup Algorithms_2D
|
|
*/
|
|
// ---
|
|
class MATH_CLASS MpLoop : public TapeBase {
|
|
private :
|
|
PArray<MpEdge> edgeList; ///< \ru Список ребер. \en List of edges.
|
|
bool orientation; ///< \ru Ориентация цикла. \en Loop orientation.
|
|
int mode; ///< \ru Направление построения. \en Construction direction.
|
|
|
|
public:
|
|
|
|
/** \brief \ru Конструктор.
|
|
\en Constructor. \~
|
|
\details \ru Конструктор по ребру и направлению построения.\n
|
|
\en Constructor by edge and the direction of construction.\n \~
|
|
\param[in] initEdge - \ru Ребро.
|
|
\en Edge. \~
|
|
\param[in] m - \ru Направление построения цикла:
|
|
если m > 0 - цикл строится против часовой стрелки,
|
|
если m < 0 - по часовой стрелке.
|
|
\en Direction of loop construction:
|
|
if m > 0 - the loop is constructed counterclockwise,
|
|
if m < 0 - clockwise. \~
|
|
*/
|
|
MpLoop( MpEdge * initEdge, int m );
|
|
|
|
/// \ru Копирующий конструктор. \en Copy-constructor.
|
|
MpLoop( const MpLoop & );
|
|
|
|
/// \ru Деструктор. \en Destructor.
|
|
virtual ~MpLoop();
|
|
|
|
/**\ru \name Функции доступа к данным.
|
|
\en \name Functions for access to data.
|
|
\{ */
|
|
|
|
/// \ru Количество ребер. \en Count of edges.
|
|
ptrdiff_t GetEdgesCount() const { return edgeList.Count(); }
|
|
|
|
/** \brief \ru Ребро по индексу.
|
|
\en Edge by index. \~
|
|
\details \ru Ребро по его индексу. Без проверки корректности индекса.\n
|
|
\en Edge by its index. Without check for index correctness.\n \~
|
|
\param[in] index - \ru Индекс ребра.
|
|
\en An edge index. \~
|
|
*/
|
|
MpEdge * GetEdge( ptrdiff_t index ) const { return edgeList[index]; }
|
|
|
|
/** \brief \ru Ребро по индексу для изменения.
|
|
\en Edge by index to change. \~
|
|
\details \ru Ребро по его индексу для изменения. Без проверки корректности индекса.\n
|
|
\en Edge by its index to change. Without check for index correctness.\n \~
|
|
\param[in] index - \ru Индекс ребра.
|
|
\en An edge index. \~
|
|
*/
|
|
MpEdge *& GetEdge( ptrdiff_t index ) { return edgeList[index]; }
|
|
|
|
/// \ru Выдать последнее ребро. \en Get the last edge.
|
|
MpEdge * GetEdge() const;
|
|
|
|
/// \ru Дать ориентацию. \en Get the orientation.
|
|
bool GetOrientation() const { return orientation; }
|
|
/// \ru Направление построения. \en Construction direction.
|
|
int GetMode() const { return mode; }
|
|
/// \ru Выдать массив вершин. \en Get vertex array.
|
|
void GetVerticesArray( RPArray<MpVertex> & vertices ) const;
|
|
/// \ru Выдать массив кривых. \en Get curve array.
|
|
void GetCurvesArray ( RPArray<const MbCurve> & curves ) const;
|
|
/// \ru Выдать массив кривых. \en Get curve array.
|
|
void SetCurvesArray ( RPArray<MbCurve> & curves );
|
|
|
|
/** \} */
|
|
/**\ru \name Функции изменения данных.
|
|
\en \name Functions for changing data.
|
|
\{ */
|
|
|
|
/// \ru Добавить ребро. \en Add an edge.
|
|
void AddEdge( MpEdge * edge ) { edgeList.Add(edge); }
|
|
/// \ru Удалить последнее ребро. \en Delete the last edge.
|
|
void DeleteEdge();
|
|
|
|
/** \brief \ru Удалить ребро по индексу.
|
|
\en Delete an edge by index. \~
|
|
\details \ru Удалить ребро по его индексу. Без проверки корректности индекса.\n
|
|
\en Delete an edge by its index. Without check for index correctness.\n \~
|
|
\param[in] index - \ru Индекс ребра.
|
|
\en An edge index. \~
|
|
*/
|
|
void DeleteEdge( ptrdiff_t index ) { edgeList.RemoveInd(index); }
|
|
|
|
/// \ru Установить ориентацию. \en Set the orientation.
|
|
void SetOrientation( bool s ) { orientation = s; }
|
|
|
|
/** \brief \ru Установить направление обхода.
|
|
\en Set the traverse direction. \~
|
|
\details \ru Установить направление обхода цикла.\n
|
|
\en Set the direction of traversal of the loop.\n \~
|
|
\param[in] m - \ru Направление обхода.\n
|
|
Имеет значение знак числа m:\n
|
|
если m > 0, то обход против часовой стрелки,\n
|
|
если m < 0, то по часовой стрелке.
|
|
\en The traversal direction.\n
|
|
Has a value of sign of number m:\n
|
|
if m > 0, then traversal is counterclockwise,\n
|
|
if m < 0, then it is clockwise. \~
|
|
*/
|
|
void SetMode( int m ) { mode=m; }
|
|
|
|
/// \ru Изменить ориентацию ребра. \en Change the edge orientation.
|
|
void Reverse() { orientation = !orientation; }
|
|
/// \ru Построить вершины. \en Construct vertices.
|
|
void CreateVertices();
|
|
/// \ru Создать контур по циклу. \en Create a contour by the loop.
|
|
MbContour * MakeContour( double epsilon = METRIC_ACCURACY ) const;
|
|
|
|
/** \} */
|
|
/**\ru \name Операции преобразования.
|
|
\en \name Transformation operations.
|
|
\{ */
|
|
|
|
/** \brief \ru Преобразование.
|
|
\en Transformation. \~
|
|
\details \ru Преобразование в соответствии с матрицей.\n
|
|
\en Transform according to matrix.\n \~
|
|
\param[in] matr - \ru Матрица трансформации.
|
|
\en Transformation matrix. \~
|
|
*/
|
|
void Transform( const MbMatrix & matr );
|
|
|
|
/** \brief \ru Переместить.
|
|
\en Move. \~
|
|
\details \ru Переместить на вектор.\n
|
|
\en Move by a vector.\n \~
|
|
\param[in] to - \ru Вектор перемещения.
|
|
\en Movement vector. \~
|
|
*/
|
|
void Move( const MbVector & to );
|
|
|
|
/** \brief \ru Повернуть.
|
|
\en Rotate. \~
|
|
\details \ru Повернуть на угол вокруг точки.\n
|
|
\en Rotate at angle around a point.\n \~
|
|
\param[in] pnt - \ru Точка - центр поворота.
|
|
\en A point is a rotation center. \~
|
|
\param[in] angle - \ru Двумерный нормализованный вектор, задающий угол вращения.
|
|
\en A two-dimensional normalized vector determining the rotation angle. \~
|
|
*/
|
|
void Rotate( const MbCartPoint & pnt, const MbDirection & angle );
|
|
/** \} */
|
|
|
|
private:
|
|
void operator = ( const MpLoop & ); // \ru Не реализовано \en Not implemented
|
|
|
|
DECLARE_PERSISTENT_CLASS_NEW_DEL ( MpLoop )
|
|
}; // Loop
|
|
|
|
IMPL_PERSISTENT_OPS( MpLoop )
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Граф построения контуров.
|
|
\en Contours construction graph. \~
|
|
\details \ru Граф построения контуров.\n
|
|
Содержит список границ - циклов.
|
|
\en Contours construction graph.\n
|
|
Contains list of boundaries - loops. \~
|
|
\ingroup Algorithms_2D
|
|
*/
|
|
// ---
|
|
class MATH_CLASS MpGraph : public TapeBase {
|
|
private :
|
|
PArray<MpLoop> loops; ///< \ru Список границ. \en List of boundaries.
|
|
int mode; ///< \ru Направление обхода. \en Traversal direction.
|
|
ptrdiff_t nameCount; ///< \ru Количество имен ребер. \en Edge names count.
|
|
PArray<MpEdge> unusedEdges; ///< \ru Список ребер. \en List of edges.
|
|
|
|
private:
|
|
VERSION version; ///< \ru Версия чтения. // BUG_57224 \en Read version. // BUG_57224
|
|
|
|
public:
|
|
MpGraph(); ///< \ru Конструктор. \en Constructor.
|
|
MpGraph( MpLoop * init ); ///< \ru Конструктор по циклу. \en Constructor by loop.
|
|
MpGraph( RPArray<MpLoop> & init ); ///< \ru Конструктор по набору циклов. \en Constructor by a set of loops.
|
|
MpGraph( const MpGraph & ); ///< \ru Копирующий конструктор. \en Copy-constructor.
|
|
virtual ~MpGraph(); ///< \ru Деструктор. \en Destructor.
|
|
|
|
/**\ru \name Функции доступа к данным.
|
|
\en \name Functions for access to data.
|
|
\{ */
|
|
|
|
/// \ru Количество границ. \en Count of boundaries.
|
|
size_t GetLoopsCount() const { return loops.Count(); }
|
|
|
|
/** \brief \ru Цикл по индексу.
|
|
\en Loop by index. \~
|
|
\details \ru Цикл по индексу без проверки индекса.\n
|
|
\en Loop by index without check of index.\n \~
|
|
\param[in] index - \ru Индекс цикла.
|
|
\en The loop index. \~
|
|
*/
|
|
MpLoop * GetLoop( size_t index ) const { return loops[index]; }
|
|
|
|
/// \ru Направление обхода. \en Traversal direction.
|
|
int GetMode() const { return mode; }
|
|
|
|
/** \brief \ru Выдать точку.
|
|
\en Get the point. \~
|
|
\details \ru Выдать точку для сборки графа.\n
|
|
\en Get the point for graph building.\n \~
|
|
\param[in] curveList - \ru Набор кривых (без совпадений) для создания графа.
|
|
\en A set of curves (without coincidences) for creating the graph. \~
|
|
\param[in] cross - \ru Набор точек пересечения кривых из curveList.
|
|
\en Set of intersection points of curves from curveList. \~
|
|
\param[out] p - \ru Результат - двумерная точка.
|
|
\en The result is a two-dimensional point. \~
|
|
*/
|
|
bool GetPointIn( const RPArray<MbCurve> & curveList, SArray<MbCrossPoint> & cross, MbCartPoint & p,
|
|
double epsilon = Math::LengthEps*c3d::METRIC_DELTA ) const;
|
|
|
|
/** \brief \ru Выдать использованные кривые.
|
|
\en Get used curves. \~
|
|
\details \ru Выдать использованные кривые и переименовать в соответствии с последними.\n
|
|
\en Get used curves and rename in compliance with the last ones.\n \~
|
|
\param[in] curveList - \ru Набор кривых.
|
|
\en Set of curves. \~
|
|
\param[out] usedCurves - \ru Результат - использованные кривые.
|
|
\en The result are the used curves. \~
|
|
*/
|
|
template<class CurvesArray, class CurvesArray2>
|
|
void GetUsedCurves( const CurvesArray & curveList, CurvesArray2 & usedCurves );
|
|
|
|
/** \brief \ru Ориентация цикла по индексу.
|
|
\en The orientation of a loop by its index. \~
|
|
\details \ru Ориентация цикла по индексу без проверки индекса.\n
|
|
\en The orientation of loop by its index without check of index.\n \~
|
|
\param[in] i - \ru Индекс цикла.
|
|
\en The loop index. \~
|
|
\return \ru Ориентацию цикла.
|
|
\en The loop orientation. \~
|
|
*/
|
|
bool GetLoopOrientation( size_t i ) const { return loops[i]->GetOrientation(); }
|
|
|
|
/** \} */
|
|
/**\ru \name Функции изменения данных.
|
|
\en \name Functions for changing data.
|
|
\{ */
|
|
|
|
/// \ru Добавить новую границу грани. \en Add a new boundary of the face.
|
|
void AddLoop( MpLoop * newLoop );
|
|
/// \ru Добавить новую границу грани в начало списка границ. \en Add a new boundary of the face to the beginning of face list.
|
|
void InsertLoop( MpLoop * newLoop );
|
|
/// \ru Установить направление обхода. \en Set the traverse direction.
|
|
void SetMode( int m ) { mode = m; }
|
|
/// \ru Выдать контуры циклов. \en Get loops' contours.
|
|
void MakeContours( RPArray<MbContour> & contours ) const;
|
|
|
|
/** \brief \ru Запомнить неиспользованные ребра.
|
|
\en Store unused edges. \~
|
|
\details \ru Запомнить неиспользованные ребра, установив им имена.\n
|
|
\en Store unused edges giving names for them.\n \~
|
|
\param[in] curveList - \ru Список неиспользованных кривых для установки имен.
|
|
\en The list of unused curves for setting the names. \~
|
|
\param[in] g - \ru Граф для поиска неиспользованных ребер.\n
|
|
Если в нем или в его массиве неиспользованных ребер
|
|
нашлось ребро с именем неиспользованной кривой,
|
|
то оно запоминается в массиве неиспользованных ребер unusedEdges.\n
|
|
\en Graph for searching unused edges.\n
|
|
If there is an edge by the names of an unused curve
|
|
in the graph or its array of unused edges,
|
|
then it is stored in the array of unused edges unusedEdges.\n \~
|
|
\param[in] curvesNames - \ru Имена кривых.
|
|
\en Curves names. \n \~
|
|
*/
|
|
template<class CurvesArray>
|
|
void SetAllName( const CurvesArray & curveList, MpGraph * g, std::map<const MbCurve *, ptrdiff_t> & curvesNames );
|
|
|
|
/** \brief \ru Дать имена ребрам.
|
|
\en Give names to edges. \~
|
|
\details \ru Дать имена ребрам по списку кривых.\n
|
|
\en Give names to edges by the list of curves.\n \~
|
|
\param[in] curveList - \ru Список кривых для именования.
|
|
\en The list of curves for naming. \~
|
|
\param[in] curvesNames - \ru Имена кривых.
|
|
\en Curves names. \n \~
|
|
*/
|
|
template<class CurvesArray>
|
|
void SetEdgeName( const CurvesArray & curveList, std::map<const MbCurve *, ptrdiff_t> & curvesNames );
|
|
|
|
/** \brief \ru Определить ориентацию контуров.
|
|
\en Determine the contours' orientation. \~
|
|
\details \ru Определить ориентацию контуров по их вложенности.\n
|
|
\en Determine the contours' orientation by its inclusion.\n \~
|
|
\param[in] contourArray - \ru Список контуров, по которым строился граф.
|
|
\en List of contours the graph is built for. \~
|
|
*/
|
|
template<class ContourArray>
|
|
void SetLoopsOrientation( const ContourArray & contourArray );
|
|
|
|
/** \brief \ru Перевести параметры ребер в параметры кривых.
|
|
\en Convert edges' parameters to curves' parameters. \~
|
|
\details \ru Перевести параметры ребер в параметры кривых,
|
|
если кривые ребер нашлись в списках.\n
|
|
\en Convert parameters of edges to parameters of curves
|
|
if edges' curves are found in lists.\n \~
|
|
\param[in] unchangeCurve - \ru Список имен кривых для изменения.
|
|
\en List of curves' names for modification. \~
|
|
\param[in] changeCurve - \ru Список имен кривых для изменения.
|
|
\en List of curves' names for modification. \~
|
|
\param[in] curveList - \ru Список кривых для изменения параметризации.
|
|
\en List of curves for modification of parametrization. \~
|
|
\warning \ru Для внутреннего использования.
|
|
\en For internal use only. \~
|
|
*/
|
|
// \ru Изменяется параметризация только у отрезков. \en Parametrization can be modified for line segments only.
|
|
// \ru Специально для исправления ошибки BUG_57224 \en Especially to fix BUG_57224
|
|
void ConvertEdgesParams( const SArray<ptrdiff_t> & unchangeCurve, const SArray<ptrdiff_t> & changeCurve,
|
|
const RPArray<MbCurve> & curveList ) const;
|
|
|
|
/** \} */
|
|
/**\ru \name Операции преобразования.
|
|
\en \name Transformation operations.
|
|
\{ */
|
|
|
|
/** \brief \ru Преобразование.
|
|
\en Transformation. \~
|
|
\details \ru Преобразование в соответствии с матрицей.\n
|
|
\en Transformation according to the matrix.\n \~
|
|
\param[in] matr - \ru Матрица трансформации.
|
|
\en Transformation matrix. \~
|
|
*/
|
|
void Transform( const MbMatrix & matr );
|
|
|
|
/** \brief \ru Переместить.
|
|
\en Move. \~
|
|
\details \ru Переместить на вектор.\n
|
|
\en Move by a vector.\n \~
|
|
\param[in] to - \ru Вектор перемещения.
|
|
\en Movement vector. \~
|
|
*/
|
|
void Move( const MbVector & to );
|
|
|
|
/** \brief \ru Повернуть.
|
|
\en Rotate. \~
|
|
\details \ru Повернуть на угол вокруг точки.\n
|
|
\en Rotate at angle around a point.\n \~
|
|
\param[in] pnt - \ru Точка - центр поворота.
|
|
\en A point is a rotation center. \~
|
|
\param[in] angle - \ru Двумерный нормализованный вектор, задающий угол вращения.
|
|
\en A two-dimensional normalized vector determining the rotation angle. \~
|
|
*/
|
|
void Rotate( const MbCartPoint & pnt, const MbDirection & angle );
|
|
/** \} */
|
|
|
|
private:
|
|
|
|
/** \brief \ru Направление обхода цикла.
|
|
\en Loop traversal direction. \~
|
|
\details \ru Направление обхода цикла, которому принадлежит вершина.\n
|
|
\en Traversal direction of the loop the vertex belongs to.\n \~
|
|
\param[in] vert - \ru Вершина для поиска цикла.
|
|
\en The vertex for searching the loop. \~
|
|
\return \ru Направление обхода.\n
|
|
Важен знак числа:\n
|
|
если > 0 - против часовой стрелки,\n
|
|
если < 0 - по часовой стрелке.
|
|
\en The traversal direction.\n
|
|
Sign of the number is significant:\n
|
|
if > 0 - counterclockwise,\n
|
|
if < 0 - clockwise. \~
|
|
*/
|
|
int GetLoopMode( MpVertex * vert ) const;
|
|
|
|
/** \brief \ru Выдать массив вершин.
|
|
\en Get vertex array. \~
|
|
\details \ru Выдать массив вершин всех циклов графа.\n
|
|
\en Get vertex array of all the loops of the graph.\n \~
|
|
\param[out] vertices - \ru Результат - массив вершин.
|
|
\en The result is a vertex array. \~
|
|
*/
|
|
void GetVerticesArray( RPArray<MpVertex> & vertices ) const;
|
|
|
|
/// \ru Количество имен ребер. \en The count of edges' names.
|
|
ptrdiff_t GetNameCount() const { return nameCount; }
|
|
|
|
/** \brief \ru Выдать имена ребер.
|
|
\en Get edges' names. \~
|
|
\details \ru Выдать имена ребер всех циклов графа.\n
|
|
Имена складываются в массив без повторений, сортированные по возрастанию.
|
|
\en Get names of edges of all the loops of the graph.\n
|
|
Names are put to the array without duplications, sorted in the ascending order. \~
|
|
\param[out] curveName - \ru Результат - массив имен.
|
|
\en The result is the array of names. \~
|
|
*/
|
|
void GetEdgeName( SArray<ptrdiff_t> & curveName ) const;
|
|
|
|
/** \brief \ru Ориентация ребра.
|
|
\en Edge orientation. \~
|
|
\details \ru Ориентация ребра по его имени с учетом направления цикла.\n
|
|
\en Edge orientation by its name subject to the loop direction.\n \~
|
|
\param[in] n0 - \ru Имя ребра.
|
|
\en The edge name. \~
|
|
\param[out] s - \ru Ориентация ребра.
|
|
\en Edge orientation. \~
|
|
\return \ru true, если нашли нужное ребро.
|
|
\en True if the required edge is found. \~
|
|
*/
|
|
bool GetCurveData( ptrdiff_t n0, int & s ) const;
|
|
|
|
/** \brief \ru Ориентация ребра.
|
|
\en Edge orientation. \~
|
|
\details \ru Ориентация ребра по его имени без учета направления цикла.\n
|
|
\en Edge orientation by its name without taking the loop direction into account.\n \~
|
|
\param[in] n0 - \ru Имя ребра.
|
|
\en The edge name. \~
|
|
\param[out] s - \ru Ориентация ребра.
|
|
\en Edge orientation. \~
|
|
\return \ru true, если нашли нужное ребро.
|
|
\en True if the required edge is found. \~
|
|
*/
|
|
bool GetOldData ( ptrdiff_t n0, int & s ) const;
|
|
|
|
/** \brief \ru Выдать точку.
|
|
\en Get the point. \~
|
|
\details \ru Выдать точку для сборки графа.\n
|
|
\en Get the point for graph building.\n \~
|
|
\param[in] vertex - \ru Начальная вершина ребра, которому соответствует кривая curve.
|
|
\en The start vertex of the edge the curve 'curve' corresponds to. \~
|
|
\param[in] curve - \ru Кривая для расчета точки.
|
|
\en The curve for point calculation. \~
|
|
\param[in] t - \ru Параметр на кривой.
|
|
\en A parameter on the curve. \~
|
|
\param[out] p - \ru Результат - двумерная точка.
|
|
\en The result is a two-dimensional point. \~
|
|
*/
|
|
void GetPoint( MpVertex * vertex, MbCurve * curve, double t, MbCartPoint & p ) const;
|
|
|
|
void CurvesSort( const RPArray<MbCurve> & curveList, SArray<ptrdiff_t> & unchangeCurve, SArray<ptrdiff_t> & changeCurve ) const;
|
|
|
|
private:
|
|
void operator = ( const MpGraph & ); // \ru Не реализовано \en Not implemented
|
|
|
|
DECLARE_PERSISTENT_CLASS_NEW_DEL ( MpGraph )
|
|
}; // MpGraph
|
|
|
|
IMPL_PERSISTENT_OPS( MpGraph )
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Запомнить неиспользованные ребра.
|
|
\en Store unused edges. \~
|
|
\details \ru Запомнить неиспользованные ребра, установив им имена.\n
|
|
\en Store unused edges giving names for them.\n \~
|
|
\param[in] curveList - \ru Список неиспользованных кривых для установки имен.
|
|
\en The list of unused curves for setting the names. \~
|
|
\param[in] g - \ru Граф для поиска неиспользованных ребер.\n
|
|
Если в нем или в его массиве неиспользованных ребер
|
|
нашлось ребро с именем неиспользованной кривой,
|
|
то оно запоминается в массиве неиспользованных ребер unusedEdges.\n
|
|
\en Graph for searching unused edges.\n
|
|
If there is an edge by the names of an unused curve
|
|
in the graph or its array of unused edges,
|
|
then it is stored in the array of unused edges unusedEdges.\n \~
|
|
\param[in] curvesNames - \ru Имена кривых.
|
|
\en Curves names. \n \~
|
|
*/
|
|
// ---
|
|
template<class CurvesArray>
|
|
void MpGraph::SetAllName( const CurvesArray & curveList, MpGraph * g, std::map<const MbCurve *, ptrdiff_t> & curvesNames )
|
|
{
|
|
ptrdiff_t i, j, j0, k;
|
|
MpLoop * loop = nullptr;
|
|
MpEdge * edge = nullptr;
|
|
bool s;
|
|
|
|
unusedEdges.Flush();
|
|
nameCount = curveList.size();
|
|
|
|
// Сначала именуются ребра.
|
|
for ( i = 0; i < (ptrdiff_t)loops.Count(); i++ ) {
|
|
loop = GetLoop( i );
|
|
for ( k = 0; k < (ptrdiff_t)loop->GetEdgesCount(); k++ ) {
|
|
edge = loop->GetEdge( k );
|
|
ptrdiff_t curveName = curvesNames[edge->GetCurve()]; // Это имя может быть у исходной кривой и у измененной в обработке наложений.
|
|
if ( curveName >= 0 && curveName <= nameCount ) {
|
|
edge->SetName( curveName );
|
|
edge->SetCurve( nullptr );
|
|
}
|
|
}
|
|
}
|
|
|
|
// Теперь ищутся неиспользованные ребра.
|
|
for ( j = 0; j < nameCount; j++ ) {
|
|
j0 = -1;
|
|
|
|
for ( i = 0; i < (ptrdiff_t)loops.Count(); i++ ) {
|
|
loop = GetLoop( i );
|
|
for ( k = 0; k < (ptrdiff_t)loop->GetEdgesCount(); k++ ) {
|
|
edge = loop->GetEdge( k );
|
|
if ( edge->GetName() == j )
|
|
j0 = 1; // Нашли кривую в новом графе.
|
|
// if ( curve0==edge->GetCurve() ) {
|
|
// edge->SetName( j );
|
|
// edge->SetCurve( nullptr );
|
|
// j0 = 1;
|
|
// }
|
|
}
|
|
}
|
|
|
|
if ( j0 < 0 && g != nullptr ) { // Этой кривой нет в новом графе this. Ищем ее в старом графе g.
|
|
for ( i = 0; i < (ptrdiff_t)g->loops.Count(); i++ ) {
|
|
loop = g->GetLoop( i );
|
|
|
|
for ( k = 0; k < (ptrdiff_t)loop->GetEdgesCount(); k++ ) {
|
|
edge = loop->GetEdge( k );
|
|
|
|
if ( j == edge->GetName() ) { // Это ребро построено на кривой curveList[j].
|
|
s = edge->GetSense();
|
|
if ( loop->GetMode() < 0 )
|
|
s = !s;
|
|
|
|
unusedEdges.Add( new MpEdge( edge->GetTBeg(), edge->GetTEnd(), s, j, edge->GetType() ) );
|
|
j0 = 1;
|
|
i = g->loops.Count();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( j0 < 0 && g != nullptr ) { // Если не нашли, ищем в неиспользованных ребрах.
|
|
for ( k = 0; k < (ptrdiff_t)g->unusedEdges.Count(); k++ ) {
|
|
edge = g->unusedEdges[k];
|
|
if ( j == edge->GetName() ) {
|
|
s = edge->GetSense();
|
|
unusedEdges.Add( new MpEdge( edge->GetTBeg(), edge->GetTEnd(), s, j, edge->GetType() ) );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Дать имена ребрам.
|
|
\en Give names to edges. \~
|
|
\details \ru Дать имена ребрам по списку кривых.\n
|
|
\en Give names to edges by the list of curves.\n \~
|
|
\param[in] curveList - \ru Список кривых для именования.
|
|
\en The list of curves for naming. \~
|
|
\param[in] curvesNames - \ru Имена кривых.
|
|
\en Curves names. \n \~
|
|
*/
|
|
// ---
|
|
template<class CurvesArray>
|
|
void MpGraph::SetEdgeName( const CurvesArray & curveList, std::map<const MbCurve *, ptrdiff_t> & curvesNames )
|
|
{
|
|
// Именование ребер номерами кривых.
|
|
nameCount = curveList.size();
|
|
|
|
// for ( ptrdiff_t j = 0; j < nameCount; j++ ) {
|
|
// MbCurve *curve0 = curveList[j];
|
|
//
|
|
// for ( ptrdiff_t i = 0; i < (ptrdiff_t)loops.Count(); i++ ) {
|
|
// MpLoop *loop = GetLoop( i );
|
|
//
|
|
// for( ptrdiff_t k = 0; k < (ptrdiff_t)loop->edgeList.Count(); k++ ) {
|
|
// MpEdge *edge = loop->edgeList[k];
|
|
//
|
|
// if ( curve0==edge->GetCurve() ) {
|
|
// edge->SetName( j );
|
|
// edge->baseCurve = nullptr;
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
for ( ptrdiff_t i = 0; i < (ptrdiff_t)loops.Count(); i++ ) {
|
|
MpLoop * loop = GetLoop( i );
|
|
|
|
for ( ptrdiff_t k = 0; k < (ptrdiff_t)loop->GetEdgesCount(); k++ ) {
|
|
MpEdge * edge = loop->GetEdge( k );
|
|
|
|
ptrdiff_t curveName = curvesNames[edge->GetCurve()];
|
|
|
|
if ( curveName >= 0 && curveName <= nameCount ) {
|
|
edge->SetName( curveName );
|
|
edge->SetCurve( nullptr );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Выдать использованные кривые.
|
|
\en Get used curves. \~
|
|
\details \ru Выдать использованные кривые и переименовать в соответствии с последними.\n
|
|
\en Get used curves and rename in compliance with the last ones.\n \~
|
|
\param[in] curveList - \ru Набор кривых.
|
|
\en Set of curves. \~
|
|
\param[out] usedCurves - \ru Результат - использованные кривые.
|
|
\en The result are the used curves. \~
|
|
*/
|
|
// ---
|
|
template<class CurvesArray, class CurvesArray2>
|
|
void MpGraph::GetUsedCurves( const CurvesArray & curveList, CurvesArray2 & usedCurves )
|
|
{
|
|
SArray<ptrdiff_t> curveName( 0, 1 );
|
|
GetEdgeName( curveName );
|
|
|
|
usedCurves.reserve( curveName.Count() );
|
|
for ( ptrdiff_t j = 0; j < (ptrdiff_t)curveName.Count(); j++ ) {
|
|
ptrdiff_t n = curveName[j];
|
|
if ( n < 0 || n >( ptrdiff_t )curveList.size() - 1 )
|
|
continue;
|
|
usedCurves.push_back( curveList[n] );
|
|
|
|
for ( ptrdiff_t i = 0; i < (ptrdiff_t)loops.Count(); i++ ) {
|
|
MpLoop * loop = GetLoop( i );
|
|
|
|
for ( ptrdiff_t k = 0; k < (ptrdiff_t)loop->GetEdgesCount(); k++ )
|
|
if ( loop->GetEdge( k )->GetName() == n )
|
|
loop->GetEdge( k )->SetName( j );
|
|
}
|
|
}
|
|
|
|
nameCount = curveName.Count();
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Определить ориентацию контуров.
|
|
\en Determine the contours' orientation. \~
|
|
\details \ru Определить ориентацию контуров по их вложенности.\n
|
|
\en Determine the contours' orientation by its inclusion.\n \~
|
|
\param[in] contourArray - \ru Список контуров, по которым строился граф.
|
|
\en List of contours the graph is built for. \~
|
|
*/
|
|
// ---
|
|
template<class ContourArray>
|
|
void MpGraph::SetLoopsOrientation( const ContourArray & contourArray )
|
|
{
|
|
ptrdiff_t count = loops.Count();
|
|
ptrdiff_t cnt = contourArray.size();
|
|
|
|
cnt -= count;
|
|
if ( cnt < 0 || count == 0 )
|
|
return;
|
|
|
|
double t;
|
|
MbContour * contour = nullptr;
|
|
MbContour * contour0 = nullptr;
|
|
MbCartPoint p, p1;
|
|
ptrdiff_t i, j;
|
|
MbeLocation loc, loc1;
|
|
const double kk = M_E / 8;
|
|
|
|
SArray<ptrdiff_t> numb( count, 2 );
|
|
for ( i = 0; i < count; i++ ) {
|
|
numb.Add( 0 );
|
|
contour = contourArray[cnt + i];
|
|
double tmin = contour->GetTMin();
|
|
double tmax = contour->GetTMax();
|
|
double dt = kk * ( tmax - tmin );
|
|
|
|
// Лучше брать иррациональный параметр BUG_24550 // t = contour->GetTMin();
|
|
t = tmin + dt;
|
|
contour->PointOn( t, p );
|
|
// Лучше брать иррациональный параметр BUG_24550 // t = (t+contour->GetTMax())*0.5;
|
|
t = tmax - dt;
|
|
contour->PointOn( t, p1 );
|
|
|
|
for ( j = 0; j < count; j++ ) {
|
|
if ( i == j )
|
|
continue;
|
|
contour0 = contourArray[cnt + j];
|
|
loc = contour0->PointLocation( p );
|
|
if ( loc == loc_Inside )
|
|
numb[i] = numb[i] + 1;
|
|
else {
|
|
if ( loc == loc_OnCurve ) {
|
|
loc1 = contour0->PointLocation( p1 );
|
|
if ( loc1 == loc_Inside )
|
|
numb[i] = numb[i] + 1;
|
|
else if ( loc1 == loc_OnCurve && i < j )
|
|
numb[i] = numb[i] + 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for ( i = 0; i < count; i++ )
|
|
loops[i]->SetOrientation( numb[i] % 2 == 0 );
|
|
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Удалить вершину.
|
|
\en Delete a vertex. \~
|
|
\details \ru Удалить вершину и обнулить указатель.\n
|
|
\en Delete a vertex and set the pointer to null.\n \~
|
|
\param[in, out] vertex - \ru Вершина для удаления.
|
|
\en A vertex to delete. \~
|
|
*/ // ---
|
|
inline
|
|
void DeleteVertex( MpVertex *& vertex )
|
|
{
|
|
delete vertex;
|
|
vertex = nullptr;
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Удалить ребро.
|
|
\en Delete an edge. \~
|
|
\details \ru Удалить ребро и обнулить указатель.\n
|
|
\en Delete an edge and set the pointer to null.\n \~
|
|
\param[in, out] edge - \ru Ребро для удаления.
|
|
\en An edge to delete. \~
|
|
*/ // ---
|
|
inline
|
|
void DeleteEdge( MpEdge *& edge )
|
|
{
|
|
delete edge;
|
|
edge = nullptr;
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Удалить цикл.
|
|
\en Delete a loop. \~
|
|
\details \ru Удалить цикл и обнулить указатель.\n
|
|
\en Delete a loop and set the pointer to null.\n \~
|
|
\param[in, out] loop - \ru Цикл для удаления.
|
|
\en A loop to delete. \~
|
|
*/ // ---
|
|
inline
|
|
void DeleteLoop( MpLoop *& loop )
|
|
{
|
|
delete loop;
|
|
loop = nullptr;
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Удалить граф.
|
|
\en Delete a graph. \~
|
|
\details \ru Удалить граф и обнулить указатель.\n
|
|
\en Delete a graph and set the pointer to null.\n \~
|
|
\param[in, out] graph - \ru Граф для удаления.
|
|
\en A graph to delete. \~
|
|
*/ // ---
|
|
inline
|
|
void DeleteGraph( MpGraph *& graph )
|
|
{
|
|
delete graph;
|
|
graph = nullptr;
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Устранить разрывы в контуре.
|
|
\en Remove contour gaps. \~
|
|
\details \ru Устранить разрывы в контуре.
|
|
\en Remove contour gaps. \~
|
|
\param[in] contour - \ru Контур.
|
|
\en A contour. \~
|
|
\param[in] accuracy - \ru Ограничение по размеру разрыва (для вставки сегмента и поиска пересечения соседей.
|
|
\en Upper gap size. \~
|
|
\param[in] canInsert - \ru Можно ли вставлять сегменты.
|
|
\en Allow insert segments. \~
|
|
\param[in] canReplace - \ru Можно ли заменять сегменты.
|
|
\en Allow replace segments. \~
|
|
\return \ru true, если контур изменился.
|
|
\en true, if something have changed. \~
|
|
\ingroup Algorithms_2D
|
|
*/
|
|
// ---
|
|
MATH_FUNC (bool) RemoveContourGaps( MbContour & contour, // контур
|
|
double accuracy, // размер разрывов
|
|
bool canInsert, // разрешение на вставку сегментов
|
|
bool canReplace ); // разрешение на подмену сегментов
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Построить контуры вокруг заданной точки.
|
|
\en Create contours around the given point. \~
|
|
\details \ru Построить контуры вокруг заданной точки.
|
|
Строится один внешний и несколько внутренних контуров с одним уровнем вложенности.
|
|
На вход не должны приходить составные кривые (контуры и ломаные).
|
|
\en Create contours around the given point.
|
|
One outer and several inner loops are constructed with single nesting level.
|
|
Do not send composite curves (contours, polylines, polygons and etc) as input curves. Break them down into on the components. \~
|
|
\param[in] curveList - \ru Список кривых для построения.
|
|
\en List of curves for construction. \~
|
|
\param[in] p - \ru Точка, вокруг которой строятся контуры.
|
|
\en A point the contours are constructed around. \~
|
|
\param[out] usedCurves - \ru Использованные кривые.
|
|
\en Used curves. \~
|
|
\param[out] contourArray - \ru Результат построения - набор контуров.
|
|
\en The result of construction is a set of contours. \~
|
|
\param[in] accuracy - \ru Погрешность определения пересечения и близости кривых.
|
|
\en The accuracy of determining the intersection of curves and proximity. \~
|
|
\param[in] strict - \ru Если false, сборка производится с загрубленной точностью.
|
|
\en If false, the construction is performed roughly. \~
|
|
\param[in] version - \ru Версия построения. Последняя версия Math::DefaultMathVersion().
|
|
\en The version of construction. The last version Math::DefaultMathVersion(). \~
|
|
\param[in] progInd - \ru Индикатора прогресса выполнения.
|
|
\en Execution progress indicator. \~
|
|
\return \ru Граф построения контуров.
|
|
\en Contours construction graph. \~
|
|
\warning \ru При использовании функций EncloseContoursBuilder, OuterContoursBuilder, ContoursReconstructor
|
|
состояние флага strict и версия version должно использоваться одно в одном процессе обработки.
|
|
\en While using functions EncloseContoursBuilder, OuterContoursBuilder, ContoursReconstructor,
|
|
a single state of 'strict' flag and version must be used in one treatment process. \~
|
|
\ingroup Algorithms_2D
|
|
*/
|
|
// ---
|
|
MATH_FUNC (MpGraph *) EncloseContoursBuilder( const RPArray<MbCurve> & curveList,
|
|
const MbCartPoint & p,
|
|
PArray<MbCurve> & usedCurves,
|
|
PArray<MbContour> & contourArray,
|
|
double accuracy,
|
|
bool strict,
|
|
VERSION version,
|
|
IProgressIndicator * progInd = nullptr );
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Построить контуры вокруг заданной точки.
|
|
\en Create contours around the given point. \~
|
|
\details \ru Построить контуры вокруг заданной точки.
|
|
Строится один внешний и несколько внутренних контуров с одним уровнем вложенности.
|
|
На вход не должны приходить составные кривые (контуры и ломаные).
|
|
\en Create contours around the given point.
|
|
One outer and several inner loops are constructed with single nesting level.
|
|
Do not send composite curves (contours, polylines, polygons and etc) as input curves. Break them down into on the components. \~
|
|
\param[in] curveList - \ru Список кривых для построения.
|
|
\en List of curves for construction. \~
|
|
\param[in] p - \ru Точка, вокруг которой строятся контуры.
|
|
\en A point the contours are constructed around. \~
|
|
\param[out] usedCurves - \ru Использованные кривые.
|
|
\en Used curves. \~
|
|
\param[out] contourArray - \ru Результат построения - набор контуров.
|
|
\en The result of construction is a set of contours. \~
|
|
\param[in] accuracy - \ru Погрешность определения пересечения и близости кривых.
|
|
\en The accuracy of determining the intersection of curves and proximity. \~
|
|
\param[in] strict - \ru Если false, сборка производится с загрубленной точностью.
|
|
\en If false, the construction is performed roughly. \~
|
|
\param[in] version - \ru Версия построения. Последняя версия Math::DefaultMathVersion().
|
|
\en The version of construction. The last version Math::DefaultMathVersion(). \~
|
|
\param[in] progInd - \ru Индикатора прогресса выполнения.
|
|
\en Execution progress indicator. \~
|
|
\return \ru Граф построения контуров.
|
|
\en Contours construction graph. \~
|
|
\warning \ru При использовании функций EncloseContoursBuilder, OuterContoursBuilder, ContoursReconstructor
|
|
состояние флага strict и версия version должно использоваться одно в одном процессе обработки.
|
|
\en While using functions EncloseContoursBuilder, OuterContoursBuilder, ContoursReconstructor,
|
|
a single state of 'strict' flag and version must be used in one treatment process. \~
|
|
\ingroup Algorithms_2D
|
|
*/
|
|
// ---
|
|
MATH_FUNC (MpGraph *) EncloseContoursBuilder( const c3d::PlaneCurvesSPtrVector & curveList,
|
|
const MbCartPoint & p,
|
|
c3d::PlaneCurvesSPtrVector & usedCurves,
|
|
c3d::PlaneContoursSPtrVector & contourArray,
|
|
double accuracy,
|
|
bool strict,
|
|
VERSION version,
|
|
IProgressIndicator * progInd = nullptr );
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Построить объемлющие контуры на основе заданных кривых.
|
|
\en Construct enclosing contours on the basis of the given curves. \~
|
|
\details \ru Построить объемлющие контуры на основе заданных кривых.
|
|
Строятся внешние и внутренние контуры с произвольным уровнем вложенности.
|
|
На вход не должны приходить составные кривые (контуры и ломаные).
|
|
\en Construct enclosing contours on the basis of the given curves.
|
|
Outer and inner loops are constructed with an arbitrary level of inclusion.
|
|
Do not send composite curves (contours, polylines, polygons and etc) as input curves. Break them down into on the components. \~
|
|
\param[in] curveList - \ru Список кривых для построения.
|
|
\en List of curves for construction. \~
|
|
\param[out] contourArray - \ru Результат построения - набор контуров.
|
|
\en The result of construction is a set of contours. \~
|
|
\param[in] accuracy - \ru Погрешность определения пересечения и близости кривых.
|
|
\en The accuracy of determining the intersection of curves and proximity. \~
|
|
\param[in] strict - \ru Если false, сборка производится с загрубленной точностью.
|
|
\en If false, the construction is performed roughly. \~
|
|
\param[in] version - \ru Версия построения. Последняя версия Math::DefaultMathVersion().
|
|
\en The version of construction. The last version Math::DefaultMathVersion(). \~
|
|
\param[in] progInd - \ru Индикатора прогресса выполнения.
|
|
\en Execution progress indicator. \~
|
|
\return \ru Граф построения контуров.
|
|
\en Contours construction graph. \~
|
|
\warning \ru При использовании функций EncloseContoursBuilder, OuterContoursBuilder, ContoursReconstructor
|
|
состояние флага strict и версия version должно использоваться одно в одном процессе обработки.
|
|
\en While using functions EncloseContoursBuilder, OuterContoursBuilder, ContoursReconstructor,
|
|
a single state of 'strict' flag and version must be used in one treatment process. \~
|
|
\ingroup Algorithms_2D
|
|
*/
|
|
// ---
|
|
MATH_FUNC (MpGraph *) OuterContoursBuilder( const RPArray<MbCurve> & curveList,
|
|
PArray<MbContour> & contourArray,
|
|
double accuracy,
|
|
bool strict,
|
|
VERSION version,
|
|
IProgressIndicator * progInd = nullptr );
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Построить объемлющие контуры на основе заданных кривых.
|
|
\en Construct enclosing contours on the basis of the given curves. \~
|
|
\details \ru Построить объемлющие контуры на основе заданных кривых.
|
|
Строятся внешние и внутренние контуры с произвольным уровнем вложенности.
|
|
На вход не должны приходить составные кривые (контуры и ломаные).
|
|
\en Construct enclosing contours on the basis of the given curves.
|
|
Outer and inner loops are constructed with an arbitrary level of inclusion.
|
|
Do not send composite curves (contours, polylines, polygons and etc) as input curves. Break them down into on the components. \~
|
|
\param[in] curveList - \ru Список кривых для построения.
|
|
\en List of curves for construction. \~
|
|
\param[out] contourArray - \ru Результат построения - набор контуров.
|
|
\en The result of construction is a set of contours. \~
|
|
\param[in] accuracy - \ru Погрешность определения пересечения и близости кривых.
|
|
\en The accuracy of determining the intersection of curves and proximity. \~
|
|
\param[in] strict - \ru Если false, сборка производится с загрубленной точностью.
|
|
\en If false, the construction is performed roughly. \~
|
|
\param[in] version - \ru Версия построения. Последняя версия Math::DefaultMathVersion().
|
|
\en The version of construction. The last version Math::DefaultMathVersion(). \~
|
|
\param[in] progInd - \ru Индикатора прогресса выполнения.
|
|
\en Execution progress indicator. \~
|
|
\return \ru Граф построения контуров.
|
|
\en Contours construction graph. \~
|
|
\warning \ru При использовании функций EncloseContoursBuilder, OuterContoursBuilder, ContoursReconstructor
|
|
состояние флага strict и версия version должно использоваться одно в одном процессе обработки.
|
|
\en While using functions EncloseContoursBuilder, OuterContoursBuilder, ContoursReconstructor,
|
|
a single state of 'strict' flag and version must be used in one treatment process. \~
|
|
\ingroup Algorithms_2D
|
|
*/
|
|
// ---
|
|
MATH_FUNC( MpGraph * ) OuterContoursBuilder( const c3d::PlaneCurvesSPtrVector & curveList,
|
|
c3d::PlaneContoursSPtrVector & contourArray,
|
|
double accuracy,
|
|
bool strict,
|
|
VERSION version,
|
|
IProgressIndicator * progInd = nullptr );
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Перестроить контуры, построенные ранее вокруг точки.
|
|
\en Reconstruct contours constructed around the point before. \~
|
|
\details \ru Перестроить контуры, построенные ранее вокруг точки.
|
|
Функция перестраивает граф, построенный функцией EncloseContoursBuilder.
|
|
\en Reconstruct contours constructed around the point before.
|
|
The function reconstructs the graph constructed by EncloseContoursBuilder function. \~
|
|
\param[in] curveList - \ru Список кривых для построения.
|
|
\en List of curves for construction. \~
|
|
\param[in] graph - \ru Граф для перестроения.
|
|
\en A graph to reconstruct. \~
|
|
\param[out] contourArray - \ru Результат построения - набор контуров.
|
|
\en The result of construction is a set of contours. \~
|
|
\param[in] accuracy - \ru Погрешность определения пересечения и близости кривых.
|
|
\en The accuracy of determining the intersection of curves and proximity. \~
|
|
\param[in] strict - \ru Если false, сборка производится с загрубленной точностью.
|
|
\en If false, the construction is performed roughly. \~
|
|
\param[in] version - \ru Версия построения. Последняя версия Math::DefaultMathVersion().
|
|
\en The version of construction. The last version Math::DefaultMathVersion(). \~
|
|
\param[in] progInd - \ru Индикатора прогресса выполнения.
|
|
\en Execution progress indicator. \~
|
|
\return \ru Граф построения контуров.
|
|
\en Contours construction graph. \~
|
|
\warning \ru При использовании функций EncloseContoursBuilder, OuterContoursBuilder, ContoursReconstructor
|
|
состояние флага strict и версия version должно использоваться одно в одном процессе обработки.
|
|
\en While using functions EncloseContoursBuilder, OuterContoursBuilder, ContoursReconstructor,
|
|
a single state of 'strict' flag and version must be used in one treatment process. \~
|
|
\ingroup Algorithms_2D
|
|
*/
|
|
// ---
|
|
MATH_FUNC (MpGraph *) ContoursReconstructor( const RPArray<MbCurve> & curveList,
|
|
MpGraph * graph,
|
|
PArray<MbContour> & contourArray,
|
|
double accuracy,
|
|
bool strict,
|
|
VERSION version,
|
|
IProgressIndicator * progInd = nullptr );
|
|
|
|
//------------------------------------------------------------------------------
|
|
/** \brief \ru Перестроить контуры, построенные ранее вокруг точки.
|
|
\en Reconstruct contours constructed around the point before. \~
|
|
\details \ru Перестроить контуры, построенные ранее вокруг точки.
|
|
Функция перестраивает граф, построенный функцией EncloseContoursBuilder.
|
|
\en Reconstruct contours constructed around the point before.
|
|
The function reconstructs the graph constructed by EncloseContoursBuilder function. \~
|
|
\param[in] curveList - \ru Список кривых для построения.
|
|
\en List of curves for construction. \~
|
|
\param[in] graph - \ru Граф для перестроения.
|
|
\en A graph to reconstruct. \~
|
|
\param[out] contourArray - \ru Результат построения - набор контуров.
|
|
\en The result of construction is a set of contours. \~
|
|
\param[in] accuracy - \ru Погрешность определения пересечения и близости кривых.
|
|
\en The accuracy of determining the intersection of curves and proximity. \~
|
|
\param[in] strict - \ru Если false, сборка производится с загрубленной точностью.
|
|
\en If false, the construction is performed roughly. \~
|
|
\param[in] version - \ru Версия построения. Последняя версия Math::DefaultMathVersion().
|
|
\en The version of construction. The last version Math::DefaultMathVersion(). \~
|
|
\param[in] progInd - \ru Индикатора прогресса выполнения.
|
|
\en Execution progress indicator. \~
|
|
\return \ru Граф построения контуров.
|
|
\en Contours construction graph. \~
|
|
\warning \ru При использовании функций EncloseContoursBuilder, OuterContoursBuilder, ContoursReconstructor
|
|
состояние флага strict и версия version должно использоваться одно в одном процессе обработки.
|
|
\en While using functions EncloseContoursBuilder, OuterContoursBuilder, ContoursReconstructor,
|
|
a single state of 'strict' flag and version must be used in one treatment process. \~
|
|
\ingroup Algorithms_2D
|
|
*/
|
|
// ---
|
|
MATH_FUNC( MpGraph * ) ContoursReconstructor( const c3d::PlaneCurvesSPtrVector & curveList,
|
|
MpGraph * graph,
|
|
c3d::PlaneContoursSPtrVector contourArray,
|
|
double accuracy,
|
|
bool strict,
|
|
VERSION version,
|
|
IProgressIndicator * progInd = nullptr );
|
|
|
|
|
|
#endif // __CONTOUR_GRAPH_H
|