Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Find optimal shift value to decompose the spline
The previous method for decomposing a spline into fewer segments aimed to identify the optimal value of 't', which corresponds to the location of maximum curvature on the curve. However, using a bisection method to locate this point increases the average number of '_de_casteljau' calls per point, as demonstrated in Experiment 2. Even with the early stopping method applied, the improvement is little. Moreover, given the high cost of finding points with the bisection method, we have decided to abandon the flexible update of 't' using bisection. Therefore, we can reduce computation cost by only using shift operation to determine the coefficients of lerp in the '_de_casteljau' function. Based on the previous experiments, we have identified that the primary issue is the necessity to call the '_de_casteljau' function twice to generate a point, even under the original settings. On average, the number of _de_casteljau calls per point is 1.99. Ideally, we want the rendering process to call the '_de_casteljau' function only once for each point in every iteration, indicating that the first call is redundant. Also, we've observed that during the initial 60 percent of the rendering process, the original method on average requires more than two shift attempts to determine the optimal value in every iteration. Therefore, we propose adjusting the initial 't' value from 0.5 to 0.25 by applying an initial shift of 2. Additionally, as the spline rendering process progresses to the later stages, the amount of shift gradually decreases. Hence, we store the amount of shift used in each iteration as a global variable to record the value of the last shift change. This way allows us to use this value directly in the next iteration, eliminating the need to start from an initial shift of 2 again. Furthermore, instead of merely decreasing 't' by adding the amount of shift, we also reduce the amount of shift to a minimum of 1. Based on Experiment 3, this limitation of the scope can decrease the average number of function '_de_casteljau' calls per point and increase the number of points when rendering. This means that these points do not always have the maximum curvature, and some optimal points with maximum curvature will be overlooked while limiting the scope of 't' to [0, 0.25]. In summary, we have chosen the Original (shift2) setting in this pull request, as demonstrated in Experiment 1. The modified implementation of font-edit, which utilizes fixed-point arithmetic, serves as the evaluation testbed for the following experiments: Experiment 1: Original - Average number of _de_casteljau calls per point: 1.99 Original - Average points per character: 18.89 Original (shift2) - Average number of _de_casteljau calls per point: 1.51 Original (shift2) - Average points per character: 18.98 Experiment 2: Flexible - Average number of _de_casteljau calls per point: 4.53 Flexible - Average points per character: 16.30 Flexible (shift2) - Average number of _de_casteljau calls per point: 4.40 Flexible (shift2) - Average points per character: 21.16 Flexible (early stopping) - Average number of _de_casteljau calls per point: 4.23 Flexible (early stopping) - Average points per character: 16.18 Flexible (early stopping) (shift2) - Average number of _de_casteljau calls per point: 3.99 Flexible (early stopping) (shift2) - Average points per character: 21.09 Experiment 3: Original (shift2) (limit scope) - Average number of _de_casteljau calls per point: 1.18 Original (shift2) (limit scope) - Average points per character: 22.57
- Loading branch information