我有三个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++中进行此计算的实际代码.任何人?
谢谢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); }
这就是我想要的.抛物线顶点的简单计算.我稍后会处理整数溢出.
这实际上只是一个简单的线性代数问题,因此您可以象征性地进行计算.当你用三个点的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++绑定).