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

Generated on Sun Sep 12 12:59:33 2004 for DelaunayMeshGenerator by doxygen 1.3.7