@ -18,6 +18,12 @@ inline uint32_t scan_interval_boarder(double l, double r, std::vector<double>& p
return std : : distance ( begin_iter , end_iter ) ;
}
void fix_integral_boarder ( std : : vector < double > & cur_intervals ,
const std : : vector < double > & intervals_on_x0 ,
const std : : vector < double > & intervals_on_x1 )
{
}
struct chain_vertex_property_t {
uint64_t total_count : 32 ;
uint64_t neg_delta_u : 8 ;
@ -138,23 +144,33 @@ void calculate_integral(uint8_t q,
// on boarder u = x
auto scan_u_boarder_interval = [ & ] ( double x ) {
return u_line_subface_intersection ( pcurve_relation_graph ,
subface_index ,
x ,
subface_aabb . min ( ) . y ( ) ,
subface_aabb . max ( ) . y ( ) ,
true ,
true ) ;
auto res = u_line_subface_intersection ( pcurve_relation_graph ,
subface_index ,
x ,
subface_aabb . min ( ) . y ( ) ,
subface_aabb . max ( ) . y ( ) ,
true ,
true ) ;
if ( res . size ( ) = = 2 & & res [ 0 ] - subface_aabb . min ( ) . y ( ) < = strict_epsilon
& & subface_aabb . max ( ) . y ( ) - res [ 1 ] < = strict_epsilon )
return std : : vector < double > { } ;
else
return res ;
} ;
// on boarder v = x
auto scan_v_boarder_interval = [ & ] ( double x ) {
return v_line_subface_intersection ( pcurve_relation_graph ,
subface_index ,
x ,
subface_aabb . min ( ) . x ( ) ,
subface_aabb . max ( ) . x ( ) ,
true ,
true ) ;
auto res = v_line_subface_intersection ( pcurve_relation_graph ,
subface_index ,
x ,
subface_aabb . min ( ) . x ( ) ,
subface_aabb . max ( ) . x ( ) ,
true ,
true ) ;
if ( res . size ( ) = = 2 & & res [ 0 ] - subface_aabb . min ( ) . x ( ) < = strict_epsilon
& & subface_aabb . max ( ) . x ( ) - res [ 1 ] < = strict_epsilon )
return std : : vector < double > { } ;
else
return res ;
} ;
auto expand_integral_on_u_ = [ & ] ( auto i , double l , double r , auto b0_iter , auto b1_iter , auto int_x , auto int_w ) {
@ -325,6 +341,12 @@ void calculate_integral(uint8_t q,
auto unique_end = std : : unique ( intersection_u . begin ( ) , intersection_u . end ( ) , sorted_double_equal ) ;
auto start_boarder_intervals = scan_v_boarder_interval ( subface_aabb . min ( ) . y ( ) ) ;
auto end_boarder_intervals = scan_v_boarder_interval ( subface_aabb . max ( ) . y ( ) ) ;
if ( start_boarder_intervals . empty ( ) | | end_boarder_intervals . empty ( ) )
{
auto u0_intervals = scan_u_boarder_interval ( subface_aabb . min ( ) . y ( ) ) ;
auto u1_intervals = scan_u_boarder_interval ( subface_aabb . max ( ) . y ( ) ) ;
}
auto b0_iter = start_boarder_intervals . begin ( ) , b1_iter = end_boarder_intervals . begin ( ) ;
operate_on_merged_set_intervals ( line_parallel_to_v . begin ( ) ,
line_parallel_to_v . end ( ) ,
@ -332,18 +354,11 @@ void calculate_integral(uint8_t q,
unique_end ,
double_less ,
[ & ] ( double l , double r , bool l_exact_gl , bool r_exact_gl ) {
if ( l_exact_gl )
for ( auto i = 0 ; i < q / 2 ; + + i )
expand_integral_on_v_by_gl ( i , l , r , b0_iter , b1_iter ) ;
else
for ( auto i = 0 ; i < q / 2 ; + + i )
expand_integral_on_v_by_ts ( i , l , r , b0_iter , b1_iter ) ;
if ( r_exact_gl )
for ( auto i = q / 2 ; i < q ; + + i )
if ( l_exact_gl & & r_exact_gl )
for ( auto i = 0 ; i < q ; + + i )
expand_integral_on_v_by_gl ( i , l , r , b0_iter , b1_iter ) ;
else
for ( auto i = q / 2 ; i < q ; + + i )
for ( auto i = 0 ; i < q ; + + i )
expand_integral_on_v_by_ts ( i , l , r , b0_iter , b1_iter ) ;
} ) ;
// integral_plan.axis_to_expand = axis::v;
@ -361,18 +376,11 @@ void calculate_integral(uint8_t q,
unique_end ,
double_less ,
[ & ] ( double l , double r , bool l_exact_gl , bool r_exact_gl ) {
if ( l_exact_gl )
for ( auto i = 0 ; i < q / 2 ; + + i )
expand_integral_on_u_by_gl ( i , l , r , b0_iter , b1_iter ) ;
else
for ( auto i = 0 ; i < q / 2 ; + + i )
expand_integral_on_u_by_ts ( i , l , r , b0_iter , b1_iter ) ;
if ( r_exact_gl )
for ( auto i = q / 2 ; i < q ; + + i )
if ( l_exact_gl & & r_exact_gl )
for ( auto i = 0 ; i < q ; + + i )
expand_integral_on_u_by_gl ( i , l , r , b0_iter , b1_iter ) ;
else
for ( auto i = q / 2 ; i < q ; + + i )
for ( auto i = 0 ; i < q ; + + i )
expand_integral_on_u_by_ts ( i , l , r , b0_iter , b1_iter ) ;
} ) ;
// integral_plan.axis_to_expand = axis::u;