00001 /* 00002 * plane.cpp 00003 * 00004 * Copyright (C) 2010 Thomas A. Vaughan 00005 * All rights reserved. 00006 * 00007 * 00008 * Redistribution and use in source and binary forms, with or without 00009 * modification, are permitted provided that the following conditions are met: 00010 * * Redistributions of source code must retain the above copyright 00011 * notice, this list of conditions and the following disclaimer. 00012 * * Redistributions in binary form must reproduce the above copyright 00013 * notice, this list of conditions and the following disclaimer in the 00014 * documentation and/or other materials provided with the distribution. 00015 * * Neither the name of the <organization> nor the 00016 * names of its contributors may be used to endorse or promote products 00017 * derived from this software without specific prior written permission. 00018 * 00019 * THIS SOFTWARE IS PROVIDED BY THOMAS A. VAUGHAN ''AS IS'' AND ANY 00020 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 00021 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00022 * DISCLAIMED. IN NO EVENT SHALL THOMAS A. VAUGHAN BE LIABLE FOR ANY 00023 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 00024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 00026 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00028 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00029 * 00030 * 00031 * Geometry methods specific to 3D planes (2D planes in 3D space) 00032 */ 00033 00034 // includes -------------------------------------------------------------------- 00035 #include "plane.h" // always include our own header first 00036 00037 00038 static const float s_eps = 1.0e-6; 00039 00040 00041 //////////////////////////////////////////////////////////////////////////////// 00042 // 00043 // static helper methods 00044 // 00045 //////////////////////////////////////////////////////////////////////////////// 00046 00047 00048 //////////////////////////////////////////////////////////////////////////////// 00049 // 00050 // public API 00051 // 00052 //////////////////////////////////////////////////////////////////////////////// 00053 00054 bool 00055 getLineOfIntersection 00056 ( 00057 IN const plane_t& A, 00058 IN const plane_t& B, 00059 OUT point3d_t& p0, 00060 OUT point3d_t& pt 00061 ) 00062 throw() 00063 { 00064 // intersection line direction is cross product of two plane normals 00065 pt = crossProduct(A.n, B.n); 00066 float n2 = dotProduct(pt, pt); 00067 if (n2 < s_eps) { 00068 DPRINTF("length of cross product: %f", n2); 00069 return false; // cross product is zero--no intersection 00070 } 00071 normalize(pt); 00072 00073 // now we need to find p0, a point on the intersection line 00074 float ab = dotProduct(A.n, B.n); 00075 float ab2 = ab * ab; 00076 float denom = 1.0 - ab2; 00077 if (denom < s_eps) { 00078 DPRINTF("1 - ab2 = %f", denom); 00079 // normals are nearly coincident 00080 return false; 00081 } 00082 00083 float b = (B.d - A.d * ab) / denom; 00084 float a = A.d - b * ab; 00085 00086 p0 = a * A.n + b * B.n; 00087 return true; 00088 } 00089