I need to work this into a C# program for generating points along an arc, and the math is making me cross-eyed.

Essentially, I know two points on the parabola, I know the y value of the maximum (but not x), and I know that the second derivative is negative, i.e. the coefficient of x^2 is negative. All the typical approaches of treating it as a system of 3 linear equations seem to rely on having three known points, but I've got two, plus an additional equation 2*a*x_3+b=0 where x_3 is unknown.

Is there a straight-forward way of tackling this without pulling a bunch of numeric and matrix libraries into the program?

Short answer: nope.

Just like a linear function can be defined with 2 points, a quadratic function needs 3 points to be defined.

The best you can get is a family of functions that pass through the two points you know and have the known maximum.

In the more general case, a polynomial of order n (ax^n+bx^(n-1)+cx^(n-2)...) requires n+1 points and you end up solving a system of n+1 simultaneous equations to get your coefficients.

Well, I've got two points, plus a known maximum value. Intuitively, I think that uniquely defines a parabola, though I could be wrong.

I think that there are two possible solutions, but I could be wrong too!

Let the maximum y-value be \(c\) and let this occur at \(x=b\), where \(b\) is as yet unknown. Then the parabola's equation can be written as

$$y=c-a(x-b)^2,$$

where \(a\) is another unknown.

We know two points \((x_1, y_1)\) and \((x_2, y_2)\) on the curve. Substituting these into the equation above gives

$$\eqalign{y_1=c-a(x_1-b)^2\cr

y_2=c-a(x_2-b)^2\cr}.$$

Rearranging gives

$${x_1-b\over x_2-b}=\pm\sqrt{c-y_1\over c-y_2}.$$

The value of \(b\) is between \(x_1\) and \(x_2\) if the right-hand side is negative and outside this range otherwise; this is where the ambiguity comes in. Since \(c\), \(y_1\), and \(y_2\) are known the right hand side can be computed and a sign chosen; this means that \(b\) can be found, and then either of the previous equations can be used to give \(a\).

Is this what you are looking for?

Nigel (UK)

Oh yes, I see what you mean. In the cases I'm dealing with, the x value of the vertex will always lie between the two known points, so that narrows it down to a single possible function.

Yup, right on the money. Just find b with "b = (x2 * sqrt((c - y1)/(c - y2)) + x1) / (sqrt((c - y1)/(c - y2)) + 1)", then find a with "a = (c - y1)/(x1 - b)^2". Then you've got your a, b, and c for the vertex form, and you can calculate y values. Thanks Nigel.