给定空间(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]
关于如何找到中心坐标有什么想法吗?
您的代码有两个问题。
第一个是在命名约定中。对于要保存的所有公式,A
的长度边必须是与点A
相对的边,对于B
和B
和C
和C
也是如此。您可以通过将它们计算为:
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
我想在两点之间画一条弧线。我知道两个点的位置和弧度的角度。我成功地写了一个小程序来计算圆心,有效地画出了圆弧。但是当我画一个圆来验证时,当我用小的弧度值时,圆线不交叉给出的两点。 但两点到圆心的距离等于计算半径。我哪里错了?