1 // Copyright (C) 2007-2015 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 // Author : Anthony Geay (CEA/DEN)
21 #ifndef __INTERPKERNELGEO2DEDGEARCCIRCLE_HXX__
22 #define __INTERPKERNELGEO2DEDGEARCCIRCLE_HXX__
24 #include "INTERPKERNELDefines.hxx"
25 #include "InterpKernelGeo2DEdge.hxx"
27 namespace INTERP_KERNEL
29 class INTERPKERNEL_EXPORT ArcCArcCIntersector : public SameTypeEdgeIntersector
32 ArcCArcCIntersector(const EdgeArcCircle& e1, const EdgeArcCircle& e2);
33 bool haveTheySameDirection() const;
34 bool areColinears() const;
35 void getPlacements(Node *start, Node *end, TypeOfLocInEdge& whereStart, TypeOfLocInEdge& whereEnd, MergePoints& commonNode) const;
36 void areOverlappedOrOnlyColinears(const Bounds *whereToFind, bool& obviousNoIntersection, bool& areOverlapped);
37 std::list< IntersectElement > getIntersectionsCharacteristicVal() const;
39 //! return angle in ]-Pi;Pi[ - 'node' must be on curve of '_e1'
40 double getAngle(Node *node) const;
41 static bool internalAreColinears(const EdgeArcCircle& a1, const EdgeArcCircle& a2, double& distBetweenCenters, double& cst, double& radiusL, double centerL[2], double& raduisB, double centerB[2]);
42 static bool areArcsOverlapped(const EdgeArcCircle& a1, const EdgeArcCircle& a2);
44 const EdgeArcCircle& getE1() const { return (const EdgeArcCircle&)_e1; }
45 const EdgeArcCircle& getE2() const { return (const EdgeArcCircle&)_e2; }
50 class INTERPKERNEL_EXPORT ArcCSegIntersector : public CrossTypeEdgeIntersector
53 ArcCSegIntersector(const EdgeArcCircle& e1, const EdgeLin& e2, bool reverse=true);
55 bool areColinears() const;
56 void getPlacements(Node *start, Node *end, TypeOfLocInEdge& whereStart, TypeOfLocInEdge& whereEnd, MergePoints& commonNode) const;
57 void areOverlappedOrOnlyColinears(const Bounds *whereToFind, bool& obviousNoIntersection, bool& areOverlapped);
58 std::list< IntersectElement > getIntersectionsCharacteristicVal() const;
60 const EdgeArcCircle& getE1() const { return (const EdgeArcCircle&)_e1; }
61 const EdgeLin& getE2() const { return (const EdgeLin&)_e2; }
70 class INTERPKERNEL_EXPORT EdgeArcCircle : public Edge
73 EdgeArcCircle(std::istream& lineInXfig);
74 EdgeArcCircle(Node *start, Node *middle, Node *end, bool direction = true);
75 EdgeArcCircle(double sX, double sY, double mX, double mY, double eX, double eY);
76 EdgeArcCircle(Node *start, Node *end, const double *center, double radius, double angle0, double deltaAngle, bool direction=true);
78 void changeMiddle(Node *newMiddle);
79 void dumpInXfigFile(std::ostream& stream, bool direction, int resolution, const Bounds& box) const;
81 double getAreaOfZone() const;
82 double getCurveLength() const;
83 void getBarycenter(double *bary) const;
84 void getBarycenterOfZone(double *bary) const;
85 void getMiddleOfPoints(const double *p1, const double *p2, double *mid) const;
86 void getMiddleOfPointsOriented(const double *p1, const double *p2, double *mid) const;
87 bool isIn(double characterVal) const;
88 Node *buildRepresentantOfMySelf() const;
89 bool isLower(double val1, double val2) const;
90 double getCharactValue(const Node& node) const;
91 double getCharactValueBtw0And1(const Node& node) const;
92 double getDistanceToPoint(const double *pt) const;
93 bool isNodeLyingOn(const double *coordOfNode) const;
94 TypeOfFunction getTypeOfFunc() const { return ARC_CIRCLE; }
95 void dynCastFunction(const EdgeLin * &seg,
96 const EdgeArcCircle * &arcSeg) const { arcSeg=this; }
97 const double *getCenter() const { return _center; }
98 void getCenter(double *center) const { center[0]=_center[0]; center[1]=_center[1]; }
99 bool doIHaveSameDirectionAs(const Edge& other) const { return false; }
100 void applySimilarity(double xBary, double yBary, double dimChar);
101 void unApplySimilarity(double xBary, double yBary, double dimChar);
102 double getAngle0() const { return _angle0; }
103 double getRadius() const { return _radius; }
104 double getAngle() const { return _angle; }
105 void tesselate(const int *conn, int offset, double eps, std::vector<int>& newConn, std::vector<double>& addCoo) const;
106 static EdgeArcCircle *BuildFromNodes(Node *start, Node *middle, Node *end);
107 static double GetAbsoluteAngle(const double *vect, double& normVect);
108 static double GetAbsoluteAngleOfNormalizedVect(double ux, double uy);
109 static void GetArcOfCirclePassingThru(const double *start, const double *middle, const double *end,
110 double *center, double& radius, double& angleInRad, double& angleInRad0);
111 //! To avoid in aggressive optimizations nan.
112 static double SafeSqrt(double val) { double ret=std::max(val,0.); return sqrt(ret); }
113 static double SafeAcos(double cosAngle) { double ret=std::min(cosAngle,1.); ret=std::max(ret,-1.); return acos(ret); }
114 static double SafeAsin(double sinAngle) { double ret=std::min(sinAngle,1.); ret=std::max(ret,-1.); return asin(ret); }
115 //! @param start and @param angleIn in ]-Pi;Pi] and @param delta in ]-2*Pi,2*Pi[
116 static bool IsIn2Pi(double start, double delta, double angleIn);
117 //! 'delta' 'start' in ]-Pi;Pi[
118 static bool IsAngleNotIn(double start, double delta, double angleIn);
119 //! for an angle 'angle' in ]-3*Pi;3*Pi[ returns angle in ]-Pi;Pi[
120 static double NormalizeAngle(double angle) { if(angle>M_PI) return angle-2.*M_PI; if(angle<-M_PI) return angle+2.*M_PI; return angle; }
123 Edge *buildEdgeLyingOnMe(Node *start, Node *end, bool direction=true) const;
124 void fillGlobalInfoAbs(bool direction, const std::map<INTERP_KERNEL::Node *,int>& mapThis, const std::map<INTERP_KERNEL::Node *,int>& mapOther, int offset1, int offset2, double fact, double baryX, double baryY,
125 std::vector<int>& edgesThis, std::vector<double>& addCoo, std::map<INTERP_KERNEL::Node *,int> mapAddCoo) const;
126 void fillGlobalInfoAbs2(const std::map<INTERP_KERNEL::Node *,int>& mapThis, const std::map<INTERP_KERNEL::Node *,int>& mapOther, int offset1, int offset2, double fact, double baryX, double baryY,
127 std::vector<int>& edgesOther, std::vector<double>& addCoo, std::map<INTERP_KERNEL::Node *,int>& mapAddCoo) const;
129 //!Value between -2Pi and 2Pi
131 //!Value between -Pi and Pi