【发布时间】:2020-09-17 06:07:03
【问题描述】:
我正在尝试复制一项研究中使用的函数,但我并没有真正的数学背景来完全理解应该如何完成这项工作。该测量从舌头轮廓中获取三个点,并使用这三个点来计算将通过它们的圆的半径。我查看了here 并找到了在 python 中执行此操作的东西。我试图修改代码,以便它可以在 R 中使用我自己的数据。 (贴在底部)
问题是,根据我正在阅读的研究,我需要计算圆的圆周凹度,并找到通过三个点的圆的半径的倒数。我正在谷歌搜索和谷歌搜索,但老实说,这对我来说毫无意义。我唯一发现的是,我似乎需要计算舌头表面曲线的一阶和二阶导数。我真的希望有人能够帮助探索我如何在 R 中做到这一点。说实话,我对理解这里的数学并不太感兴趣,只是对如何实际实现它感兴趣。
编辑:我认为下面是我需要复制的公式。正如 MBo 指出的那样,情况并非如此。
我将重复另一项研究中的内容,该研究使用了非常非常相似的方法,以防万一。
'任何三个点(A、B、C)都可以被认为是位于一个圆的圆周上。圆将有一个半径,其倒数表示通过这三个点的圆的曲率。这三个点的集合产生一个曲率数,它是通过它们的圆的半径的倒数。位于一条直线上的三个点的曲率为零,因为它们的凹度为零,这成为曲率方程的分子。这是我需要做的,但不知道从哪里开始在 R 中操作它。
下面的代码是我试图在 R 中复制的 python 代码,以获取三个点的半径。我不知道之后该怎么做。
def define_circle(p1, p2, p3):
"""
Returns the center and radius of the circle passing the given 3 points.
In case the 3 points form a line, returns (None, infinity).
"""
temp = p2[0] * p2[0] + p2[1] * p2[1]
bc = (p1[0] * p1[0] + p1[1] * p1[1] - temp) / 2
cd = (temp - p3[0] * p3[0] - p3[1] * p3[1]) / 2
det = (p1[0] - p2[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p2[1])
if abs(det) < 1.0e-6:
return (None, np.inf)
# Center of circle
cx = (bc*(p2[1] - p3[1]) - cd*(p1[1] - p2[1])) / det
cy = ((p1[0] - p2[0]) * cd - (p2[0] - p3[0]) * bc) / det
radius = np.sqrt((cx - p1[0])**2 + (cy - p1[1])**2)
return ((cx, cy), radius)
这是我的 R 尝试。 我还没有编写函数,但我将查看曲线上的三个点 A、B 和 C。该函数将为这三个点中的每一个提取 x 和 y 值(称为 x_value_a、y_value_a 等)。一旦完成。我将运行下面的代码。正是在这之后,我才真正被难住了。
temp = x_value_b ^ 2 + y_value_b ^ 2
bc = (x_value_a ^ 2 + y_value_a ^ 2 - temp) / 2
cd = (temp - x_value_c ^ 2 - y_value_c ^ 2) / 2
det = (x_value_a - x_value_b) * (y_value_b - y_value_c) - (x_value_b - x_value_c) * (y_value_a - y_value_b)
cx = (bc * (y_value_b - y_value_c) - cd * (y_value_a - y_value_b)) / det
cy = ((x_value_a - x_value_b) * cd - (x_value_b - x_value_c) * bc) / det
radius = sqrt((cx - x_value_a)^2 + (cy - y_value_a)^2)
任何帮助将不胜感激。对不起,我对数学的无知。
【问题讨论】:
-
C 公式(分析曲线曲率)与您的问题无关。
-
我的第一反应是“逆”的意思是“倒数”——所以你只需要
1 / radius。这将与凹度为 0 的直线相匹配,因为半径是无限的。 -
顺便说一句-您似乎在 R 代码中缺少
- temp来计算bc -
@MBo,感谢您指出这一点。在我正在阅读的一篇论文中,曲率测量似乎是必不可少的。我想使用的度量是基于那个度量的,所以我认为计算在这里也是必不可少的。很高兴犯错,不必追求那条路。谢谢!
-
@Hobo,感谢您的两位 cmets。我已经更新了代码以包含缺失值(好地方!)。我希望你对 1/半径是正确的。