You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于参数t的两点连线从直线渐变至半圆的近似公式求解

基于参数t的两点连线从直线渐变至半圆的近似公式求解

嘿,我来给你分享一个实用的近似方案,刚好能匹配你描述的从直线渐变到半圆的过程~ 先结合你给出的渐变形态(t从0到1时,直线慢慢凸起,最终变成半圆),给你捋个简单易实现的近似公式,还能灵活适配任意两点。

首先先明确你展示的渐变特征:

  • t=0:两点间是标准直线
  • t=0.2:直线微微凸起,弧度极小
  • t=0.6:凸起弧度明显,曲线形态清晰
  • t=0.8:曲线接近半圆,高度快到最大值
  • t=1:完全变成连接两点的上半圆

核心思路:带平滑插值的垂直偏移法

我们可以把这个渐变过程拆解成:给线段上的每个点,添加一个随参数t变化的垂直偏移量,让t从0到1时,偏移量从0逐渐增加到半圆对应的高度,而且过渡节奏贴合你展示的形态。

步骤1:先做坐标系简化(方便推导,最后再还原)

假设我们先把两个固定点放到对称的局部坐标系里:

  • 设两点为 ( P_0(-L/2, 0) ) 和 ( P_1(L/2, 0) ),其中L是两点间的距离,中点在原点,线段沿x轴
  • 这样最终的半圆就是上半圆,方程是 ( y = \sqrt{(L/2)^2 - x^2} )

步骤2:给出近似参数方程

对于任意t∈[0,1],曲线上的点可以用参数θ(θ从0到π,对应从P0到P1)表示:

x(θ) = (L/2) * cosθ
y(θ) = t^k * (L/2) * sinθ

这里的k是调整过渡节奏的参数:

  • 如果你想要t接近1时快速趋近半圆(和你展示的t=0.8就很接近半圆的形态匹配),可以取k=2
  • 要是想要更线性的过渡,k=1就行,这时候t=0.5时是半椭圆
  • 追求更顺滑的起始和结束过渡,也可以用余弦插值代替幂次:
    y(θ) = [(1 - cos(πt/2))/2] * (L/2) * sinθ
    
    这个插值函数在t=0和t=1时的变化率都是0,过渡会更自然。

步骤3:适配任意位置的两点

如果你的两点不是在这个对称坐标系里,也很容易还原:

  1. 计算原两点的中点 ( M((x0+x1)/2, (y0+y1)/2) ),两点间距离L,线段的单位方向向量 ( \vec{u} = ((x1-x0)/L, (y1-y0)/L) )
  2. 计算垂直于线段的单位向量 ( \vec{v} = (-u_y, u_x) )(这个是向上的方向,如果你要下半圆就取 ( (u_y, -u_x) ))
  3. 把局部坐标系的点(x(θ), y(θ))映射回原坐标系:
    x = M.x + x(θ)*u_x - y(θ)*u_y
    y = M.y + x(θ)*u_y + y(θ)*u_x
    

验证一下贴合度

  • t=0时,y(θ)=0,就是直线,完美匹配
  • t=1时,y(θ)=(L/2)sinθ,代入x(θ)的话就是 ( y = \sqrt{(L/2)^2 - x^2} ),正好是半圆
  • 中间的t值,比如t=0.8,k=2时y(θ)=0.64*(L/2)sinθ,凸起高度是半圆的64%,和你展示的t=0.8的形态高度匹配;t=0.6时是36%,也符合你给的图的状态

这个方案的好处是:没有复杂的超越函数,计算快,还能通过调整k值灵活适配你想要的过渡节奏,完全满足近似描述的需求。

备注:内容来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 11:09:31