You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
0 commit comments