-// Copyright (C) 2007-2014 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
*it=new ElementaryEdge(e,direction);
}
+/*! \cond HIDDEN_ITEMS */
struct AbsEdgeCmp
{
AbsEdgeCmp(ElementaryEdge *b):_b1(b) { }
ElementaryEdge *_b1;
};
+/*! \endcond */
double ComposedEdge::getCommonLengthWith(const ComposedEdge& other) const
{
}
/**
- * Reset the status of all edges (OUT, IN, ON) because they were potentially assignated
+ * Reset the status of all edges (OUT, IN, ON) because they were potentially assigned
* by the previous candidate processing.
*/
-void ComposedEdge::initLocationsWithOther(const ComposedEdge& other) const
+void ComposedEdge::InitLocationsWithOther(const ComposedEdge& first, const ComposedEdge& other)
{
std::set<Edge *> s1,s2;
- for(std::list<ElementaryEdge *>::const_iterator it1=_sub_edges.begin();it1!=_sub_edges.end();it1++)
+ for(std::list<ElementaryEdge *>::const_iterator it1=first._sub_edges.begin();it1!=first._sub_edges.end();it1++)
s1.insert((*it1)->getPtr());
for(std::list<ElementaryEdge *>::const_iterator it2=other._sub_edges.begin();it2!=other._sub_edges.end();it2++)
s2.insert((*it2)->getPtr());
- initLocations();
+ first.initLocations();
other.initLocations();
std::vector<Edge *> s3;
std::set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),std::back_insert_iterator< std::vector<Edge *> >(s3));
*/
void ComposedEdge::unApplyGlobalSimilarityExt(ComposedEdge& other, double xBary, double yBary, double fact)
{
- std::set<Node *> allNodes;
- getAllNodes(allNodes);
- other.getAllNodes(allNodes);
- for(std::set<Node *>::iterator iter=allNodes.begin();iter!=allNodes.end();iter++)
- (*iter)->unApplySimilarity(xBary,yBary,fact);
-
- // [Adrien] - same issue as in applyGlobalSimilarity() - see comments there
- std::set<Edge *> allEdges;
- for(std::list<ElementaryEdge *>::iterator iter=_sub_edges.begin();iter!=_sub_edges.end();iter++)
- allEdges.insert((*iter)->getPtr());
- for(std::list<ElementaryEdge *>::iterator iter=other._sub_edges.begin();iter!=other._sub_edges.end();iter++)
- allEdges.insert((*iter)->getPtr());
- for(std::set<Edge *>::iterator iter = allEdges.begin();iter != allEdges.end();iter++)
- (*iter)->unApplySimilarity(xBary,yBary,fact);
+ initNodeHitStatus();
+ other.initNodeHitStatus();
+ unApplySimilarityOnMyNodes(xBary,yBary,fact);
+ other.unApplySimilarityOnMyNodesIfNotAlreadyHit(xBary,yBary,fact);
+ initEdgeHitStatus();
+ other.initEdgeHitStatus();
+ unApplySimilarityOnMyEdges(xBary,yBary,fact);
+ other.unApplySimilarityOnMyEdgesIfNotAlreadyHit(xBary,yBary,fact);
}
double ComposedEdge::normalizeExt(ComposedEdge *other, double& xBary, double& yBary)
*/
void ComposedEdge::applyGlobalSimilarity2(ComposedEdge *other, double xBary, double yBary, double dimChar)
{
- std::set<Node *> allNodes;
- getAllNodes(allNodes);
- std::set<Node *> allNodes2;
- other->getAllNodes(allNodes2);
- for(std::set<Node *>::const_iterator it=allNodes2.begin();it!=allNodes2.end();it++)
- if(allNodes.find(*it)!=allNodes.end())
- (*it)->declareOn();
- allNodes.insert(allNodes2.begin(),allNodes2.end());
- for(std::set<Node *>::iterator iter=allNodes.begin();iter!=allNodes.end();iter++)
- (*iter)->applySimilarity(xBary,yBary,dimChar);
- // [Adrien] many ElementaryEdge might reference the same Edge* - ensure we don'y scale twice!
- std::set<Edge *> allEdges;
- for(std::list<ElementaryEdge *>::iterator iter=_sub_edges.begin();iter!=_sub_edges.end();iter++)
- allEdges.insert((*iter)->getPtr());
- for(std::list<ElementaryEdge *>::iterator iter=other->_sub_edges.begin();iter!=other->_sub_edges.end();iter++)
- allEdges.insert((*iter)->getPtr());
- // Similarity only on set of unique underlying edges:
- for(std::set<Edge *>::iterator iter = allEdges.begin();iter != allEdges.end();iter++)
- (*iter)->applySimilarity(xBary,yBary,dimChar);
+ initNodeHitStatus();
+ other->initNodeHitStatus();
+ applySimilarityOnMyNodes(xBary,yBary,dimChar);
+ other->applySimilarityOnMyNodesIfNotAlreadyHit(xBary,yBary,dimChar);
+ initEdgeHitStatus();
+ other->initEdgeHitStatus();
+ applySimilarityOnMyEdges(xBary,yBary,dimChar);
+ other->applySimilarityOnMyEdgesIfNotAlreadyHit(xBary,yBary,dimChar);
}
/*!
(*iter)->getAllNodes(output);
}
+void ComposedEdge::initNodeHitStatus() const
+{
+ for(std::list<ElementaryEdge *>::const_iterator iter=_sub_edges.begin();iter!=_sub_edges.end();iter++)
+ {
+ (*iter)->getStartNode()->initHitStatus();
+ (*iter)->getEndNode()->initHitStatus();
+ }
+}
+
+void ComposedEdge::applySimilarityOnMyNodes(double xBary, double yBary, double dimChar) const
+{
+ for(std::list<ElementaryEdge *>::const_iterator iter=_sub_edges.begin();iter!=_sub_edges.end();iter++)
+ {
+ (*iter)->getStartNode()->hitMeAlone(xBary,yBary,dimChar);
+ (*iter)->getEndNode()->hitMeAlone(xBary,yBary,dimChar);
+ }
+}
+
+void ComposedEdge::unApplySimilarityOnMyNodes(double xBary, double yBary, double dimChar) const
+{
+ for(std::list<ElementaryEdge *>::const_iterator iter=_sub_edges.begin();iter!=_sub_edges.end();iter++)
+ {
+ (*iter)->getStartNode()->unHitMeAlone(xBary,yBary,dimChar);
+ (*iter)->getEndNode()->unHitMeAlone(xBary,yBary,dimChar);
+ }
+}
+
+void ComposedEdge::applySimilarityOnMyNodesIfNotAlreadyHit(double xBary, double yBary, double dimChar) const
+{
+ for(std::list<ElementaryEdge *>::const_iterator iter=_sub_edges.begin();iter!=_sub_edges.end();iter++)
+ {
+ (*iter)->getStartNode()->hitMeAfter(xBary,yBary,dimChar);
+ (*iter)->getEndNode()->hitMeAfter(xBary,yBary,dimChar);
+ }
+}
+
+void ComposedEdge::unApplySimilarityOnMyNodesIfNotAlreadyHit(double xBary, double yBary, double dimChar) const
+{
+ for(std::list<ElementaryEdge *>::const_iterator iter=_sub_edges.begin();iter!=_sub_edges.end();iter++)
+ {
+ (*iter)->getStartNode()->unHitMeAfter(xBary,yBary,dimChar);
+ (*iter)->getEndNode()->unHitMeAfter(xBary,yBary,dimChar);
+ }
+}
+
+void ComposedEdge::initEdgeHitStatus() const
+{
+ for(std::list<ElementaryEdge *>::const_iterator iter=_sub_edges.begin();iter!=_sub_edges.end();iter++)
+ (*iter)->getPtr()->initHitStatus();
+}
+
+void ComposedEdge::applySimilarityOnMyEdges(double xBary, double yBary, double dimChar) const
+{
+ for(std::list<ElementaryEdge *>::const_iterator iter=_sub_edges.begin();iter!=_sub_edges.end();iter++)
+ (*iter)->getPtr()->hitMeAlone(xBary,yBary,dimChar);
+}
+
+void ComposedEdge::unApplySimilarityOnMyEdges(double xBary, double yBary, double dimChar) const
+{
+ for(std::list<ElementaryEdge *>::const_iterator iter=_sub_edges.begin();iter!=_sub_edges.end();iter++)
+ (*iter)->getPtr()->unHitMeAlone(xBary,yBary,dimChar);
+}
+
+void ComposedEdge::applySimilarityOnMyEdgesIfNotAlreadyHit(double xBary, double yBary, double dimChar) const
+{
+ for(std::list<ElementaryEdge *>::const_iterator iter=_sub_edges.begin();iter!=_sub_edges.end();iter++)
+ (*iter)->getPtr()->hitMeAfter(xBary,yBary,dimChar);
+}
+
+void ComposedEdge::unApplySimilarityOnMyEdgesIfNotAlreadyHit(double xBary, double yBary, double dimChar) const
+{
+ for(std::list<ElementaryEdge *>::const_iterator iter=_sub_edges.begin();iter!=_sub_edges.end();iter++)
+ (*iter)->getPtr()->unHitMeAfter(xBary,yBary,dimChar);
+}
+
void ComposedEdge::getBarycenter(double *bary, double& weigh) const
{
weigh=0.; bary[0]=0.; bary[1]=0.;
if(b.nearlyWhere((*nodeToTest)[0],(*nodeToTest)[1])==OUT)
return false;
std::set< IntersectElement > inOutSwitch;
- double ref(isInOrOutAlg(nodeToTest,inOutSwitch));
+ std::set<Node *> nodes;
+ getAllNodes(nodes);
+ double ref(isInOrOutAlg(nodeToTest,nodes,inOutSwitch));
bool ret(false);
for(std::set< IntersectElement >::iterator iter4=inOutSwitch.begin();iter4!=inOutSwitch.end();iter4++)
{
bool ComposedEdge::isInOrOut2(Node *nodeToTest) const
{
std::set< IntersectElement > inOutSwitch;
- double ref(isInOrOutAlg(nodeToTest,inOutSwitch));
+ std::set<Node *> nodes;
+ getAllNodes(nodes);
+ for(std::set<Node *>::const_iterator iter=nodes.begin();iter!=nodes.end();iter++)
+ if(sqrt((*iter)->distanceWithSq(*nodeToTest))<QUADRATIC_PLANAR::_precision)
+ return true;
+ double ref(isInOrOutAlg(nodeToTest,nodes,inOutSwitch));
bool ret(false);
for(std::set< IntersectElement >::iterator iter4=inOutSwitch.begin();iter4!=inOutSwitch.end();iter4++)
{
return ret;
}
-double ComposedEdge::isInOrOutAlg(Node *nodeToTest, std::set< IntersectElement >& inOutSwitch) const
+double ComposedEdge::isInOrOutAlg(Node *nodeToTest, const std::set<Node*>& nodes, std::set< IntersectElement >& inOutSwitch) const
{
// searching for e1
- std::set<Node *> nodes;
- getAllNodes(nodes);
std::set<double> radialDistributionOfNodes;
std::set<Node *>::const_iterator iter;
for(iter=nodes.begin();iter!=nodes.end();iter++)
for(std::list< IntersectElement >::iterator iter2=listOfIntesc.begin();iter2!=listOfIntesc.end();iter2++)
if((*iter2).isIncludedByBoth())
inOutSwitch.insert(*iter2);
- }
+ }
//if overlapped we can forget
}
else
return ref;
}
-/*bool ComposedEdge::isInOrOut(Node *aNodeOn, Node *nodeToTest) const
-{
-
- EdgeInfLin *e1=new EdgeInfLin(aNodeOn,nodeToTest);
- double ref=e1->getCharactValue(*nodeToTest);
- set< IntersectElement > inOutSwitch;
- for(vector<AbstractEdge *>::const_iterator iter=_sub_edges.begin();iter!=_sub_edges.end();iter++)
- {
- ElementaryEdge *val=dynamic_cast<ElementaryEdge *>(*iter);
- if(val)
- {
- Edge *e=val->getPtr();
- auto_ptr<Intersector> intersc(Edge::buildIntersectorWith(e1,e));
- bool obviousNoIntersection,areOverlapped;
- intersc->areOverlappedOrOnlyColinears(0,obviousNoIntersection,areOverlapped);
- if(obviousNoIntersection)
- {
- continue;
- }
- if(!areOverlapped)
- {
- list< IntersectElement > listOfIntesc=intersc->getIntersectionsCharacteristicVal();
- for(list< IntersectElement >::iterator iter2=listOfIntesc.begin();iter2!=listOfIntesc.end();iter2++)
- if((*iter2).isIncludedByBoth())
- inOutSwitch.insert(*iter2);
- }
- //if overlapped we can forget
- }
- else
- throw Exception("Invalid use of ComposedEdge::isInOrOut : only one level supported !");
- }
- e1->decrRef();
- bool ret=false;
- for(set< IntersectElement >::iterator iter=inOutSwitch.begin();iter!=inOutSwitch.end();iter++)
- {
- if((*iter).getVal1()<ref)
- {
- if((*iter).getNodeOnly()->getLoc()==ON_1)
- ret=!ret;
- }
- else
- break;
- }
- return ret;
-}*/
-
bool ComposedEdge::getDirection() const
{
throw Exception("ComposedEdge::getDirection : no sense");