Why does the formula for calculating a reflection vector work?

The formula for calculating a reflection vector is as follows: $$R = V - 2N(V\cdot N)$$ Where V is the incident vector and N is the normal vector on the plane in question.

Why does this formula work? I haven't seen any good explanations of it. I don't understand the significance of doubling the normal vector, nor the relevance of taking the dot product.

-

Remember that the dot product is related to the cosine of the angle between two vectors. – J. M. May 1 '11 at 22:48

1 Answer

$\langle V,N\rangle N$ is the orthogonal projection of $V$ onto (the line determined by) $N$. That is, if you want to write $V$ as a sum of two orthogonal vectors, $u$ and $n$, with $u$ in the plane and $n$ having the same direction as $N$ (that is, orthogonal to the plane), then $n = \langle V,N\rangle N$ and $u = V - \langle V,N\rangle N$.

Since $N$ is normal to the plane, the vector $u = V - \langle V,N\rangle N$ is in the plane. That is, $u$ is the orthogonal projection of $V$ onto the plane.

To take the reflection, you want to go to the point in the plane "directly below" $V$ (that is, to $u$), and then go in the opposite direction to where $V$ is. So what you are doing is simply reversing the normal component to get the reflection: instead of adding $\langle V,N\rangle N$, you subtract it because that reverses the direction. So instead of $$V = \underbrace{\Bigl( V - \langle V,N\rangle N\Bigr)}_{\text{in the plane}} + \underbrace{\langle V,N\rangle N}_{\text{orthogonal to the plane}}$$ you take $$\underbrace{\Bigl( V - \langle V,N\rangle N\Bigr)}_{\text{in the plane}} - \underbrace{\langle V,N\rangle N}_{\text{orthogonal to the plane}}.$$

-

I fixed a couple of minor typos; hope you don't mind. – Rahul Narain May 2 '11 at 5:16
@Rahul: Certainly not! Thanks. – Arturo Magidin May 2 '11 at 14:27
{"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": 19, "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.9447201490402222, "perplexity_flag": "head"}