-// 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));
unApplySimilarityOnMyNodes(xBary,yBary,fact);
other.unApplySimilarityOnMyNodesIfNotAlreadyHit(xBary,yBary,fact);
initEdgeHitStatus();
- other.initEdgeHitStatus();
+ other.initEdgeHitStatus();
unApplySimilarityOnMyEdges(xBary,yBary,fact);
other.unApplySimilarityOnMyEdgesIfNotAlreadyHit(xBary,yBary,fact);
}
applySimilarityOnMyNodes(xBary,yBary,dimChar);
other->applySimilarityOnMyNodesIfNotAlreadyHit(xBary,yBary,dimChar);
initEdgeHitStatus();
- other->initEdgeHitStatus();
+ other->initEdgeHitStatus();
applySimilarityOnMyEdges(xBary,yBary,dimChar);
other->applySimilarityOnMyEdgesIfNotAlreadyHit(xBary,yBary,dimChar);
}
}
void ComposedEdge::initNodeHitStatus() const
- {
+{
for(std::list<ElementaryEdge *>::const_iterator iter=_sub_edges.begin();iter!=_sub_edges.end();iter++)
{
(*iter)->getStartNode()->initHitStatus();
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");