| 281 | } |
| 282 | |
| 283 | bool Isoliner::hasAnyLine( const UndirectedEdgeBitSet * potentiallyCrossedEdges ) const |
| 284 | { |
| 285 | std::atomic<bool> res{ false }; |
| 286 | ParallelFor( 0_ue, UndirectedEdgeId( topology_.undirectedEdgeSize() ), [&] ( UndirectedEdgeId ue ) |
| 287 | { |
| 288 | if ( res.load( std::memory_order_relaxed ) ) |
| 289 | return; |
| 290 | if ( potentiallyCrossedEdges && !potentiallyCrossedEdges->test( ue ) ) |
| 291 | return; |
| 292 | VertId o = topology_.org( ue ); |
| 293 | if ( !o ) |
| 294 | return; |
| 295 | VertId d = topology_.dest( ue ); |
| 296 | if ( !d ) |
| 297 | return; |
| 298 | auto no = negativeVerts_.test( o ); |
| 299 | auto nd = negativeVerts_.test( d ); |
| 300 | if ( no != nd ) |
| 301 | if ( !region_ || contains( *region_, topology_.left( ue ) ) || contains( *region_, topology_.right( ue ) ) ) |
| 302 | res = true; |
| 303 | } ); |
| 304 | return res; |
| 305 | } |
| 306 | |
| 307 | void Isoliner::computePointOnEachEdge_( IsoLine & line ) const |
| 308 | { |
no test coverage detected