13
$\begingroup$

I have a 3D plane defined by three points: $P_0$ , $P_1$ and $P_2$. How to check whether a point $P$ is located right on and inside the 3D triangle?

So, for example, if I have a plane defined by $({0,0,0})$, $({10,0,0})$ and $({0,10,0})$, then the point $({50,0,0})$ is considered not located on the plane, whereas the point $({5,0,0})$ is.

$\endgroup$
11
  • $\begingroup$ Does $P$ have to be within the triangle defined by the three points, or you just want to check that $P$ satisfies the equation of the plane? $\endgroup$ Commented Sep 9, 2010 at 6:28
  • $\begingroup$ @J.M. Yes, it has to be. See the updated question. $\endgroup$ Commented Sep 9, 2010 at 6:31
  • $\begingroup$ A point-in-polygon test: ics.uci.edu/~eppstein/161/960307.html in conjunction with the determinant check provided by Robin, should be suitable for your purposes. $\endgroup$ Commented Sep 9, 2010 at 6:43
  • 2
    $\begingroup$ As I thought, it was already asked at stackoverflow.com/questions/924171 $\endgroup$ Commented Sep 9, 2010 at 6:49
  • 1
    $\begingroup$ If you're going to be implementing this in a computer program, beware that because of floating-point error your point P will almost surely not lie exactly on the plane defined by the other three points. $\endgroup$ Commented Sep 9, 2010 at 7:19

4 Answers 4

22
$\begingroup$

You can find if a point is in a triangle using barycentric coordinates.

If you have a triangle with vertices $A$, $B$ & $C$, & a point P in the plane of the triangle, you simply need to find:

$AreaABC = \frac{ \left| \overline{AB} \times \overline{AC} \right| }{ 2 }$

$\alpha = \frac{ \left| \overline{PB} \times \overline{PC} \right| }{ 2AreaABC }$

$\beta = \frac{ \left| \overline{PC} \times \overline{PA} \right| }{ 2AreaABC }$

$\gamma = 1 − \alpha − \beta$

Here $\alpha$ is the ratio of the area of a subtriangle $PBC$ over the area of the whole triangle $ABC$, as shown in this image from Peter Shirley's book:

finding barycentric coordinates

If ALL of the following 4 restrictions are met:

  • $ 0 \le \alpha \le 1 $
  • $ 0 \le \beta \le 1 $
  • $ 0 \le \gamma \le 1 $
  • $\alpha + \beta + \gamma = 1$

then the point P is inside the triangle.

If ANY of $\alpha$,$\beta$,$\gamma$ are outside those ranges, or if the sum of $ \alpha + \beta + \gamma \ne 1 $ then the point P is not inside the triangle.

Notice how we exploit the 4th condition ($\alpha + \beta + \gamma = 1$) in finding $\gamma$.

Even though we find $\gamma$ that way, we still must check that $ 0 \le \alpha \le 1 $ and $ 0 \le \beta \le 1 $ and $ 0 \le \gamma \le 1 $ for the point to be inside the triangle.

$\gamma$ can easily be outside $[0, 1]$. Say $\alpha=0.99$ and $\beta=0.85$. Then $\gamma = 1 - 0.99 - 0.85 = -0.84$, and the point that got us those barycentric coordinates would be outside the triangle.

Things to observe:

  • When one of ($\alpha$, $\beta$, $\gamma$) is 1 and the other two are 0, then the point P is exactly at a vertex of the triangle.

  • When one of ($\alpha$, $\beta$, $\gamma$) is 0, and the other 2 coordinates are between 0 and 1, the point P is on an edge of the triangle.

$\endgroup$
7
  • $\begingroup$ See also Vector3.Barycentric on MSDN $\endgroup$ Commented Mar 24, 2011 at 1:41
  • $\begingroup$ If $P$ is not in the plane, there is an elegant solution here math.stackexchange.com/questions/544946/… $\endgroup$ Commented Oct 30, 2013 at 0:59
  • $\begingroup$ This doesn't work, try $a = [0.5, 0, -1]$, $b = [0.5, 0, 1]$, $c = [0.92, 1.2, 0]$ and check if $p = [1, 1.4, 0]$ is in there. It won't work. $\endgroup$ Commented Oct 11, 2015 at 4:48
  • 1
    $\begingroup$ Your conclusion is incorrect. P is inside the triangle ONLY if $ \alpha, \beta, \gamma \ge 0 $ AND $ \alpha + \beta + \gamma = 1 $ $\endgroup$ Commented Oct 24, 2018 at 18:45
  • 1
    $\begingroup$ A, alpha, and beta will always be positive (areas) and so gamma could also be positive even if the point lies outside the triangle. Something isn't quite complete about your algorithm. Should we be keeping track of the signs of the cross products by dotting them with the unit normal instead? See correct solution here: math.stackexchange.com/questions/544946/… $\endgroup$ Commented Oct 25, 2018 at 11:08
