Javascript 找到由两点及其切线交点定义的圆心

Javascript 找到由两点及其切线交点定义的圆心,javascript,math,vector-graphics,Javascript,Math,Vector Graphics,我有笛卡尔坐标p,P0和P1,怎么才能找到C 请注意,C也是三角形的正中心,该三角形以p为顶点,P0和P1为高度 这段代码将在图形渲染器中每秒运行几百次,在一个已经在做复杂物理的程序中,所以它需要很快。我用它来计算二次曲线的控制点。如果可能的话,我想避免三角函数和计算角度,坚持纯矢量数学 纯数学答案很好,尽管我是用Javascript编程的。请记住,答案越简单越好,因为任何向量运算都需要时间。方法1: 向量CP0和PP0是垂直的,而CP1和PP1是垂直的,所以我们可以为这些向量对的点积写出两个方

我有笛卡尔坐标p,P0和P1,怎么才能找到C

请注意,C也是三角形的正中心,该三角形以p为顶点,P0和P1为高度

这段代码将在图形渲染器中每秒运行几百次,在一个已经在做复杂物理的程序中,所以它需要很快。我用它来计算二次曲线的控制点。如果可能的话,我想避免三角函数和计算角度,坚持纯矢量数学

纯数学答案很好,尽管我是用Javascript编程的。请记住,答案越简单越好,因为任何向量运算都需要时间。

方法1:
向量CP0和PP0是垂直的,而CP1和PP1是垂直的,所以我们可以为这些向量对的点积写出两个方程组,并找到两个未知的CX和CY(中心坐标)

方法二:
P0和P1之间的中点M具有坐标

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
  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
θ是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已经可以使用了

我不是要代码,我是要这个数学问题的解决方案。这个问题表明数学答案很好,我只是将其标记为Javascript,因为我正在使用Javascript。我还把它标记为矢量图形,因为这是问题的领域。请考虑在Mth.StActExchange。com上提出这个问题。这个网站不是为了解释代数,而是为了回答有关编程的问题。我很抱歉,你可能是对的。问题是,以MBo的回答为例(我目前正在检查)。第一种方法当然是正确的,但试图解决这个问题的代价是难以置信的高。我目前正在检查第二种方法,它被证明是非常有效的。乍一看,第一个似乎更有希望和优雅。是的,它介于两个站点之间。再次,我很抱歉在这里问这个问题。我投票结束这个问题,因为正如OP在评论中所说,它寻求一个数学问题的解决方案。这个问题有一个公认的答案,并寻求一个数学问题的编程解决方案。我看不出有什么问题?如果我把这个贴在数学交流上,我就不会得到一个有用的答案。谢谢你扩展了答案,我已经在检查它的正确性了。一旦我核实过,我马上就接受:)