X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FINTERP_KERNEL%2FGeometric2D%2FInterpKernelGeo2DEdge.hxx;h=43eed2a8727c519d5f58b26da8a5beebb160cef4;hb=7de62920cadf9bfcd33addf31d4a8256bffaf1ec;hp=b270cfa1df66d5438d5829e0067290ba44d17bed;hpb=f1a947b32a36d8dc8e3079b25305bb50e8cb59a0;p=tools%2Fmedcoupling.git diff --git a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DEdge.hxx b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DEdge.hxx index b270cfa1d..43eed2a87 100644 --- a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DEdge.hxx +++ b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DEdge.hxx @@ -1,9 +1,9 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -22,7 +22,6 @@ #define __INTERPKERNELGEO2DEDGE_HXX__ #include "INTERPKERNELDefines.hxx" -#include "InterpKernelGeo2DComposedEdge.hxx" #include "InterpKernelException.hxx" #include "InterpKernelGeo2DBounds.hxx" #include "InterpKernelGeo2DNode.hxx" @@ -35,34 +34,34 @@ namespace INTERP_KERNEL { typedef enum - { - SEG = 1, - ARC_CIRCLE = 4, - ARC_PARABOL = 8 - } TypeOfFunction; + { + SEG = 1, + ARC_CIRCLE = 4, + ARC_PARABOL = 8 + } TypeOfFunction; typedef enum - { - CIRCLE = 0 , - PARABOL = 1 - } TypeOfMod4QuadEdge; + { + CIRCLE = 0 , + PARABOL = 1 + } TypeOfMod4QuadEdge; typedef enum - { - START = 5, - END = 1, - INSIDE = 2, - OUT_BEFORE = 3, - OUT_AFTER = 4 - } TypeOfLocInEdge; //see Edge::OFFSET_FOR_TYPEOFLOCINEDGE - + { + START = 5, + END = 1, + INSIDE = 2, + OUT_BEFORE = 3, + OUT_AFTER = 4 + } TypeOfLocInEdge; //see Edge::OFFSET_FOR_TYPEOFLOCINEDGE + typedef enum - { - FULL_IN_1 = 1, - FULL_ON_1 = 4, - FULL_OUT_1 = 2, - FULL_UNKNOWN = 3 - } TypeOfEdgeLocInPolygon; + { + FULL_IN_1 = 1, + FULL_ON_1 = 4, + FULL_OUT_1 = 2, + FULL_UNKNOWN = 3 + } TypeOfEdgeLocInPolygon; class INTERPKERNEL_EXPORT MergePoints { @@ -83,6 +82,9 @@ namespace INTERP_KERNEL bool isEnd2(unsigned rk) const; void clear(); unsigned getNumberOfAssociations() const; + void updateMergedNodes(int e1Start, int e1End, int e2Start, int e2End, std::map& mergedNodes); + private: + static void PushInMap(int key, int value, std::map& mergedNodes); private: unsigned _ass1Start1 : 1; unsigned _ass1End1 : 1; @@ -94,6 +96,8 @@ namespace INTERP_KERNEL unsigned _ass2End2 : 1; }; + class Edge; + class ComposedEdge; /*! * This class is in charge to store an intersection point as result of \b non oververlapping edge intersection. * This class manages the cases when intersect element is one of the extrimities of edge1 and/or edge2. @@ -142,11 +146,12 @@ namespace INTERP_KERNEL class INTERPKERNEL_EXPORT EdgeIntersector { protected: - //! All non symetric methods are relative to 'e1'. + //! All non symmetric methods are relative to 'e1'. EdgeIntersector(const Edge& e1, const Edge& e2):_e1(e1),_e2(e2) { } public: virtual ~EdgeIntersector() { } virtual bool keepOrder() const = 0; + virtual bool areColinears() const = 0; //!to call only if 'areOverlapped' have been set to true when areOverlappedOrOnlyColinears was called virtual bool haveTheySameDirection() const = 0; //!to call only if 'areOverlapped' have been set to true when areOverlappedOrOnlyColinears was called @@ -190,9 +195,9 @@ namespace INTERP_KERNEL /*! * Deal with an oriented edge of a polygon. - * An Edge is definied with a start node a end node and an equation of 1D curve. + * An Edge is defined with a start node, an end node and an equation of 1D curve. * All other attributes are mutable because they don't impact these 3 invariant attributes. - * To be exact start and end node can change (adress) but their location remain + * To be exact start and end nodes can change (address) but their location remain * the same (at precision). */ class INTERPKERNEL_EXPORT Edge @@ -207,6 +212,12 @@ namespace INTERP_KERNEL void declareOn() const; void declareIn() const; void declareOut() const; + void initHitStatus() const { _hit=false; } + bool getHitStatus() const { return _hit; } + void hitMeAlone(double xBary, double yBary, double dimChar) { _hit=true; applySimilarity(xBary,yBary,dimChar); } + void unHitMeAlone(double xBary, double yBary, double dimChar) { _hit=true; unApplySimilarity(xBary,yBary,dimChar); } + void hitMeAfter(double xBary, double yBary, double dimChar) { if(!_hit) hitMeAlone(xBary,yBary,dimChar); } + void unHitMeAfter(double xBary, double yBary, double dimChar) { if(!_hit) unHitMeAlone(xBary,yBary,dimChar); } const Bounds& getBounds() const { return _bounds; } void fillXfigStreamForLoc(std::ostream& stream) const; Node *getNode(TypeOfLocInEdge where) const { if(where==START) return _start; else if(where==END) return _end; else return 0; } @@ -225,6 +236,7 @@ namespace INTERP_KERNEL static Edge *BuildEdgeFrom(Node *start, Node *end); template static Edge *BuildEdgeFrom(Node *start, Node *middle, Node *end); + static Edge *BuildEdgeFrom3Points(const double *start, const double *middle, const double *end); virtual void update(Node *m) = 0; //! returns area between this and axe Ox delimited along Ox by _start and _end. virtual double getAreaOfZone() const = 0; @@ -236,6 +248,10 @@ namespace INTERP_KERNEL virtual double getCurveLength() const = 0; virtual void getBarycenter(double *bary) const = 0; virtual void getBarycenterOfZone(double *bary) const = 0; + //! return the middle of two points + virtual void getMiddleOfPoints(const double *p1, const double *p2, double *mid) const = 0; + //! return the middle of two points respecting the orientation defined by this (relevant for arc of circle). By default same as getMiddleOfPoints() + virtual void getMiddleOfPointsOriented(const double *p1, const double *p2, double *mid) const; //! Retrieves a point that is owning to this, well placed for IN/OUT detection of this. Typically midlle of this is returned. virtual Node *buildRepresentantOfMySelf() const = 0; //! Given a magnitude specified by sub-type returns if in or not. See getCharactValue method. @@ -262,6 +278,7 @@ namespace INTERP_KERNEL virtual void dumpInXfigFile(std::ostream& stream, bool direction, int resolution, const Bounds& box) const = 0; bool isEqual(const Edge& other) const; public: + bool sortSubNodesAbs(const double *coo, std::vector& subNodes); void sortIdsAbs(const std::vector& addNodes, const std::map& mapp1, const std::map& mapp2, std::vector& edgesThis); virtual void fillGlobalInfoAbs(bool direction, const std::map& mapThis, const std::map& mapOther, int offset1, int offset2, double fact, double baryX, double baryY, std::vector& edgesThis, std::vector& addCoo, std::map mapAddCoo) const = 0; @@ -278,6 +295,7 @@ namespace INTERP_KERNEL static bool SplitOverlappedEdges(const Edge *e1, const Edge *e2, Node *nS, Node *nE, bool direction, int code, ComposedEdge& outVal1, ComposedEdge& outVal2); protected: + mutable bool _hit; mutable unsigned char _cnt; mutable TypeOfEdgeLocInPolygon _loc; Bounds _bounds;