@@ -1091,7 +1091,7 @@ async fn morph<F: 'n + Send + Copy>(
1091
1091
VectorDataTable :: new ( result)
1092
1092
}
1093
1093
1094
- fn bevel_algorithm ( mut vector_data : VectorData , distance : f64 , roundness : f64 ) -> VectorData {
1094
+ fn bevel_algorithm ( mut vector_data : VectorData , distance : f64 ) -> VectorData {
1095
1095
// Splits a bézier curve based on a distance measurement
1096
1096
fn split_distance ( bezier : bezier_rs:: Bezier , distance : f64 , length : f64 ) -> bezier_rs:: Bezier {
1097
1097
const EUCLIDEAN_ERROR : f64 = 0.001 ;
@@ -1150,23 +1150,19 @@ fn bevel_algorithm(mut vector_data: VectorData, distance: f64, roundness: f64) -
1150
1150
let length2 = bezier2. length ( None ) ;
1151
1151
1152
1152
let max_split = length1. min ( length2) ;
1153
- const EUCLIDEAN_ERROR : f64 = 0.001 ;
1154
1153
1155
- // Adaptive sampling approach
1156
1154
let mut split_distance = 0.0 ;
1157
1155
let mut best_diff = f64:: MAX ;
1158
1156
let mut current_best_distance = 0.0 ;
1159
1157
1160
- // Start with coarse sampling to find promising regions
1158
+ let clamp_and_round = |value : f64 | ( ( value * 1000.0 ) . round ( ) / 1000.0 ) . clamp ( 0.0 , 1.0 ) ;
1159
+
1161
1160
const INITIAL_SAMPLES : usize = 50 ;
1162
1161
for i in 0 ..=INITIAL_SAMPLES {
1163
1162
let distance_sample = max_split * ( i as f64 / INITIAL_SAMPLES as f64 ) ;
1164
1163
1165
- let parametric1 = bezier1. euclidean_to_parametric_with_total_length ( ( distance_sample / length1) . clamp ( 0.0 , 1.0 ) , EUCLIDEAN_ERROR , length1) ;
1166
- let parametric2 = bezier2. euclidean_to_parametric_with_total_length ( ( distance_sample / length2) . clamp ( 0.0 , 1.0 ) , EUCLIDEAN_ERROR , length2) ;
1167
-
1168
- let x_point = bezier1. evaluate ( TValue :: Parametric ( 1.0 - parametric1) ) ;
1169
- let y_point = bezier2. evaluate ( TValue :: Parametric ( parametric2) ) ;
1164
+ let x_point = bezier1. evaluate ( TValue :: Euclidean ( 1.0 - clamp_and_round ( distance_sample / length1) ) ) ;
1165
+ let y_point = bezier2. evaluate ( TValue :: Euclidean ( clamp_and_round ( distance_sample / length2) ) ) ;
1170
1166
1171
1167
let distance = x_point. distance ( y_point) ;
1172
1168
let diff = ( bevel_length - distance) . abs ( ) ;
@@ -1186,11 +1182,8 @@ fn bevel_algorithm(mut vector_data: VectorData, distance: f64, roundness: f64) -
1186
1182
for j in 1 ..=REFINE_STEPS {
1187
1183
let refined_sample = prev_sample + ( distance_sample - prev_sample) * ( j as f64 / REFINE_STEPS as f64 ) ;
1188
1184
1189
- let parametric1 = bezier1. euclidean_to_parametric_with_total_length ( ( refined_sample / length1) . clamp ( 0.0 , 1.0 ) , EUCLIDEAN_ERROR , length1) ;
1190
- let parametric2 = bezier2. euclidean_to_parametric_with_total_length ( ( refined_sample / length2) . clamp ( 0.0 , 1.0 ) , EUCLIDEAN_ERROR , length2) ;
1191
-
1192
- let x_point = bezier1. evaluate ( TValue :: Parametric ( 1.0 - parametric1) ) ;
1193
- let y_point = bezier2. evaluate ( TValue :: Parametric ( parametric2) ) ;
1185
+ let x_point = bezier1. evaluate ( TValue :: Euclidean ( 1.0 - ( refined_sample / length1) . clamp ( 0.0 , 1.0 ) ) ) ;
1186
+ let y_point = bezier2. evaluate ( TValue :: Euclidean ( ( refined_sample / length2) . clamp ( 0.0 , 1.0 ) ) ) ;
1194
1187
1195
1188
let distance = x_point. distance ( y_point) ;
1196
1189
@@ -1365,30 +1358,19 @@ fn bevel_algorithm(mut vector_data: VectorData, distance: f64, roundness: f64) -
1365
1358
new_segments
1366
1359
}
1367
1360
1368
- fn insert_new_segments ( vector_data : & mut VectorData , new_segments : & [ [ usize ; 2 ] ] , roundness : f64 ) {
1361
+ fn insert_new_segments ( vector_data : & mut VectorData , new_segments : & [ [ usize ; 2 ] ] ) {
1369
1362
let mut next_id = vector_data. segment_domain . next_id ( ) ;
1370
1363
1371
1364
for & [ start, end] in new_segments {
1372
- let start_pos = vector_data. point_domain . positions ( ) [ start] ;
1373
- let end_pos = vector_data. point_domain . positions ( ) [ end] ;
1374
-
1375
- let direction = start_pos - end_pos;
1376
- let perpendicular = DVec2 :: new ( -direction. y , direction. x ) . normalize ( ) ;
1377
-
1378
- let curve_amount = direction. length ( ) * roundness; // 50% of line length
1379
- let midpoint = ( start_pos + end_pos) / 2.0 ;
1380
- let control_point = midpoint + perpendicular * curve_amount;
1381
-
1382
- let handles = bezier_rs:: BezierHandles :: Quadratic { handle : control_point } ;
1383
-
1365
+ let handles = bezier_rs:: BezierHandles :: Linear ;
1384
1366
vector_data. segment_domain . push ( next_id. next_id ( ) , start, end, handles, StrokeId :: ZERO ) ;
1385
1367
}
1386
1368
}
1387
1369
1388
1370
if distance > 1.0 {
1389
1371
let mut segments_connected = segments_connected_count ( & vector_data) ;
1390
1372
let new_segments = update_existing_segments ( & mut vector_data, distance, & mut segments_connected) ;
1391
- insert_new_segments ( & mut vector_data, & new_segments, roundness ) ;
1373
+ insert_new_segments ( & mut vector_data, & new_segments) ;
1392
1374
}
1393
1375
1394
1376
vector_data
@@ -1407,14 +1389,11 @@ async fn bevel<F: 'n + Send + Copy>(
1407
1389
) ]
1408
1390
source : impl Node < F , Output = VectorDataTable > ,
1409
1391
#[ default( 10. ) ] distance : Length ,
1410
- #[ default( 0. ) ]
1411
- #[ range( ( -1.0 , 1.0 ) ) ]
1412
- roundness : f64 ,
1413
1392
) -> VectorDataTable {
1414
1393
let source = source. eval ( footprint) . await ;
1415
1394
let source = source. one_item ( ) ;
1416
1395
1417
- let result = bevel_algorithm ( source. clone ( ) , distance, roundness ) ;
1396
+ let result = bevel_algorithm ( source. clone ( ) , distance) ;
1418
1397
1419
1398
VectorDataTable :: new ( result)
1420
1399
}
@@ -1657,7 +1636,7 @@ mod test {
1657
1636
#[ tokio:: test]
1658
1637
async fn bevel_rect ( ) {
1659
1638
let source = Subpath :: new_rect ( DVec2 :: ZERO , DVec2 :: ONE * 100. ) ;
1660
- let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 5. , 0. ) . await ;
1639
+ let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 5. ) . await ;
1661
1640
let beveled = beveled. one_item ( ) ;
1662
1641
1663
1642
assert_eq ! ( beveled. point_domain. positions( ) . len( ) , 8 ) ;
@@ -1680,7 +1659,7 @@ mod test {
1680
1659
async fn bevel_open_curve ( ) {
1681
1660
let curve = Bezier :: from_cubic_dvec2 ( DVec2 :: ZERO , DVec2 :: new ( 10. , 0. ) , DVec2 :: new ( 10. , 100. ) , DVec2 :: X * 100. ) ;
1682
1661
let source = Subpath :: from_beziers ( & [ Bezier :: from_linear_dvec2 ( DVec2 :: X * -100. , DVec2 :: ZERO ) , curve] , false ) ;
1683
- let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 5. , 0. ) . await ;
1662
+ let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 5. ) . await ;
1684
1663
let beveled = beveled. one_item ( ) ;
1685
1664
1686
1665
assert_eq ! ( beveled. point_domain. positions( ) . len( ) , 4 ) ;
@@ -1702,7 +1681,7 @@ mod test {
1702
1681
let mut vector_data = VectorData :: from_subpath ( source) ;
1703
1682
let transform = DAffine2 :: from_scale_angle_translation ( DVec2 :: splat ( 10. ) , 1. , DVec2 :: new ( 99. , 77. ) ) ;
1704
1683
vector_data. transform = transform;
1705
- let beveled = super :: bevel ( Footprint :: default ( ) , & FutureWrapperNode ( VectorDataTable :: new ( vector_data) ) , 5. , 0. ) . await ;
1684
+ let beveled = super :: bevel ( Footprint :: default ( ) , & FutureWrapperNode ( VectorDataTable :: new ( vector_data) ) , 5. ) . await ;
1706
1685
let beveled = beveled. one_item ( ) ;
1707
1686
1708
1687
assert_eq ! ( beveled. point_domain. positions( ) . len( ) , 4 ) ;
@@ -1721,7 +1700,7 @@ mod test {
1721
1700
#[ tokio:: test]
1722
1701
async fn bevel_too_high ( ) {
1723
1702
let source = Subpath :: from_anchors ( [ DVec2 :: ZERO , DVec2 :: new ( 100. , 0. ) , DVec2 :: new ( 100. , 100. ) , DVec2 :: new ( 0. , 100. ) ] , false ) ;
1724
- let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 999. , 0. ) . await ;
1703
+ let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 999. ) . await ;
1725
1704
let beveled = beveled. one_item ( ) ;
1726
1705
1727
1706
assert_eq ! ( beveled. point_domain. positions( ) . len( ) , 6 ) ;
@@ -1742,7 +1721,7 @@ mod test {
1742
1721
let curve = Bezier :: from_cubic_dvec2 ( DVec2 :: ZERO , DVec2 :: new ( 10. , 0. ) , DVec2 :: new ( 10. , 100. ) , DVec2 :: X * 100. ) ;
1743
1722
let point = Bezier :: from_cubic_dvec2 ( DVec2 :: ZERO , DVec2 :: ZERO , DVec2 :: ZERO , DVec2 :: ZERO ) ;
1744
1723
let source = Subpath :: from_beziers ( & [ Bezier :: from_linear_dvec2 ( DVec2 :: X * -100. , DVec2 :: ZERO ) , point, curve] , false ) ;
1745
- let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 5. , 0. ) . await ;
1724
+ let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 5. ) . await ;
1746
1725
let beveled = beveled. one_item ( ) ;
1747
1726
1748
1727
assert_eq ! ( beveled. point_domain. positions( ) . len( ) , 6 ) ;
0 commit comments