# How to find surface normal of a triangle

If I have a triangle with $$3$$ points $$P_1, P_2,$$ and $$P_3$$, each with $$x, y,$$ and $$z$$ coordinates, how do I find the surface normal $$N$$ in $$x, y,$$ and $$z$$ such that

$$(N_x)^2+(N_y)^2+(N_z)^2 = 1$$

I'm looking for a simple formula that uses values like $$x_1$$, $$x_2$$, or $$y_3$$, and doesn't involve complicated equations or cross products.

• What are Nx,Ny,Nz? – Salech Alhasov Feb 16 '13 at 17:42
• @SalechAlhasov x, y, and z coordinates of the surface normal vector. – acer Feb 16 '13 at 17:45
• In general the $N$ for each of $x, y$ and $z$ will be different. One thing you could do is write $v = P_1 - P_2$ and $w = P_2 - P_3$ to get two vectors ,then take the cross product $u = v \times w$; then $u\cdot (x, y, z) = d$, where $d = u\cdot P_1 = u\cdot P_2 = u\cdot P_3$ ($P_1, P_2, P_3$ are on the plane.) – snar Feb 16 '13 at 17:46
• Cross products aren't that complicated... – user856 Feb 16 '13 at 18:27
• Why do you want the components to add to 1? Do you want the normal vector to be unit instead (which would involve squaring the components)? – Muphrid Feb 16 '13 at 18:32

The cross product of two sides of the triangle equals the surface normal. So, if vector $$V$$ = $$P_2$$ - $$P_1$$, vector $$W$$ = $$P_3$$ - $$P_1$$, and vector $$N$$ is the surface normal, then:

$$N_x = (V_y * W_z) - (V_z * W_y)$$

$$N_y = (V_z * W_x) - (V_x * W_z)$$

$$N_z = (V_x * W_y) - (V_y * W_x)$$

If $$A$$ is the new vector whose components add up to 1, then:

$$A_x = \frac {N_x}{(N_x)^2 + (N_y)^2 + (N_z)^2}$$

$$A_y = \frac {N_y}{(N_x)^2 + (N_y)^2 + (N_z)^2}$$

$$A_z = \frac {N_z}{(N_x)^2 + (N_y)^2 + (N_z)^2}$$

• What will you do if $N_x+N_y+N_z=0$? – user856 Feb 17 '13 at 4:18
• If $N_x+N_y+N_z=0$ then the condition that their sum equal 1, as the OP asked for, can't be met anyway. – Dan Rust Feb 18 '13 at 15:11
• $N_x + N_y + N_z$ can't equal $0$ unless the triangle's points are all the same. – acer Feb 18 '13 at 17:08
• Oh really? What about the triangle whose vertices are $(0,0,0)$, $(1,1,0)$, and $(0,0,1)$? – user856 Feb 19 '13 at 5:35
• @ℝⁿ. That's another exception, but I won't be using those triangles anyway. – acer Feb 19 '13 at 23:17

The general question can be written in python like this:

import numpy as np
p1 = np.array([0,0,5])
p2 = np.array([1,0,5])
p3 = np.array([0,1,5])

N = np.cross(p2-p1, p3-p1)


The 'normalized' sum of 1 can be attempted like this:

N = N / N.sum()


For the (0,0,0), (1,1,0), (0,0,1) example mentioned above, where the components add up to 0, the result silently degrades to array([ inf, -inf, nan]).

• Please, this is Math SE, not Stack Overflow. – scaaahu Jan 20 '19 at 12:50
• This is really cool, numpy is useful for more than I thought. Plus when I first asked this question it was exactly for this purpose—to be able to calculate the surface normal in a programming environment. – acer Jan 21 '19 at 17:51
• @scaaahu Given the nature of the question, a relation to computer graphics was not entirely unlikely, and many years later, computer graphics are precisely how I stumbled upon this question, so I don't see anything wrong with this answer at all. – natiiix Jan 2 at 17:41

Let $P_1=(x_1,y_1,z_1)$, $P_2=(x_2,y_2,z_2)$ and $P_3=(x_3,y_3,z_3)$. The normal vector to the triangle with these three points as its vertices is then given by the cross product $n=(P_2-P_1)\times (P_3-P_1)$. In matrix form, we then see that $$n=\det\left(\left[\begin{matrix}i&j&k\\ x_2-x_1&y_2-y_1&z_2-z_1\\ x_3-x_1&y_3-y_1&z_3-z_1 \end{matrix}\right]\right)$$

$$=\left(\begin{matrix}(y_2-y_1)(z_3-z_1)-(y_3-y_1)(z_2-z_1)\\ (z_2-z_1)(x_3-x_1)-(x_2-x_1)(z_3-z_1)\\ (x_2-x_1)(y_3-y_1)-(x_3-x_1)(y_2-y_1) \end{matrix}\right)$$

If you need that the sum of the coefficients of $\hat{n}$ equals 1, then set $\alpha$ equal to the sum of the coefficients of $n$ and then let $\hat{n}=\frac{1}{\alpha}n$. Obviously, if $\alpha=0$ then you will never be able to satisfy your condition as any scalar multiple of $n$ will have the same zero-sum of coefficients.