inline bool pointmesh2d<point_t>::equals ( pointmesh2d const& o, value_type const& epsilon ) const { /*if ( o.size() != size() || _points.empty() ) { return false; } else */ { // heuristic : if min + max + mean + #poinst meshes are equal point_type mean_a = std::accumulate ( _points.begin(), _points.end(), point_type() ); point_type mean_b = std::accumulate ( o._points.begin(), o._points.end(), point_type() ); axis_aligned_boundingbox<point_type> box_a ( _points.begin(), _points.end() ); axis_aligned_boundingbox<point_type> box_b ( o._points.begin(), o._points.end() ); return mean_a.distance(mean_b) < epsilon && box_a.min.distance(box_b.min) < epsilon && box_a.max.distance(box_b.max) < epsilon; } }
bool SHAPE_LINE_CHAIN::Collide( const SEG& aSeg, int aClearance ) const { BOX2I box_a( aSeg.A, aSeg.B - aSeg.A ); BOX2I::ecoord_type dist_sq = (BOX2I::ecoord_type) aClearance * aClearance; for( int i = 0; i < SegmentCount(); i++ ) { const SEG& s = CSegment( i ); BOX2I box_b( s.A, s.B - s.A ); BOX2I::ecoord_type d = box_a.SquaredDistance( box_b ); if( d < dist_sq ) { if( s.Collide( aSeg, aClearance ) ) return true; } } return false; }
snet_stream_t *SNetFeedbackDet( snet_stream_t *input, snet_info_t *info, int location, snet_variant_list_t *back_patterns, snet_expr_list_t *guards, snet_startup_fun_t box_a ) { snet_stream_t *output; snet_locvec_t *locvec; locvec = SNetLocvecGet(info); SNetLocvecFeedbackEnter(locvec); input = SNetRouteUpdate(info, input, location); if(SNetDistribIsNodeLocation(location)) { snet_stream_t *into_op, *from_op; snet_stream_t *back_bufin, *back_bufout; fbbuf_arg_t *fbbarg; fbcoll_arg_t *fbcarg; fbdisp_arg_t *fbdarg; /* create streams */ into_op = SNetStreamCreate(0); output = SNetStreamCreate(0); back_bufout = SNetStreamCreate(FEEDBACK_BACKCHAN_CAPACITY); #ifndef FEEDBACK_OMIT_BUFFER back_bufin = SNetStreamCreate(0); /* create the feedback buffer */ fbbarg = SNetMemAlloc( sizeof( fbbuf_arg_t)); fbbarg->in = back_bufin; fbbarg->out = back_bufout; fbbarg->out_capacity = FEEDBACK_BACKCHAN_CAPACITY; SNetThreadingSpawn( SNetEntityCreate( ENTITY_fbbuf, location, locvec, "<fbbuf>", FeedbackBufTask, (void*)fbbarg) ); #else back_bufin = back_bufout; #endif /* create the feedback collector */ fbcarg = SNetMemAlloc( sizeof( fbcoll_arg_t)); fbcarg->in = input; fbcarg->fbi = back_bufout; fbcarg->out = into_op; SNetThreadingSpawn( SNetEntityCreate( ENTITY_fbcoll, location, locvec, "<fbcoll>", FeedbackCollTask, (void*)fbcarg) ); /* create the instance network */ from_op = box_a(into_op, info, location); from_op = SNetRouteUpdate(info, from_op, location); /* create the feedback dispatcher */ fbdarg = SNetMemAlloc( sizeof( fbdisp_arg_t)); fbdarg->in = from_op; fbdarg->fbo = back_bufin; fbdarg->out = output; fbdarg->back_patterns = back_patterns; fbdarg->guards = guards; SNetThreadingSpawn( SNetEntityCreate( ENTITY_fbdisp, location, locvec, "<fbdisp>", FeedbackDispTask, (void*)fbdarg) ); } else { SNetVariantListDestroy(back_patterns); SNetExprListDestroy(guards); output = box_a(input, info, location); output = SNetRouteUpdate(info, output, location); } SNetLocvecFeedbackLeave(locvec); return( output); }