Rotation of parabola

I'm designing a parabolic solar concentrator and am doing ray-tracing on Matlab from scratch. I'm beginning to look into compound concentrators and would need to have an equation for a parabola rotated by x degrees centered at a specific (non origin) point. The equation I am using for my parabolas is $a*(x-X)^2 - Y$.

I am not sure how to rotate this equation besides using a rotation matrix, solving for y using quadratic equation and choosing one term. Even this method gives me another parabola in $y(x)$.

Any suggestions on a simple way to get half of a parabola rotated by $\theta$? Should I be looking into parameterization?

Thanks

-
Do you want it rotated around the central axis of the parabola, or an arbitrary axis? I would think that rotation around the central axis would be relatively easy, and that rotation around an arbitrary axis would be much more difficult. – Colin McFaul Jul 3 '12 at 19:05

1
A rotated parabola is not a function and therefore you only choice is to use a rotation matrix. – ja72 Jul 3 '12 at 19:06
I think it is easier to rotate the rays, and keep the paraboloid fixed. – Bernhard Jul 3 '12 at 19:21
Why are you ray tracing in the first place? – Colin K Jul 3 '12 at 19:25
– Shrim Jul 3 '12 at 21:11
show 2 more comments

1 Answer

I don't know if this is useful, but I would proceed with the parametrization and the rotation matrix, anyway.

Let us rename $x-X\rightarrow x$. Then, notice that the equation of the parabola $y = a x^2$ can be parametrized by $x = t$, $y = a t^2$, as $t$ goes from $-\infty$ to $\infty$; or, as a vector,

$$(x(t), y(t))=(t,a t^2)$$

To rotate the graph of the parabola about the origin, you must rotate each point individually. Rotation clockwise by an angle $\theta$ is a linear transformation with matrix

$$\left( \begin{array}{ccc} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \\ \end{array} \right)$$

Thus, if we apply this linear transformation to a point $(t, t^2)$ on the graph of the parabola, we get

$$\left( \begin{array}{ccc} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \\ \end{array} \right) \left( \begin{array}{ccc} t \\ a t^2\\ \end{array} \right) = \left( \begin{array}{ccc} t\cos\theta +a t^2\sin\theta\\ -t\sin\theta+a t^2\cos\theta\\ \end{array} \right)$$

So, as $t$ goes from $-\infty$ to $\infty$, this is a parametrization of the graph of the rotated parabola.Then you have to convert back to $x$ and $y$, put them in the equation $y=x^2$ and that's it.

To get a cartesian equation for the new parabola, you can just solve for $t$ in the first line $a t^2 + t cot\theta = x/\sin\theta$ and put the expression for $t$ in the second one. Doing this, you have an equation for $x$ and $t$ that corresponds to the "constraint" $x$ and $y$ must satisfy to be on the new parabola!

-
so from the rotated parameterized matrix at the end, converting this back to x and y simply gives [xcos() + ysin(), -xsin() + ycos()], which is just [x,y] rotated by theta, correct? Is there a specific way to convert this back into cartesian to be useful? – Shrim Jul 3 '12 at 20:44
Thanks for the response, btw – Shrim Jul 3 '12 at 20:44
I edited, maybe this is more clear! Isn't it? – usumdelphini Jul 3 '12 at 21:09
yea, that makes sense to me. Thanks for the help – Shrim Jul 3 '12 at 23:07

1
Good idea! I'd add that leaving things in parametric form may be useful, as it makes computing a surface normal trivial. – Colin K Jul 4 '12 at 1:54
{"extraction_info": {"found_math": true, "script_math_tex": 0, "script_math_asciimath": 0, "math_annotations": 0, "math_alttext": 0, "mathml": 0, "mathjax_tag": 0, "mathjax_inline_tex": 25, "mathjax_display_tex": 3, "mathjax_asciimath": 0, "img_math": 0, "codecogs_latex": 0, "wp_latex": 0, "mimetex.cgi": 0, "/images/math/codecogs": 0, "mathtex.cgi": 0}, "config": {"markdown_headings": false, "markdown_code": true, "boilerplate_config": {"ratio_threshold": 0.18, "absolute_threshold": 10, "end_threshold": 15, "enable": true}, "remove_buttons": true, "remove_image_figures": true, "remove_link_clusters": true, "table_config": {"min_rows": 2, "min_cols": 3, "format": "github"}, "remove_chinese": true, "remove_edit_buttons": true, "extract_latex": true}, "english_confidence": 0.9297333359718323, "perplexity_flag": "head"}