Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2012-12-29 00:21:05 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2012-12-29 00:21:05 +0400
commite5791cf48e10ec1336f463b7fccff6b302621eb9 (patch)
tree58ea33117cc9be35713b6d93ea9d1dfa538ca5bd /source/blender/freestyle/intern/stroke/Curve.h
parent9fe9c1d6436e400217fdfd8999117a4719efdf68 (diff)
Another mega (literally :p) code clean-up patch by Bastien Montagne, thanks again!
Diffstat (limited to 'source/blender/freestyle/intern/stroke/Curve.h')
-rw-r--r--source/blender/freestyle/intern/stroke/Curve.h990
1 files changed, 556 insertions, 434 deletions
diff --git a/source/blender/freestyle/intern/stroke/Curve.h b/source/blender/freestyle/intern/stroke/Curve.h
index 60bc9815cb4..f451d83d65b 100644
--- a/source/blender/freestyle/intern/stroke/Curve.h
+++ b/source/blender/freestyle/intern/stroke/Curve.h
@@ -1,282 +1,364 @@
-//
-// Filename : Curve.h
-// Author(s) : Stephane Grabli
-// Purpose : Class to define a container for curves
-// Date of creation : 11/01/2003
-//
-///////////////////////////////////////////////////////////////////////////////
-
-
-//
-// Copyright (C) : Please refer to the COPYRIGHT file distributed
-// with this source distribution.
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#ifndef CURVE_H
-# define CURVE_H
-
-# include "../view_map/Silhouette.h"
-# include <deque>
-# include "../system/BaseIterator.h"
-# include "../geometry/Geom.h"
-//# include "../scene_graph/FrsMaterial.h"
-# include "../view_map/SilhouetteGeomEngine.h"
-# include "../view_map/Interface0D.h"
-# include "../view_map/Interface1D.h"
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2010 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __FREESTYLE_CURVE_H__
+#define __FREESTYLE_CURVE_H__
+
+/** \file blender/freestyle/intern/stroke/Curve.h
+ * \ingroup freestyle
+ * \brief Class to define a container for curves
+ * \author Stephane Grabli
+ * \date 11/01/2003
+ */
+
+#include <deque>
+
+#include "../geometry/Geom.h"
+
+//#include "../scene_graph/FrsMaterial.h"
+
+#include "../view_map/Interface0D.h"
+#include "../view_map/Interface1D.h"
+#include "../view_map/Silhouette.h"
+#include "../view_map/SilhouetteGeomEngine.h"
+
+#include "../system/BaseIterator.h"
using namespace std;
using namespace Geometry;
- /**********************************/
- /* */
- /* */
- /* CurvePoint */
- /* */
- /* */
- /**********************************/
+/**********************************/
+/* */
+/* */
+/* CurvePoint */
+/* */
+/* */
+/**********************************/
/*! Class to represent a point of a curve.
- * A CurvePoint can be any point of a 1D curve
- * (it doesn't have to be a vertex of the curve).
- * Any Interface1D is built upon ViewEdges, themselves
- * built upon FEdges. Therefore, a curve is basically
+ * A CurvePoint can be any point of a 1D curve (it doesn't have to be a vertex of the curve).
+ * Any Interface1D is built upon ViewEdges, themselves built upon FEdges. Therefore, a curve is basically
* a polyline made of a list SVertex.
- * Thus, a CurvePoint is built by lineraly interpolating
- * two SVertex.
- * CurvePoint can be used as virtual points while
- * querying 0D information along a curve at a given resolution.
+ * Thus, a CurvePoint is built by lineraly interpolating two SVertex.
+ * CurvePoint can be used as virtual points while querying 0D information along a curve at a given resolution.
*/
class LIB_STROKE_EXPORT CurvePoint : public Interface0D
{
public: // Implementation of Interface0D
- /*! Returns the string "CurvePoint"*/
- virtual string getExactTypeName() const {
- return "CurvePoint";
- }
-
- // Data access methods
- /*! Returns the 3D X coordinate of the point */
- virtual real getX() const {
- return _Point3d.x();
- }
- /*! Returns the 3D Y coordinate of the point */
- virtual real getY() const {
- return _Point3d.y();
- }
- /*! Returns the 3D Z coordinate of the point */
- virtual real getZ() const {
- return _Point3d.z();
- }
- /*! Returns the 3D point. */
- virtual Vec3f getPoint3D() const {
- return _Point3d;
- }
- /*! Returns the projected 3D X coordinate of the point */
- virtual real getProjectedX() const {
- return _Point2d.x();
- }
- /*! Returns the projected 3D Y coordinate of the point */
- virtual real getProjectedY() const {
- return _Point2d.y();
- }
- /*! Returns the projected 3D Z coordinate of the point */
- virtual real getProjectedZ() const {
- return _Point2d.z();
- }
- /*! Returns the 2D point. */
- virtual Vec2f getPoint2D() const {
- return Vec2f((float)_Point2d.x(),(float)_Point2d.y());
- }
-
- virtual FEdge* getFEdge(Interface0D& inter);
- /*! Returns the CurvePoint's Id */
- virtual Id getId() const {
- Id id;
- if(_t2d == 0)
- return __A->getId();
- else if(_t2d == 1)
- return __B->getId();
- return id;
- }
- /*! Returns the CurvePoint's Nature */
- virtual Nature::VertexNature getNature() const {
- Nature::VertexNature nature = Nature::POINT;
- if(_t2d == 0)
- nature |= __A->getNature();
- else if(_t2d == 1)
- nature |= __B->getNature();
- return nature;
- }
-
- /*! Cast the Interface0D in SVertex if it can be. */
- virtual SVertex * castToSVertex(){
- if(_t2d == 0)
- return __A;
- else if(_t2d == 1)
- return __B;
- return Interface0D::castToSVertex();
- }
-
- /*! Cast the Interface0D in ViewVertex if it can be. */
- virtual ViewVertex * castToViewVertex(){
- if(_t2d == 0)
- return __A->castToViewVertex();
- else if(_t2d == 1)
- return __B->castToViewVertex();
- return Interface0D::castToViewVertex();
- }
-
- /*! Cast the Interface0D in NonTVertex if it can be. */
- virtual NonTVertex * castToNonTVertex(){
- if(_t2d == 0)
- return __A->castToNonTVertex();
- else if(_t2d == 1)
- return __B->castToNonTVertex();
- return Interface0D::castToNonTVertex();
- }
-
- /*! Cast the Interface0D in TVertex if it can be. */
- virtual TVertex * castToTVertex(){
- if(_t2d == 0)
- return __A->castToTVertex();
- else if(_t2d == 1)
- return __B->castToTVertex();
- return Interface0D::castToTVertex();
- }
+ /*! Returns the string "CurvePoint"*/
+ virtual string getExactTypeName() const
+ {
+ return "CurvePoint";
+ }
+
+ // Data access methods
+ /*! Returns the 3D X coordinate of the point */
+ virtual real getX() const
+ {
+ return _Point3d.x();
+ }
+
+ /*! Returns the 3D Y coordinate of the point */
+ virtual real getY() const
+ {
+ return _Point3d.y();
+ }
+
+ /*! Returns the 3D Z coordinate of the point */
+ virtual real getZ() const
+ {
+ return _Point3d.z();
+ }
+
+ /*! Returns the 3D point. */
+ virtual Vec3f getPoint3D() const
+ {
+ return _Point3d;
+ }
+
+ /*! Returns the projected 3D X coordinate of the point */
+ virtual real getProjectedX() const
+ {
+ return _Point2d.x();
+ }
+
+ /*! Returns the projected 3D Y coordinate of the point */
+ virtual real getProjectedY() const
+ {
+ return _Point2d.y();
+ }
+
+ /*! Returns the projected 3D Z coordinate of the point */
+ virtual real getProjectedZ() const
+ {
+ return _Point2d.z();
+ }
+
+ /*! Returns the 2D point. */
+ virtual Vec2f getPoint2D() const
+ {
+ return Vec2f((float)_Point2d.x(), (float)_Point2d.y());
+ }
+
+ virtual FEdge* getFEdge(Interface0D& inter);
+
+ /*! Returns the CurvePoint's Id */
+ virtual Id getId() const
+ {
+ Id id;
+ if (_t2d == 0)
+ return __A->getId();
+ else if (_t2d == 1)
+ return __B->getId();
+ return id;
+ }
+
+ /*! Returns the CurvePoint's Nature */
+ virtual Nature::VertexNature getNature() const
+ {
+ Nature::VertexNature nature = Nature::POINT;
+ if (_t2d == 0)
+ nature |= __A->getNature();
+ else if (_t2d == 1)
+ nature |= __B->getNature();
+ return nature;
+ }
+
+ /*! Cast the Interface0D in SVertex if it can be. */
+ virtual SVertex * castToSVertex()
+ {
+ if (_t2d == 0)
+ return __A;
+ else if (_t2d == 1)
+ return __B;
+ return Interface0D::castToSVertex();
+ }
+
+ /*! Cast the Interface0D in ViewVertex if it can be. */
+ virtual ViewVertex * castToViewVertex()
+ {
+ if (_t2d == 0)
+ return __A->castToViewVertex();
+ else if (_t2d == 1)
+ return __B->castToViewVertex();
+ return Interface0D::castToViewVertex();
+ }
+
+ /*! Cast the Interface0D in NonTVertex if it can be. */
+ virtual NonTVertex * castToNonTVertex()
+ {
+ if (_t2d == 0)
+ return __A->castToNonTVertex();
+ else if (_t2d == 1)
+ return __B->castToNonTVertex();
+ return Interface0D::castToNonTVertex();
+ }
+
+ /*! Cast the Interface0D in TVertex if it can be. */
+ virtual TVertex * castToTVertex()
+ {
+ if (_t2d == 0)
+ return __A->castToTVertex();
+ else if (_t2d == 1)
+ return __B->castToTVertex();
+ return Interface0D::castToTVertex();
+ }
+
public:
- typedef SVertex vertex_type;
+ typedef SVertex vertex_type;
+
protected:
- SVertex *__A;
- SVertex *__B;
- float _t2d;
- //float _t3d;
- Vec3r _Point2d;
- Vec3r _Point3d;
+ SVertex *__A;
+ SVertex *__B;
+ float _t2d;
+ //float _t3d;
+ Vec3r _Point2d;
+ Vec3r _Point3d;
+
public:
- /*! Defult Constructor. */
- CurvePoint();
- /*! Builds a CurvePoint from two SVertex and an interpolation
- * parameter.
- * \param iA
- * The first SVertex
- * \param iB
- * The second SVertex
- * \param t2d
- * A 2D interpolation parameter
- * used to linearly interpolate \a iA and \a iB
- */
- CurvePoint(SVertex *iA, SVertex *iB, float t2d) ;
- /*! Builds a CurvePoint from two CurvePoint and an interpolation parameter.
- * \param iA
- * The first CurvePoint
- * \param iB
- * The second CurvePoint
- * \param t2d
- * The 2D interpolation parameter used
- * to linearly interpolate \a iA and \a iB.
- */
- CurvePoint(CurvePoint *iA, CurvePoint *iB, float t2d) ;
- // CurvePoint(SVertex *iA, SVertex *iB, float t2d, float t3d) ;
- /*! Copy Constructor. */
- CurvePoint(const CurvePoint& iBrother) ;
- /*! Operator = */
- CurvePoint& operator=(const CurvePoint& iBrother) ;
- /*! Destructor */
- virtual ~CurvePoint() {}
- /*! Operator == */
- bool operator==(const CurvePoint& b){
- return ((__A==b.__A) && (__B==b.__B) && (_t2d==b._t2d));
- }
-
- /* accessors */
- /*! Returns the first SVertex upon which
- * the CurvePoint is built. */
- inline SVertex * A() {return __A;}
- /*! Returns the second SVertex upon which
- * the CurvePoint is built. */
- inline SVertex * B() {return __B;}
- /*! Returns the interpolation parameter. */
- inline float t2d() const {return _t2d;}
- //inline const float t3d() const {return _t3d;}
-
- /* modifiers */
- /*! Sets the first SVertex upon which to build
- * the CurvePoint.
- */
- inline void setA(SVertex *iA) {__A = iA;}
- /*! Sets the second SVertex upon which to build
- * the CurvePoint.
- */
- inline void setB(SVertex *iB) {__B = iB;}
- /*! Sets the 2D interpolation parameter to use.
- */
- inline void setT2d(float t) {_t2d = t;}
- //inline void SetT3d(float t) {_t3d = t;}
-
- /* Information access interface */
-
- FEdge *fedge() ;
- inline const Vec3r& point2d() const {return _Point2d;}
- inline const Vec3r& point3d() const {return _Point3d;}
- Vec3r normal() const ;
- //FrsMaterial material() const ;
- // Id shape_id() const ;
- const SShape * shape() const ;
- // float shape_importance() const ;
-
- //const unsigned qi() const ;
- occluder_container::const_iterator occluders_begin() const ;
- occluder_container::const_iterator occluders_end() const ;
- bool occluders_empty() const ;
- int occluders_size() const ;
- const Polygon3r& occludee() const ;
- const SShape * occluded_shape() const ;
- const bool occludee_empty() const ;
- real z_discontinuity() const ;
- // float local_average_depth() const ;
- // float local_depth_variance() const ;
- // real local_average_density(float sigma = 2.3f) const ;
- // Vec3r shaded_color() const ;
-// Vec3r orientation2d() const ;
-// Vec3r orientation3d() const ;
- // // real curvature2d() const {return viewedge()->curvature2d((_VertexA->point2d()+_VertexB->point2d())/2.0);}
- // Vec3r curvature2d_as_vector() const ;
- // /*! angle in radians */
- // real curvature2d_as_angle() const ;
-
- real curvatureFredo () const;
- Vec2d directionFredo () const;
+ /*! Defult Constructor. */
+ CurvePoint();
+
+ /*! Builds a CurvePoint from two SVertex and an interpolation parameter.
+ * \param iA
+ * The first SVertex
+ * \param iB
+ * The second SVertex
+ * \param t2d
+ * A 2D interpolation parameter used to linearly interpolate \a iA and \a iB
+ */
+ CurvePoint(SVertex *iA, SVertex *iB, float t2d);
+
+ /*! Builds a CurvePoint from two CurvePoint and an interpolation parameter.
+ * \param iA
+ * The first CurvePoint
+ * \param iB
+ * The second CurvePoint
+ * \param t2d
+ * The 2D interpolation parameter used to linearly interpolate \a iA and \a iB.
+ */
+ CurvePoint(CurvePoint *iA, CurvePoint *iB, float t2d);
+
+ //CurvePoint(SVertex *iA, SVertex *iB, float t2d, float t3d);
+
+ /*! Copy Constructor. */
+ CurvePoint(const CurvePoint& iBrother);
+
+ /*! Operator = */
+ CurvePoint& operator=(const CurvePoint& iBrother);
+
+ /*! Destructor */
+ virtual ~CurvePoint() {}
+
+ /*! Operator == */
+ bool operator==(const CurvePoint& b)
+ {
+ return ((__A == b.__A) && (__B == b.__B) && (_t2d == b._t2d));
+ }
+
+ /* accessors */
+ /*! Returns the first SVertex upon which the CurvePoint is built. */
+ inline SVertex *A()
+ {
+ return __A;
+ }
+
+ /*! Returns the second SVertex upon which the CurvePoint is built. */
+ inline SVertex *B()
+ {
+ return __B;
+ }
+
+ /*! Returns the interpolation parameter. */
+ inline float t2d() const
+ {
+ return _t2d;
+ }
+
+#if 0
+ inline const float t3d() const
+ {
+ return _t3d;
+ }
+#endif
+
+ /* modifiers */
+ /*! Sets the first SVertex upon which to build the CurvePoint. */
+ inline void setA(SVertex *iA)
+ {
+ __A = iA;
+ }
+
+ /*! Sets the second SVertex upon which to build the CurvePoint. */
+ inline void setB(SVertex *iB)
+ {
+ __B = iB;
+ }
+
+ /*! Sets the 2D interpolation parameter to use. */
+ inline void setT2d(float t)
+ {
+ _t2d = t;
+ }
+
+#if 0
+ inline void SetT3d(float t)
+ {
+ _t3d = t;
+ }
+#endif
+
+ /* Information access interface */
+
+ FEdge *fedge();
+
+ inline const Vec3r& point2d() const
+ {
+ return _Point2d;
+ }
+
+ inline const Vec3r& point3d() const
+ {
+ return _Point3d;
+ }
+
+ Vec3r normal() const;
+ //FrsMaterial material() const;
+ //Id shape_id() const;
+ const SShape *shape() const;
+ //float shape_importance() const;
+
+ //const unsigned qi() const;
+ occluder_container::const_iterator occluders_begin() const;
+ occluder_container::const_iterator occluders_end() const;
+ bool occluders_empty() const;
+ int occluders_size() const;
+ const Polygon3r& occludee() const;
+ const SShape *occluded_shape() const;
+ const bool occludee_empty() const;
+ real z_discontinuity() const;
+#if 0
+ float local_average_depth() const;
+ float local_depth_variance() const;
+ real local_average_density(float sigma = 2.3f) const;
+ Vec3r shaded_color() const;
+ Vec3r orientation2d() const;
+ Vec3r orientation3d() const;
+
+ real curvature2d() const
+ {
+ return viewedge()->curvature2d((_VertexA->point2d() + _VertexB->point2d()) / 2.0);
+ }
+
+ Vec3r curvature2d_as_vector() const;
+ /*! angle in radians */
+ real curvature2d_as_angle() const;
+#endif
+
+ real curvatureFredo() const;
+ Vec2d directionFredo() const;
};
- /**********************************/
- /* */
- /* */
- /* Curve */
- /* */
- /* */
- /**********************************/
+/**********************************/
+/* */
+/* */
+/* Curve */
+/* */
+/* */
+/**********************************/
namespace CurveInternal {
- class CurvePoint_const_traits;
- class CurvePoint_nonconst_traits;
- template<class Traits> class __point_iterator;
- class CurvePointIterator;
+
+class CurvePoint_const_traits;
+class CurvePoint_nonconst_traits;
+template<class Traits> class __point_iterator;
+class CurvePointIterator;
+
} // end of namespace CurveInternal
/*! Base class for curves made of CurvePoints.
@@ -286,182 +368,222 @@ namespace CurveInternal {
class LIB_STROKE_EXPORT Curve : public Interface1D
{
public:
- typedef CurvePoint Vertex;
- typedef CurvePoint Point;
- typedef Point point_type;
- typedef Vertex vertex_type;
- typedef deque<Vertex*> vertex_container;
-
- /* Iterator to iterate over a vertex edges */
-
- typedef CurveInternal::__point_iterator<CurveInternal::CurvePoint_nonconst_traits > point_iterator;
- typedef CurveInternal::__point_iterator<CurveInternal::CurvePoint_const_traits > const_point_iterator;
- typedef point_iterator vertex_iterator ;
- typedef const_point_iterator const_vertex_iterator ;
-
+ typedef CurvePoint Vertex;
+ typedef CurvePoint Point;
+ typedef Point point_type;
+ typedef Vertex vertex_type;
+ typedef deque<Vertex*> vertex_container;
+
+ /* Iterator to iterate over a vertex edges */
+
+ typedef CurveInternal::__point_iterator<CurveInternal::CurvePoint_nonconst_traits > point_iterator;
+ typedef CurveInternal::__point_iterator<CurveInternal::CurvePoint_const_traits > const_point_iterator;
+ typedef point_iterator vertex_iterator ;
+ typedef const_point_iterator const_vertex_iterator ;
+
protected:
- vertex_container _Vertices;
- double _Length;
- Id _Id;
- unsigned _nSegments; // number of segments
+ vertex_container _Vertices;
+ double _Length;
+ Id _Id;
+ unsigned _nSegments; // number of segments
public:
- /*! Default Constructor. */
- Curve() {_Length = 0;_Id = 0;_nSegments=0;}
- /*! Builds a Curve from its id */
- Curve(const Id& id) {_Length = 0;_Id = id;_nSegments=0;}
- /*! Copy Constructor. */
- Curve(const Curve& iBrother) {_Length = iBrother._Length;_Vertices = iBrother._Vertices;_Id=iBrother._Id;_nSegments=0;}
- /*! Destructor. */
- virtual ~Curve() ;
- /*! Returns the string "Curve" */
- virtual string getExactTypeName() const {
- return "Curve";
- }
-
- /*
- fredo's curvature storage
- */
- void computeCurvatureAndOrientation ();
-
- /*! Adds a single vertex (CurvePoint) at the end of the Curve */
- inline void push_vertex_back(Vertex *iVertex)
- {
- if(!_Vertices.empty())
- {
- Vec3r vec_tmp(iVertex->point2d() - _Vertices.back()->point2d());
- _Length += vec_tmp.norm();
- ++_nSegments;
- }
- Vertex * new_vertex = new Vertex(*iVertex);
- _Vertices.push_back(new_vertex);
- }
- /*! Adds a single vertex (SVertex) at the end of the Curve */
- inline void push_vertex_back(SVertex *iVertex)
- {
- if(!_Vertices.empty())
- {
- Vec3r vec_tmp(iVertex->point2d() - _Vertices.back()->point2d());
- _Length += vec_tmp.norm();
- ++_nSegments;
- }
- Vertex *new_vertex = new Vertex(iVertex, 0,0);
- _Vertices.push_back(new_vertex);
- }
- /*! Adds a single vertex (CurvePoint) at the front of the Curve */
- inline void push_vertex_front(Vertex *iVertex)
- {
- if(!_Vertices.empty())
- {
- Vec3r vec_tmp(iVertex->point2d() - _Vertices.front()->point2d());
- _Length += vec_tmp.norm();
- ++_nSegments;
- }
- Vertex * new_vertex = new Vertex(*iVertex);
- _Vertices.push_front(new_vertex);
- }
- /*! Adds a single vertex (SVertex) at the front of the Curve */
- inline void push_vertex_front(SVertex *iVertex)
- {
- if(!_Vertices.empty())
- {
- Vec3r vec_tmp(iVertex->point2d() - _Vertices.front()->point2d());
- _Length += vec_tmp.norm();
- ++_nSegments;
- }
- Vertex *new_vertex = new Vertex(iVertex, 0,0);
- _Vertices.push_front(new_vertex);
- }
- /*! Returns true is the Curve doesn't have any Vertex yet. */
- inline bool empty() const {return _Vertices.empty();}
- /*! Returns the 2D length of the Curve.*/
- inline real getLength2D() const {return _Length;}
- /*! Returns the Id of the 1D element .*/
- virtual Id getId() const {
- return _Id;
- }
- /*! Returns the number of segments in the
- * oplyline constituing the Curve.
- */
- inline unsigned int nSegments() const {return _nSegments;}
-
- inline void setId(const Id& id){_Id = id;}
- /* Information access interface */
-
-
- //inline Vec3r shaded_color(int iCombination = 0) const ;
- // inline Vec3r orientation2d(point_iterator it) const ;
- //Vec3r orientation2d(int iCombination = 0) const ;
- // Vec3r orientation3d(point_iterator it) const ;
- //Vec3r orientation3d(int iCombination = 0) const ;
- // real curvature2d(point_iterator it) const {return (*it)->curvature2d();}
- // real curvature2d(int iCombination = 0) const ;
- //FrsMaterial material() const ;
- //int qi() const ;
- // occluder_container::const_iterator occluders_begin() const ;
- // occluder_container::const_iterator occluders_end() const ;
- //int occluders_size() const;
- //bool occluders_empty() const ;
- // const Polygon3r& occludee() const {return *(_FEdgeA->aFace());}
- //const SShape * occluded_shape() const;
- //const bool occludee_empty() const ;
- //real z_discontinuity(int iCombination = 0) const ;
- // int shape_id() const ;
- //const SShape * shape() const ;
- //float shape_importance(int iCombination=0) const ;
- //float local_average_depth(int iCombination = 0) const;
- //float local_depth_variance(int iCombination = 0) const ;
- //real local_average_density(float sigma = 2.3f, int iCombination = 0) const ;
- //Vec3r curvature2d_as_vector(int iCombination=0) const ;
- /*! angle in radians */
- //real curvature2d_as_angle(int iCombination=0) const ;
-
- /* advanced iterators access */
- point_iterator points_begin(float step = 0);
- const_point_iterator points_begin(float step = 0) const;
- point_iterator points_end(float step = 0);
- const_point_iterator points_end(float step = 0) const;
-
- // methods given for convenience */
- point_iterator vertices_begin();
- const_point_iterator vertices_begin() const;
- point_iterator vertices_end();
- const_point_iterator vertices_end() const;
-
- // specialized iterators access
- CurveInternal::CurvePointIterator curvePointsBegin(float t=0.f);
- CurveInternal::CurvePointIterator curvePointsEnd(float t=0.f);
-
- CurveInternal::CurvePointIterator curveVerticesBegin();
- CurveInternal::CurvePointIterator curveVerticesEnd();
-
- // Iterators access
- /*! Returns an Interface0DIterator pointing onto
- * the first vertex of the Curve and that can iterate
- * over the \a vertices of the Curve.
- */
- virtual Interface0DIterator verticesBegin();
- /*! Returns an Interface0DIterator pointing after
- * the last vertex of the Curve and that can iterate
- * over the \a vertices of the Curve.
- */
- virtual Interface0DIterator verticesEnd();
- /*! Returns an Interface0DIterator pointing onto
- * the first point of the Curve and that can iterate
- * over the \a points of the Curve at any resolution.
- * At each iteration a virtual temporary CurvePoint
- * is created.
- */
- virtual Interface0DIterator pointsBegin(float t=0.f);
- /*! Returns an Interface0DIterator pointing after
- * the last point of the Curve and that can iterate
- * over the \a points of the Curve at any resolution.
- * At each iteration a virtual temporary CurvePoint
- * is created.
- */
- virtual Interface0DIterator pointsEnd(float t=0.f);
-};
+ /*! Default Constructor. */
+ Curve()
+ {
+ _Length = 0;
+ _Id = 0;
+ _nSegments = 0;
+ }
+
+ /*! Builds a Curve from its id */
+ Curve(const Id& id)
+ {
+ _Length = 0;
+ _Id = id;
+ _nSegments = 0;
+ }
+
+ /*! Copy Constructor. */
+ Curve(const Curve& iBrother)
+ {
+ _Length = iBrother._Length;
+ _Vertices = iBrother._Vertices;
+ _Id = iBrother._Id;
+ _nSegments = 0;
+ }
+
+ /*! Destructor. */
+ virtual ~Curve();
+
+ /*! Returns the string "Curve" */
+ virtual string getExactTypeName() const
+ {
+ return "Curve";
+ }
+
+ /* fredo's curvature storage */
+ void computeCurvatureAndOrientation();
+
+ /*! Adds a single vertex (CurvePoint) at the end of the Curve */
+ inline void push_vertex_back(Vertex *iVertex)
+ {
+ if (!_Vertices.empty()) {
+ Vec3r vec_tmp(iVertex->point2d() - _Vertices.back()->point2d());
+ _Length += vec_tmp.norm();
+ ++_nSegments;
+ }
+ Vertex *new_vertex = new Vertex(*iVertex);
+ _Vertices.push_back(new_vertex);
+ }
+
+ /*! Adds a single vertex (SVertex) at the end of the Curve */
+ inline void push_vertex_back(SVertex *iVertex)
+ {
+ if (!_Vertices.empty()) {
+ Vec3r vec_tmp(iVertex->point2d() - _Vertices.back()->point2d());
+ _Length += vec_tmp.norm();
+ ++_nSegments;
+ }
+ Vertex *new_vertex = new Vertex(iVertex, 0, 0);
+ _Vertices.push_back(new_vertex);
+ }
+
+ /*! Adds a single vertex (CurvePoint) at the front of the Curve */
+ inline void push_vertex_front(Vertex *iVertex)
+ {
+ if (!_Vertices.empty()) {
+ Vec3r vec_tmp(iVertex->point2d() - _Vertices.front()->point2d());
+ _Length += vec_tmp.norm();
+ ++_nSegments;
+ }
+ Vertex *new_vertex = new Vertex(*iVertex);
+ _Vertices.push_front(new_vertex);
+ }
+
+ /*! Adds a single vertex (SVertex) at the front of the Curve */
+ inline void push_vertex_front(SVertex *iVertex)
+ {
+ if (!_Vertices.empty()) {
+ Vec3r vec_tmp(iVertex->point2d() - _Vertices.front()->point2d());
+ _Length += vec_tmp.norm();
+ ++_nSegments;
+ }
+ Vertex *new_vertex = new Vertex(iVertex, 0, 0);
+ _Vertices.push_front(new_vertex);
+ }
+
+ /*! Returns true is the Curve doesn't have any Vertex yet. */
+ inline bool empty() const
+ {
+ return _Vertices.empty();
+ }
+
+ /*! Returns the 2D length of the Curve. */
+ inline real getLength2D() const
+ {
+ return _Length;
+ }
+
+ /*! Returns the Id of the 1D element. */
+ virtual Id getId() const
+ {
+ return _Id;
+ }
+
+ /*! Returns the number of segments in the polyline constituing the Curve. */
+ inline unsigned int nSegments() const
+ {
+ return _nSegments;
+ }
+
+ inline void setId(const Id& id)
+ {
+ _Id = id;
+ }
+
+ /* Information access interface */
+
+#if 0
+ inline Vec3r shaded_color(int iCombination = 0) const;
+ inline Vec3r orientation2d(point_iterator it) const;
+ Vec3r orientation2d(int iCombination = 0) const;
+ Vec3r orientation3d(point_iterator it) const;
+ Vec3r orientation3d(int iCombination = 0) const;
+
+ real curvature2d(point_iterator it) const
+ {
+ return (*it)->curvature2d();
+ }
+
+ real curvature2d(int iCombination = 0) const;
+ FrsMaterial material() const;
+ int qi() const;
+ occluder_container::const_iterator occluders_begin() const;
+ occluder_container::const_iterator occluders_end() const;
+ int occluders_size() const;
+ bool occluders_empty() const;
+
+ const Polygon3r& occludee() const
+ {
+ return *(_FEdgeA->aFace());
+ }
+
+ const SShape *occluded_shape() const;
+ const bool occludee_empty() const;
+ real z_discontinuity(int iCombination = 0) const;
+ int shape_id() const;
+ const SShape *shape() const;
+ float shape_importance(int iCombination = 0) const;
+ float local_average_depth(int iCombination = 0) const;
+ float local_depth_variance(int iCombination = 0) const;
+ real local_average_density(float sigma = 2.3f, int iCombination = 0) const;
+ Vec3r curvature2d_as_vector(int iCombination = 0) const;
+ /*! angle in radians */
+ real curvature2d_as_angle(int iCombination = 0) const;
+#endif
-
+ /* advanced iterators access */
+ point_iterator points_begin(float step = 0);
+ const_point_iterator points_begin(float step = 0) const;
+ point_iterator points_end(float step = 0);
+ const_point_iterator points_end(float step = 0) const;
+
+ /* methods given for convenience */
+ point_iterator vertices_begin();
+ const_point_iterator vertices_begin() const;
+ point_iterator vertices_end();
+ const_point_iterator vertices_end() const;
+
+ // specialized iterators access
+ CurveInternal::CurvePointIterator curvePointsBegin(float t = 0.0f);
+ CurveInternal::CurvePointIterator curvePointsEnd(float t = 0.0f);
+
+ CurveInternal::CurvePointIterator curveVerticesBegin();
+ CurveInternal::CurvePointIterator curveVerticesEnd();
+
+ // Iterators access
+ /*! Returns an Interface0DIterator pointing onto the first vertex of the Curve and that can iterate
+ * over the \a vertices of the Curve.
+ */
+ virtual Interface0DIterator verticesBegin();
+
+ /*! Returns an Interface0DIterator pointing after the last vertex of the Curve and that can iterate
+ * over the \a vertices of the Curve.
+ */
+ virtual Interface0DIterator verticesEnd();
+
+ /*! Returns an Interface0DIterator pointing onto the first point of the Curve and that can iterate
+ * over the \a points of the Curve at any resolution.
+ * At each iteration a virtual temporary CurvePoint is created.
+ */
+ virtual Interface0DIterator pointsBegin(float t = 0.0f);
+
+ /*! Returns an Interface0DIterator pointing after the last point of the Curve and that can iterate
+ * over the \a points of the Curve at any resolution.
+ * At each iteration a virtual temporary CurvePoint is created.
+ */
+ virtual Interface0DIterator pointsEnd(float t = 0.0f);
+};
-#endif
+#endif // __FREESTYLE_CURVE_H__