当前位置:  开发笔记 > 编程语言 > 正文

如何计算抛物线的顶点给出三个点

如何解决《如何计算抛物线的顶点给出三个点》经验,为你挑选了2个好方法。

我有三个X/Y点形成抛物线.我只需要计算抛物线的顶点是通过这三个点的.最好快速一点,因为我必须做很多这些计算!

"Ask A Scientist"网站提供了这样的答案:

抛物线的一般形式由下式给出:A*x ^ 2 + B*x + C = y其中A,B和C是任意实常数.你有三对点是(x,y)有序对.将每个点的x和y值替换为抛物线的等式.您将得到三个未知数的三个LINEAR方程,即三个常数.然后,您可以轻松地为A,B和C的值三个方程式求解这个系统,并且您将得到与您的3个点相交的抛物线方程.顶点是一阶导数为0的位置,一个小代数给出了顶点的(-B/2A,C - B ^ 2/4A).

很高兴看到在C#或C++中进行此计算的实际代码.任何人?



1> AZDean..:

谢谢David,我将您的伪代码转换为以下C#代码:

public static void CalcParabolaVertex(int x1, int y1, int x2, int y2, int x3, int y3, out double xv, out double yv)
{
    double denom = (x1 - x2) * (x1 - x3) * (x2 - x3);
    double A     = (x3 * (y2 - y1) + x2 * (y1 - y3) + x1 * (y3 - y2)) / denom;
    double B     = (x3*x3 * (y1 - y2) + x2*x2 * (y3 - y1) + x1*x1 * (y2 - y3)) / denom;
    double C     = (x2 * x3 * (x2 - x3) * y1 + x3 * x1 * (x3 - x1) * y2 + x1 * x2 * (x1 - x2) * y3) / denom;

    xv = -B / (2*A);
    yv = C - B*B / (4*A);
}

这就是我想要的.抛物线顶点的简单计算.我稍后会处理整数溢出.



2> David Z..:

这实际上只是一个简单的线性代数问题,因此您可以象征性地进行计算.当你用三个点的x和y值代替时,你会得到三个未知数的三个线性方程.

A x1^2 + B x1 + C = y1
A x2^2 + B x2 + C = y2
A x3^2 + B x3 + C = y3

解决这个问题的直接方法是反转矩阵

x1^2  x1  1
x2^2  x2  1
x3^2  x3  1

并将其乘以向量

y1
y2
y3

结果是......好吧,不是那么简单;-)我在Mathematica中做到了,这里是伪代码中的公式:

denom = (x1 - x2)(x1 - x3)(x2 - x3)
A = (x3 * (y2 - y1) + x2 * (y1 - y3) + x1 * (y3 - y2)) / denom
B = (x3^2 * (y1 - y2) + x2^2 * (y3 - y1) + x1^2 * (y2 - y3)) / denom
C = (x2 * x3 * (x2 - x3) * y1 + x3 * x1 * (x3 - x1) * y2 + x1 * x2 * (x1 - x2) * y3) / denom

或者,如果你想用数字方式进行矩阵数学运算,你通常会转向线性代数系统(比如ATLAS,虽然我不确定它是否有C#/ C++绑定).


对于那些即将到来的人,不要忘记在下面看看OP自己的答案!
推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有