This section of the archives stores flipcode's complete Developer Toolbox collection, featuring a variety of mini-articles and source code contributions from our readers.

| Plane Class Submitted by

This is a simple plane class that allows you to calculate the equation of a plane given three points, determine a points orientation to the plane and determine if a line from point1 to point2 intersects the plane.

Download Associated File: planeflip.h (2,264 bytes)

    #ifndef __PLANEH__
    #define __PLANEH__

    #include "mathlib.h"

    static const float Epsilon = 1.0e-05f;

    struct plane_t
    {
       plane_t()                           {d = 0;}
       virtual ~plane_t()                  { }

       void Reset(void)                    {n.Set(0, 0, 0); d = 0;}

       // Returns 1 if the point, 'pt', is in front of the plane
       bool IsFront(vec3_t &pt)     {return (GetPointDistance(pt) > 0.0f) ? 1 : 0;}

       // Returns 1 if the point, 'pt', is behind the plane
       bool IsBack(vec3_t &pt)             {return !(IsFront(pt));}

       // Returns 1 if the point, 'pt', is on the plane
       inline bool IsOn(vec3_t &pt);

       // Calculates the plane equation given three points
       inline void CalcPlane(vec3_t &pta, vec3_t &ptb, vec3_t &ptc);

       // Returns 1 if the line from 'start' to 'end' intersects the plane.
       // 'point' is a point on the plane and 'result' is the point of
       // intersection if there is one, if there is no intersection 'result' is
       // not modified.
       inline bool LineIntersect(vec3_t &start, vec3_t &end, vec3_t &point,
        vec3_t &result);

       // Returns the distance that a point, 'pt', is from the plane
       float GetPointDistance(vec3_t &pt)  {return n.Dot(pt) + d;}

       // Returns the normal, A B and C in the plane equation
       const vec3_t &GetNormal(void)              {return n;}

       // Returns the D component of the plane equation
       const float &GetD(void)                    {return d;}

    protected:
       vec3_t n;
       float d;
    };

    inline bool plane_t::IsOn(vec3_t &pt)
    {
       float d = GetPointDistance(pt);
       return (d > -Epsilon && d < Epsilon) ? 1 : 0;
    }

    inline void plane_t::CalcPlane(vec3_t &pta, vec3_t &ptb, vec3_t &ptc)
    {
       n.Cross(ptb - pta, ptc - pta);
       n.Normalize();
       d = -ptc.Dot(n);
    }

    inline bool plane_t::LineIntersect(vec3_t &start, vec3_t &end, vec3_t &point,
     vec3_t &result)
    {
    	float denom, numer, u;
    	vec3_t dir;

    	dir = end - start;

    	denom = n.Dot(dir);

       // No divide by zero!
    	if (denom > -Epsilon && denom < Epsilon)
    		return 0; // Line is parallel to the plane

    	numer = n.Dot(point - start);

    	u = numer / denom;

       // Is there an intersection along the line?
    	if (u <= 0.0f || u > 1.0f)
    		return 0;

    	result = start + dir * u; // point of intersection

    	return 1;
    }

    #endif

The zip file viewer built into the Developer Toolbox made use of the zlib library, as well as the zlibdll source additions.

Copyright 1999-2008 (C) FLIPCODE.COM and/or the original content author(s). All rights reserved.
Please read our Terms, Conditions, and Privacy information.