You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

极坐标下偏心圆的角度映射函数求解——使输入角度与圆上点相对圆心的角度线性相关

极坐标下偏心圆的角度映射函数求解——使输入角度与圆上点相对圆心的角度线性相关

先把咱们的需求掰扯清楚:你手里有个圆心水平偏移原点的圆,极坐标方程已经给出:
$$r\left(\theta\right)=d\cos(\theta)+\sqrt{r_{0}{2}-d{2}\sin^{2}(\theta)}$$
而且已知$r_0 > |d|$、$d < 0$(说白了就是圆心在原点左边)。现在要找个函数$f(\theta)$,把「圆上点相对圆心的水平夹角」$\theta$输进去,得到$f(\theta)$后代入原极坐标方程,出来的点相对圆心的角度正好就是你输入的$\theta$

推导思路:用直角坐标的双重表示找关系

咱们把圆上的目标点用两种方式写直角坐标,然后让它们相等,就能建立角度之间的联系:

  1. 相对圆心的坐标:圆心在$(d, 0)$,半径是$r_0$,如果点相对圆心的角度是$\theta$,那这个点的直角坐标就是:
    $$(d + r_0 \cos\theta,\ r_0 \sin\theta)$$
  2. 相对原点的极坐标转换:如果这个点相对原点的极角是$\alpha = f(\theta)$,对应的极径是$r(\alpha)$,那直角坐标又可以写成:
    $$(r(\alpha)\cos\alpha,\ r(\alpha)\sin\alpha)$$

这俩坐标描述的是同一个点,所以对应分量必须相等:
$$
\begin{cases}
r(\alpha)\cos\alpha = d + r_0 \cos\theta \
r(\alpha)\sin\alpha = r_0 \sin\theta
\end{cases}
$$

求解映射函数$f(\theta)$

先把上面两个式子平方后加起来,能得到极径$r(\alpha)$的另一种表达式:
$$
[r(\alpha)]^2 = (d + r_0 \cos\theta)^2 + (r_0 \sin\theta)^2
$$
展开整理一下,利用$\cos^2\theta + \sin^2\theta = 1$化简:
$$
[r(\alpha)]^2 = d^2 + 2 d r_0 \cos\theta + r_0^2 = r_0^2 + d^2 + 2 d r_0 \cos\theta
$$
所以$r(\alpha) = \sqrt{r_0^2 + d^2 + 2 d r_0 \cos\theta}$(极径是正的,取根号正号就行)。

接下来用两个等式相除,就能得到极角$\alpha$和输入角度$\theta$的正切关系:
$$
\tan\alpha = \frac{r_0 \sin\theta}{d + r_0 \cos\theta}
$$
不过直接用普通反正切会有象限歧义,比如正负号相同的不同象限角度会算错,所以更稳妥的是用带符号判断的反正切函数$\text{arctan2}(y, x)$——它会根据$x$和$y$的正负自动识别角度所在象限,不会出错。所以最终的映射函数就是:
$$
f(\theta) = \text{arctan2}\left(r_0 \sin\theta,\ d + r_0 \cos\theta\right)
$$

验证一下正确性

把$\alpha = f(\theta)$代入原极坐标方程$r(\alpha) = d \cos\alpha + \sqrt{r_0^2 - d^2 \sin^2\alpha}$,用之前的坐标等式验证:
从$r(\alpha)\cos\alpha - d = r_0 \cos\theta$、$r(\alpha)\sin\alpha = r_0 \sin\theta$,代入根号部分化简后,会发现结果正好等于$r(\alpha) - d \cos\alpha$,完全符合原方程,说明这个映射是对的。

补充:可选的三角函数形式(需注意象限)

如果不想用$\text{arctan2}$,也可以用余弦或正弦形式表示$f(\theta)$:
$$
f(\theta) = \arccos\left( \frac{d + r_0 \cos\theta}{\sqrt{r_0^2 + d^2 + 2 d r_0 \cos\theta}} \right)
$$
或者
$$
f(\theta) = \arcsin\left( \frac{r_0 \sin\theta}{\sqrt{r_0^2 + d^2 + 2 d r_0 \cos\theta}} \right)
$$
不过这两种形式需要额外判断角度所在象限,在编程或实际计算中,$\text{arctan2}$是最省心的选择。

备注:内容来源于stack exchange,提问作者R. Toy

火山引擎 最新活动