当前位置: 首页 > 知识库问答 >
问题:

求空间中给定三点的弧/圆方程(3D)

崔棋
2023-03-14

给定空间(3D)中的3个点:A=(x1,y1,z1),B=(x2,y2,z2)C=(x3,y3,z3);那么如何求经过这三点的圆(弧)的圆心和半径,即求圆方程呢?使用Python和Numpy这里是我的初始代码

import numpy as np
A = np.array([x1, y1, z1])
B = np.array([x2, y2, z2])
C = np.array([x3, y3, z3])

#Find vectors connecting the three points and the length of each vector
AB = B - A 
BC = C - B 
AC = C - A 

# Triangle Lengths
a = np.linalg.norm(AB)
b = np.linalg.norm(BC)
c = np.linalg.norm(AC)

从CounterRadius定义中,可以使用以下方法找到半径:

R = (a * b * c) / np.sqrt(2.0 * a**2 * b**2 +
                          2.0 * b**2 * c**2 +
                          2.0 * c**2 * a**2 -
                          a**4 - b**4 - c**4)
#barcyntric coordinates of center
b1 = a**2 * (b**2 + c**2 - a**2)
b2 = b**2 * (c**2 + a**2 - b**2)
b3 = c**2 * (a**2 + b**2 - c**2)

那么中心(P)的笛卡尔坐标为:

Px = (b1 * A[0]) + (b2 * B[0]) + (b3 * C[0])
Py = (b1 * A[1]) + (b2 * B[1]) + (b3 * C[1])
Pz = (b1 * A[2]) + (b2 * B[2]) + (b3 * C[2])   

但是,上面的barcyntric坐标值似乎并不正确。当用一个已知值的例子求解时,半径是正确的,但中心坐标不是。

例:对于这三点:

A = np.array([2.0, 1.5, 0.0])
B = np.array([6.0, 4.5, 0.0])
C = np.array([11.75, 6.25, 0.0]) 

半径和中心坐标为:

R = 15.899002930062595
P = [13.4207317073, -9.56097560967, 0]

关于如何找到中心坐标有什么想法吗?

共有1个答案

张炳
2023-03-14

您的代码有两个问题。

第一个是在命名约定中。对于要保存的所有公式,A的长度边必须是与点A相对的边,对于BBCC也是如此。您可以通过将它们计算为:

a = np.linalg.norm(C - B)
b = np.linalg.norm(C - A)
c = np.linalg.norm(B - A)

第二个与源码中关于外周中心的重心坐标的注释有关:不一定是齐次的。也就是说,它们不需要以任何方式归一化,你用重心坐标计算笛卡尔坐标的公式,只有当它们加起来时才有效。

幸运的是,您只需要将得到的笛卡尔坐标除以b1+b2+b3就可以得到您要得到的结果。为了提高效率,我对代码进行了一点精简,得到了您所期望的结果:

>>> A = np.array([2.0, 1.5, 0.0])
>>> B = np.array([6.0, 4.5, 0.0])
>>> C = np.array([11.75, 6.25, 0.0])
>>> a = np.linalg.norm(C - B)
>>> b = np.linalg.norm(C - A)
>>> c = np.linalg.norm(B - A)
>>> s = (a + b + c) / 2
>>> R = a*b*c / 4 / np.sqrt(s * (s - a) * (s - b) * (s - c))
>>> b1 = a*a * (b*b + c*c - a*a)
>>> b2 = b*b * (a*a + c*c - b*b)
>>> b3 = c*c * (a*a + b*b - c*c)
>>> P = np.column_stack((A, B, C)).dot(np.hstack((b1, b2, b3)))
>>> P /= b1 + b2 + b3
>>> R
15.899002930062531
>>> P
array([ 13.42073171,  -9.56097561,   0.        ])
 类似资料:
  • 在java中,我有三个点,表示两条线和一个角度。现在我必须创建角度弧大约10个像素,除了公共点。在弧线上显示角度。我可以计算角度,但如何画弧线和显示弧线上的角度。请告诉我一些代码视图或链接,我可以找到解决方案。代码片段如下。 我不知道如何使用DrawArc来绘制我想要的精确的圆弧,也不知道如何在上面设置角度。 谢谢

  • 我试图画一个圆弧,基于两个给定的点和一个给定的高度来描述一个圆段。为了实现这一点,我将使用java.awt.graphics中的以下方法。 首先,我观察到x、y、width和height值描述了一个包含圆的矩形。 圆弧的中心是原点为(x,y)的矩形的中心,其大小由width和height参数指定。(http://docs.oracle.com/javase/7/docs/api/java/awt/

  • 我需要找到从圆和矩形的交点创建的最大弧线。我有了圆心,半径和矩形的坐标,我需要找到与圆心交点的角。 我有一个可以工作的代码,但它是通过迭代圆周上的点来计算解的,我想知道是否有更优雅的方法来使用三角学而不是“蛮力”来计算解。 这是我的代码:

  • 我查阅了多个用不同形式的数学(微积分、几何、三角学等)编写的示例,但无法将其中任何一个转换为代码。我的理解是,给出的值产生两个不同的中心/交点。这些就是我需要弄清楚的。 这个解释器是在Arduino上运行的,用C语言编写的,如果有人能用伪代码来指导我,我会非常感激的。 谢了!

  • 我已经10年没做过这样的数学了...我正在编程一个2D游戏和移动一个球员周围。当我移动播放器时,我试图计算离播放器位置200像素的圆上的点,给定-360到360之间的正或负角度(度)。屏幕是1280x720,0,0是屏幕的中心点。玩家在整个笛卡尔坐标系中移动。我试图找到的点可以不在屏幕上。 我尝试了文章中用半径和角度找到点的公式,但我不相信我理解了什么是“角度”,因为当我把角度作为-360到360

  • 我想在两点之间画一条弧线。我知道两个点的位置和弧度的角度。我成功地写了一个小程序来计算圆心,有效地画出了圆弧。但是当我画一个圆来验证时,当我用小的弧度值时,圆线不交叉给出的两点。 但两点到圆心的距离等于计算半径。我哪里错了?