bool NGRandomNetBuilder::canConnect(NGNode* baseNode, NGNode* newNode) { bool connectable = true; const PositionVector n(baseNode->getPosition(), newNode->getPosition()); // check for range between Basenode and Newnode if (connectable) { SUMOReal dist = n.length(); if ((dist < myMinDistance) || (dist > myMaxDistance)) { connectable = false; } } // check for angle restrictions if (connectable) { connectable = checkAngles(baseNode); } if (connectable) { connectable = checkAngles(newNode); } // check for intersections and range restrictions with outer links if (connectable) { NGEdgeList::iterator li; li = myOuterLinks.begin(); while (connectable && (li != myOuterLinks.end())) { // check intersection only if links don't share a node const NGNode* const start = (*li)->getStartNode(); const NGNode* const end = (*li)->getEndNode(); const Position& p1 = start->getPosition(); const Position& p2 = end->getPosition(); if ((baseNode != start) && (baseNode != end) && (newNode != start) && (newNode != end)) { connectable = !n.intersects(p1, p2); } // check NewNode-To-Links distance only, if NewNode isn't part of link if (connectable && (newNode != start) && (newNode != end)) { const SUMOReal offset = GeomHelper::nearest_offset_on_line_to_point2D(p1, p2, n[1]); if (offset != GeomHelper::INVALID_OFFSET) { const Position p = PositionVector(p1, p2).positionAtOffset2D(offset); const SUMOReal dist = p.distanceTo2D(n[1]); if (dist < myMinDistance) { connectable = false; } } } ++li; } } return connectable; }
bool NGRandomNetBuilder::canConnect(NGNode *baseNode, NGNode *newNode) throw() { bool connectable=true; Position2D n1(baseNode->getPosition()); Position2D n2(newNode->getPosition()); // check for range between Basenode and Newnode if (connectable) { SUMOReal dist = n1.distanceTo(n2); if ((dist < myMinDistance) || (dist > myMaxDistance)) { connectable = false; } } // check for angle restrictions if (connectable) connectable = checkAngles(baseNode); if (connectable) connectable = checkAngles(newNode); // check for intersections and range restrictions with outer links if (connectable) { NGEdgeList::iterator li; li = myOuterLinks.begin(); while ((connectable == true) && (li != myOuterLinks.end())) { // check intersection only if links don't share a node Position2D p1((*li)->getStartNode()->getPosition()); Position2D p2((*li)->getEndNode()->getPosition()); if ((baseNode != (*li)->getStartNode()) && (baseNode!= (*li)->getEndNode()) && (newNode != (*li)->getStartNode()) && (newNode!= (*li)->getEndNode())) { connectable = !GeomHelper::intersects(n1, n2, p1, p2); } // check NewNode-To-Links distance only, if NewNode isn't part of link if ((connectable) && (newNode != (*li)->getStartNode()) && (newNode != (*li)->getEndNode())) { SUMOReal dist = GeomHelper::distancePointLine(n2, p1, p2); if ((dist < myMinDistance) && (dist > -1)) connectable = false; } li++; } } return connectable; }
label checkAngles ( triSurf& surf, const word subsetName, const scalar angleTol ) { labelLongList badTriangles; if( checkAngles(surf, badTriangles, angleTol) ) { label setId = surf.facetSubsetIndex(subsetName); if( setId >= 0 ) surf.removeFacetSubset(setId); setId = surf.addFacetSubset(subsetName); forAll(badTriangles, i) surf.addFacetToSubset(setId, badTriangles[i]); } return badTriangles.size(); }
/* ============================================================================= * TMelement_alloc * * Contains a copy of input arg 'coordinates' * ============================================================================= */ element_t* TMelement_alloc (TM_ARGDECL coordinate_t* coordinates, long numCoordinate) { element_t* elementPtr = NULL; elementPtr = (element_t*)TM_MALLOC(sizeof(element_t)); if (elementPtr) { long i; for (i = 0; i < numCoordinate; i++) { elementPtr->coordinates[i] = coordinates[i]; } elementPtr->numCoordinate = numCoordinate; minimizeCoordinates(elementPtr); checkAngles(elementPtr); calculateCircumCircle(elementPtr); initEdges(elementPtr, coordinates, numCoordinate); elementPtr->neighborListPtr = TMLIST_ALLOC(&element_listcompare); assert(elementPtr->neighborListPtr); elementPtr->isGarbage = false; elementPtr->isReferenced = false; } return elementPtr; }