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
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
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
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
00111
00112
00113
00114
00115
00116
00117
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
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
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