我有直角坐标P,P0和P1,如何找到C 2
请注意,C也是以P为顶点,P0和P1为高度的三角形的正中心。
这段代码每秒会在一个图形渲染器中执行几百次,在一个已经在做复杂物理的程序中,所以它需要很快。我正在用它来计算二次曲线的控制点。如果可能的话,我想避免trig函数和计算角度并坚持纯向量数学。
纯粹的数学答案很好,即使我用Javascript编程。请记住,答案越简单越好,因为任何矢量操作都需要花费时间。
我有直角坐标P,P0和P1,如何找到C 2
请注意,C也是以P为顶点,P0和P1为高度的三角形的正中心。
这段代码每秒会在一个图形渲染器中执行几百次,在一个已经在做复杂物理的程序中,所以它需要很快。我正在用它来计算二次曲线的控制点。如果可能的话,我想避免trig函数和计算角度并坚持纯向量数学。
纯粹的数学答案很好,即使我用Javascript编程。请记住,答案越简单越好,因为任何矢量操作都需要花费时间。
方法1:
载体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
方法2: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准备使用的
谢谢你扩大答案,我已经检查它的正确性。一旦我验证它,我会在一分钟内接受它:) –
注意第二种方法中的更正caclulations – MBo
我不要求代码,我要求解决这道数学题。这个问题表明数学答案很好,我只是把它标记为Javascript,因为这就是我正在使用的。我还将它标记为矢量图形,因为这是问题的范畴。 –
请考虑在math.stackexchange.com提问这个问题。这里的这个网站并不是要解释代数,而是要回答关于编程的问题。 –
对此,您可能是正确的,我的歉意。问题是,采取MBO的答案(我目前正在检查)。第一种方法当然是正确的,但试图解决这个解决方案的过程显然是处理器方面非常昂贵。我目前正在检查第二种方法,结果非常有效。乍一看,第一个看起来更有前途和优雅。所以是的,这在两个网站之间。再次,我很抱歉在这里提问。 –