如何为直线添加z坐标生成正弦类曲线,生成包含首尾的指定数量采样点
你可以用余弦缓动插值实现需求,逻辑非常简单,无需复杂计算:
实现原理
你需要的首尾增长平缓、中间抬升快的S型曲线,可以通过半周期余弦映射实现:将原本0~1区间的线性比例值,代入公式 (1 - cos(线性比例 * π)) / 2 转换后,得到的缓动比例刚好符合两端变化速率为0、中间变化速率最高的特性,完全匹配你要的效果。
修改后代码
final double heightOfFirstCoordinate = 0; final double heightOfLastCoordinate = 6; final int n = 4; final List<Double> collect = IntStream.range(0, n) .mapToObj(i -> { // 计算当前点的线性占比,取值范围0~1 double linearRatio = (double) i / (n - 1); // 转换为缓动占比 double easeRatio = (1 - Math.cos(linearRatio * Math.PI)) / 2; // 计算最终高度 return heightOfFirstCoordinate + (heightOfLastCoordinate - heightOfFirstCoordinate) * easeRatio; }) .collect(Collectors.toList());
补充说明
- 如果业务场景中可能出现
n=1的情况,可提前添加分支判断直接返回首坐标高度,避免除0异常。 - 若需要调整曲线陡峭程度,可替换为其他幂次缓动函数,当前方案是实现成本最低、计算量最小的选择。
内容的提问来源于stack exchange,提问作者user1298426
相关产品推荐
相关产品推荐

