查找由 2 个点及其切线交点定义的圆心
Find center of circle defined by 2 points and their tangent intersection
我有笛卡尔坐标 P、P0 和 P1,如何找到 C?
注意C也是以P为顶点,P0和P1为高的三角形的重心。
此代码将在图形渲染器中每秒 运行 几百次,在一个已经在处理复杂物理的程序中,因此它需要快。我正在用它来计算二次曲线的控制点。如果可能的话,我想避免三角函数和计算角度,并坚持使用纯矢量数学。
纯数学答案很好,即使我在 Javascript 中对此进行编程。请记住,答案越简单越好,因为任何向量运算都需要时间。
方法一:
向量CP0和PP0垂直,CP1和PP1垂直,所以我们可以写出这些向量对点积的两个方程组,并找到两个未知的CX和CY(中心坐标)
CP0 = (CX - P0.X, CY - P0.Y)
CP1 = (CX - P1.X, CY - P1.Y)
PP0 = (P.X - P0.X, P.Y - P0.Y)
PP1 = (P.X - P1.X, P.Y - P1.Y)
Dot(CP0, PP0 ) = 0
Dot(CP1, PP1 ) = 0
(CX - P0.X) * (P.X - P0.X) + (CY - P0.Y) * (P.Y - P0.Y) = 0
(CX - P1.X) * (P.X - P1.X) + (CY - P1.Y) * (P.Y - P1.Y) = 0
方法二:
P0和P1之间的中点M有坐标
M.X = (P0.X + P1.X) / 2 ///1
M.Y = (P0.Y + P1.X) / 2 ///2
Distance P-M is DM
DM_Squared = (P.X-M.X)^2 + (P.Y-M.Y)^2 ///3
L, D distances are from your notation
L_Squared = (P.X-P0.X)^2 + (P.Y-P0.Y)^2 ///4
Theta 是角度 P0PC
Cos(Theta) = Length(P - M) / Length(P - P0) = DM / L
D = Length(C - P) = L / Cos(Theta) = L * L / DM
and finally
C = P - L^2 * (P0 - M) / DM^2
Coeff = L_Squared / DM_Squared ///5
C.X = P.X - Coeff * (P.X - M.X) ///6
C.Y = P.Y - Coeff * (P.Y - M.Y) ///7
公式 1..7 可以立即使用
我有笛卡尔坐标 P、P0 和 P1,如何找到 C?
注意C也是以P为顶点,P0和P1为高的三角形的重心。
此代码将在图形渲染器中每秒 运行 几百次,在一个已经在处理复杂物理的程序中,因此它需要快。我正在用它来计算二次曲线的控制点。如果可能的话,我想避免三角函数和计算角度,并坚持使用纯矢量数学。
纯数学答案很好,即使我在 Javascript 中对此进行编程。请记住,答案越简单越好,因为任何向量运算都需要时间。
方法一:
向量CP0和PP0垂直,CP1和PP1垂直,所以我们可以写出这些向量对点积的两个方程组,并找到两个未知的CX和CY(中心坐标)
CP0 = (CX - P0.X, CY - P0.Y)
CP1 = (CX - P1.X, CY - P1.Y)
PP0 = (P.X - P0.X, P.Y - P0.Y)
PP1 = (P.X - P1.X, P.Y - P1.Y)
Dot(CP0, PP0 ) = 0
Dot(CP1, PP1 ) = 0
(CX - P0.X) * (P.X - P0.X) + (CY - P0.Y) * (P.Y - P0.Y) = 0
(CX - P1.X) * (P.X - P1.X) + (CY - P1.Y) * (P.Y - P1.Y) = 0
方法二:
P0和P1之间的中点M有坐标
M.X = (P0.X + P1.X) / 2 ///1
M.Y = (P0.Y + P1.X) / 2 ///2
Distance P-M is DM
DM_Squared = (P.X-M.X)^2 + (P.Y-M.Y)^2 ///3
L, D distances are from your notation
L_Squared = (P.X-P0.X)^2 + (P.Y-P0.Y)^2 ///4
Theta 是角度 P0PC
Cos(Theta) = Length(P - M) / Length(P - P0) = DM / L
D = Length(C - P) = L / Cos(Theta) = L * L / DM
and finally
C = P - L^2 * (P0 - M) / DM^2
Coeff = L_Squared / DM_Squared ///5
C.X = P.X - Coeff * (P.X - M.X) ///6
C.Y = P.Y - Coeff * (P.Y - M.Y) ///7
公式 1..7 可以立即使用