00001
00002
00003
00004
00005
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
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
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
00110
00111
00112
00113
00114
00115
00116
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
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
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