11
$\begingroup$

Try to solve the system $$ x * (P_1 - P_0) + y * (P_2 - P_0) = P - P_0 $$ If it is solveable, the point $P$ lies on the plane. If in addition $x \geq 0$, $y \geq 0$, and $x + y \leq 1$, then $P$ lies inside the triangle.

$\endgroup$
7
  • $\begingroup$ I believe this should say x*(P_1-P_0)+y*(P_2-P_0)=P-P_0. $\endgroup$ Commented Sep 9, 2010 at 8:16
  • 1
    $\begingroup$ Michael, I'm trying to understand your solution... is this three equations in two unknowns? $\endgroup$ Commented Sep 9, 2010 at 8:19
  • 1
    $\begingroup$ @J.M. Yes, these are three equations (one for each dimension) in the two skalar unknowns x and y. $\endgroup$ Commented Sep 9, 2010 at 8:31
  • $\begingroup$ @Jonas Kibelbek: Good Catch. Corrected. $\endgroup$ Commented Sep 9, 2010 at 8:31
  • 2
    $\begingroup$ Hmm... so it's an overdetermined system. Would least squares apply here, or is there a specialized method for this problem? $\endgroup$ Commented Sep 9, 2010 at 8:49
2
$\begingroup$

Vectors $V_{01}=P_1-P_0$ and $V_{02}=P_2-P_0$ lie in the plane of the triangle, and $V_{01}\times V_{02}$ is normal to this plane. Let $V_{0p}=P-P_0$, and if $V_{0p} \cdot (V_{01}\times V_{02}) = 0$ then $P$ lies in the plane.

Let $P=cP_0+aP_1+bP_2$ where $c=1-a-b$. Then $P=(1-a-b)P_0+aP_1+bP_2$ or $V_{0p}=aV_{01}+bV_{02}$. If $0 \le a,b,c \le 1$ then $P$ lies in the triangle or on its edge.

Vector $V_{01} \times (V_{01}\times V_{02})$ is orthogonal to $V_{01}$ so $V_{02} \cdot(V_{01} \times (V_{01}\times V_{02}))b=V_{0p} \cdot(V_{01} \times (V_{01}\times V_{02}))$ can be solved for b.

Likewise $V_{02} \times (V_{01}\times V_{02})$ is orthogonal to $V_{02}$ so $V_{01} \cdot(V_{02} \times (V_{01}\times V_{02}))a=V_{0p} \cdot(V_{02} \times (V_{01}\times V_{02}))$ can be solved for a.

$\endgroup$
0
$\begingroup$

There may well be a more efficient algorithm, but here's a way to check that P is on the triangle defined by the three points

Compare the cross products $\vec {P_0 P_1} \times \vec {P_0 P_2} = \vec a$ and $\vec {P P_1} \times \vec {P P_2} = \vec b$. If $\vec b = k_1 \vec a$ with $k_1 \geq 0$, then P is on the plane and is on the correct side of the line through P1 and P2.

Now, compute $\vec {P P_2} \times \vec {P P_0} = \vec c$ and $\vec {P P_0} \times \vec {P P_1} = \vec d$. If $\vec c = k_2 \vec a$ and $\vec d = k_3 \vec a$ with $k_2, k_3 \geq 0$, then P lies within the triangle.

Of course, there's a lot of redundancy in this calculation. Once we know P is on the plane, we could just check one coordinate of the $\vec c$ and $\vec d$ to see that they have the correct sign. This is just projecting the problem onto one of the coordinate planes.


My old answer below explains how to check that P is on the infinite plane defined by the first three points, not how to check if it lies inside the triangle defined by the first three points, which is what the question intended.


A general plane equation is Ax + By + Cz = D. The 3-dimensional vector <A,B,C> is perpendicular to the plane.

(Note that there is not a unique equation of this form; you can multiply the equation by any nonzero number and get another equation of the plane. --So you can try to find a solutions with D=1, and if that doesn't work, use D=0.)

If you find an equation of the plane defined by your first three points, you can just plug in the fourth point to check if it satisfies the equation.

You can solve for the plane equation by hand by setting up equation from the first three points; but a more efficient method is to take the cross product of the vector $\vec {P_0 P_1}$ and the vector $\vec {P_0 P_2}$, and to use the resulting vector as <A,B,C>. You'll find it very useful to understand the cross product if you like working in 3-D space.

$\endgroup$
1
  • $\begingroup$ please not that the point has to be located inside the triangle. Not sure how your solution checks for this. $\endgroup$ Commented Sep 9, 2010 at 6:49

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.