问题是,根据我正在阅读的研究,然后需要计算圆周的凹度并找到通过三个点的圆的半径的倒数。我正在搜索和搜索,但老实说这对我来说毫无意义。我唯一发现的是,我似乎需要计算舌面曲线的一阶和二阶导数。我真的希望有人能够帮助探索如何在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)
非常感谢您的帮助。对于我的数学无知,我感到抱歉。
1 / radius
。这将与直线的凹度为0相吻合,因为半径是无限的。 - Hobo- temp
来计算bc
。 - Hobo