Main Page | Namespace List | Class List | File List | Namespace Members | Class Members

geometry.cpp

00001 //
00002 //  file    : geometry.cpp
00003 //  author  : jh
00004 //  date    : 15 jul 2002
00005 //  changed : 25 oct 2002
00006 //
00007 
00008 
00009 #include <stdio.h>
00010 
00011 #include "geometry.h"
00012 #include "Vertex.h"
00013 
00014 
00015 double
00016 geometry::area(Vertex* v1, Vertex* v2, Vertex* v3)
00017 {
00018 
00019   double a = (0.5 * ((v2->x() * v3->y()  -  v3->x() * v2->y()) +
00020                      (v3->x() * v1->y()  -  v1->x() * v3->y()) +    
00021                      (v1->x() * v2->y()  -  v2->x() * v1->y())) );  
00022 
00023   return a;
00024 
00025 }
00026 
00027 
00028 double 
00029 geometry::distance(const point& p1, const point& p2)
00030 {
00031   double d = sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y) );
00032   return d;
00033 } 
00034  
00035 
00036 
00037 double
00038 geometry::distance(const line& l, const point& p)
00039 {
00040   double bX = l.p2.x - l.p1.x;
00041   double bY = l.p2.y - l.p1.y;
00042     
00043   double pX = p.x - l.p1.x;
00044   double pY = p.y - l.p1.y;
00045     
00046   double bxp = bX * pY - bY * pX;
00047     
00048   return fabs(bxp/distance(l.p1,l.p2));
00049   
00050 }
00051 
00052 
00053 bool
00054 geometry::intersect(const line& l1, const line& l2)
00055 {
00056   double CEPS = 1e-5;
00057 
00058 #ifdef _DEBUG_
00059   fprintf(stderr, "<geometry::intersect()>\n");
00060   fprintf(stderr, " check (%f/%f)-(%f/%f) x \n",
00061           l1.p1.x, l1.p1.y,  l1.p2.x, l1.p2.y );
00062   fprintf(stderr, "       (%f/%f)-(%f/%f) \n",
00063           l2.p1.x, l2.p1.y,  l2.p2.x, l2.p2.y );
00064 #endif
00065   
00066   double xmin, xmax, ymin, ymax;
00067   // double x1,x2,y1,y2;     
00068   double x21,x31,x41,x43; 
00069   double y21,y31,y41,y43; 
00070   double d0,d1,d2;        
00071   double s,t;         
00072 
00073 
00074   if( distance(l1.p1, l1.p2) < CEPS ) {
00075 #ifdef _DEBUG_
00076     fprintf(stderr, "(1) return <false>\n");
00077 #endif
00078     return false;
00079   }
00080 
00081 
00082   if( distance(l2.p1, l2.p2) < CEPS ) {
00083 #ifdef _DEBUG_
00084     fprintf(stderr, "(2) return <false>\n");
00085 #endif
00086     return false;
00087   }
00088 
00089 
00090   //  boxtest
00091 
00092   if( l1.p2.x > l1.p1.x ) {
00093     xmin = l1.p1.x;   
00094     xmax = l1.p2.x; 
00095   } else {     
00096     xmin = l1.p2.x; 
00097     xmax = l1.p1.x; 
00098   }
00099 
00100   if( l1.p2.y > l1.p1.y ) {
00101     ymin = l1.p1.y; 
00102     ymax = l1.p2.y; 
00103   } else {
00104     ymin = l1.p2.y; 
00105     ymax = l1.p1.y;
00106   }
00107         
00108 
00109   // x1 = l2.p1.x;      y1 = l2.p1.y;
00110   // x2 = l2.p2.x;      y2 = l2.p2.y;
00111     
00112   /*
00113     if( x1 > xmax  &&  x2 > xmax )  return false;
00114     if( x1 < xmin  &&  x2 < xmin )  return false;
00115     if( y1 > ymax  &&  y2 > ymax )  return false;
00116     if( y1 < ymin  &&  y2 < ymin )  return false;
00117   */
00118 
00119 
00120   if(l2.p1.x > xmax && l2.p2.x > xmax) {
00121 #ifdef _DEBUG_
00122     fprintf(stderr, "(3) return <false>\n");
00123 #endif
00124     return false;
00125   }
00126 
00127   if(l2.p1.x < xmin && l2.p2.x < xmin) {
00128 #ifdef _DEBUG_
00129     fprintf(stderr, "(4) return <false>\n");
00130 #endif
00131     return false;
00132   }
00133 
00134   if(l2.p1.y > ymax && l2.p2.y > ymax) {
00135 #ifdef _DEBUG_
00136     fprintf(stderr, "(5) return <false>\n");
00137 #endif
00138     return false;
00139   }
00140 
00141   if(l2.p1.y < ymin && l2.p2.y < ymin) {
00142 #ifdef _DEBUG_
00143     fprintf(stderr, "(6) return <false>\n");
00144 #endif
00145     return false;
00146   }
00147 
00148   //  get point of intersection
00149    
00150   x21 = l1.p2.x - l1.p1.x;
00151   x31 = l2.p1.x - l1.p1.x;
00152   x41 = l2.p2.x - l1.p1.x;
00153   x43 = l2.p2.x - l2.p1.x;
00154 
00155   y21 = l1.p2.y - l1.p1.y;
00156   y31 = l2.p1.y - l1.p1.y;
00157   y41 = l2.p2.y - l1.p1.y;
00158   y43 = l2.p2.y - l2.p1.y;
00159     
00160   d0  = x43 * y21  -  x21 * y43;
00161   d1  = x43 * y31  -  x31 * y43;
00162   d2  = x21 * y31  -  x31 * y21;
00163 
00164 
00165   //  check if edges are parallel
00166 
00167   if( fabs(d0) < CEPS && fabs(d1) > CEPS) {
00168 #ifdef _DEBUG_
00169     fprintf(stderr, "(7) return <false>\n");
00170 #endif
00171     return false;
00172   } else { 
00173     if( fabs(d0)< CEPS && fabs(d1) < CEPS) {
00174       d0 = x21 * x21  +  y21 * y21;
00175       d1 = x21 * x31  +  y21 * y31;
00176       d2 = x21 * x41  +  y21 * y41;
00177       s  = d1 / d0;
00178       t  = d2 / d0;
00179     } else {
00180       s = d1 / d0;
00181       t = d2 / d0;
00182     }
00183   }
00184         
00185   if( s < -CEPS  ||  s > 1.0 + CEPS ) {
00186 #ifdef _DEBUG_
00187     fprintf(stderr, "(8) return <false>\n");
00188 #endif
00189     return false;
00190   }
00191 
00192   if( t < -CEPS  ||  t > 1.0 + CEPS ) {
00193 #ifdef _DEBUG_
00194     fprintf(stderr, "(9) return <false>\n");
00195 #endif
00196     return false;
00197   }
00198 
00199 #ifdef _DEBUG_
00200   fprintf(stderr, "<geometry::intersects()> return <true>\n");
00201 #endif
00202 
00203   return true;
00204 
00205 }
00206 

Generated on Tue Mar 23 22:15:01 2004 for VMP by doxygen 1.3.6