diff --git a/main.c b/main.c index d7cf380..65afbfa 100644 --- a/main.c +++ b/main.c @@ -1,26 +1,173 @@ +#include #include +#include +#include +#include -int left(long ax, long ay, long bx, long by) +#define PI 3.14159265 + +using namespace std; + + + +double distanceBetweenTwoPoints(double px1,double py1,double px2,double py2) +{ + double d = sqrt( pow((px2-px1),2) + pow((py2-py1),2) ); + return d; +} + +double prependicularDistance(double px, double py, + double vx1, double vy1, double vx2, double vy2) +{ + + + double d = ( + ( fabs( ((vy2-vy1)*px) - ((vx2-vx1)*py) + (vx2*vy1)- (vy2*vx1) ) ) + / + ( sqrt( ( pow((vy2-vy1),2) ) + ( pow(vx2-vx1,2) ) ) ) + ); + return d; +} + +double AngelsOfVectors(double wx1, double wy1, double wx2, double wy2, + double vx1, double vy1, double vx2, double vy2) +{ + double W = sqrt( pow((wx2 - wx1),2) + pow((wy2 - wy1),2) ); + double V = sqrt( pow((vx2 - vx1),2) + pow((vy2 - vy1),2) ); + double temp = ( ((wx2 - wx1)*(vx2 - vx1)) + ((wy2 - wy1)*(vy2 - vy1)) ) / (W*V) ; + double teta = acos( temp )*(180.0/PI); + return fabs( teta ); +} + +double hausdorffDistance(double px, double py, double vx1, double vy1, double vx2, double vy2) { - return (ax * by) - (ay * bx) < 0; + double d = 0; + if ( AngelsOfVectors( vx1,vy1,px,py,vx1,vy1,vx2,vy2 ) < 90 && AngelsOfVectors( vx2,vy2,px,py,vx2,vy2,vx1,vy1 ) < 90 ) + { + //cout << 1; + d = prependicularDistance( px,py,vx1,vy1,vx2,vy2 ); + } + else if (AngelsOfVectors( vx1,vy1,px,py,vx1,vy1,vx2,vy2 ) >= 90) + { + //cout << 2; + d = distanceBetweenTwoPoints( px,py,vx1,vy1 ); + } + else if ( AngelsOfVectors( vx2,vy2,px,py,vx2,vy2,vx1,vy1 ) >= 90 ) + { + //cout << 3; + d = distanceBetweenTwoPoints( px,py,vx2,vy2 ); + } + return d; +} + + +void Agrawal(double x[], double y[],int n, double epsilon) +{ + + cout << x[0] << " " << y[0] << "\n"; + + bool a = true; + + for (int i = 0; i < n; i++ ) + { + a = true; + for (int j = i+1; j < n; j++ ) + { + for (int k = i; k < j; k++) + { + if ( hausdorffDistance(x[k],y[k],x[i],y[i],x[j],y[j]) < epsilon ) { + + } else { + i = j-1; + if ( i != 0) + cout << x[i] << " " << y[i] << "\n"; + a = false; + i--; + break; + } + } + if (!a) + break; + } + } + cout << x[n-1] << " " << y[n-1] << "\n"; } -long hausdorff_point(long ax, long ay, long bx, long by, long px, long py) + +void NewAlgAgrawal(double x[], double y[],int n) { - long rx = bx + (ay - by); - long ry = by + (bx - ax); - long sx = ax + (ay - by); - long sy = ay + (bx - ax); - if (left(rx - bx, ry - by, px - rx, py - ry) + - left(rx - bx, ry - by, ax - rx, ay - ry) != 1) - return 0; - if (left(sx - ax, sy - ay, px - sx, py - sy) + - left(sx - ax, sy - ay, bx - sx, by - sy) != 1) - return 0; - return 0; + double min_x = *std::min_element(x,x+n); + double max_x = *std::max_element(x,x+n); + + double min_y = *std::min_element(y,y+n); + double max_y = *std::max_element(y,y+n); + + int arr_length = ( (double)(max_x - min_x ) / 0.1 ) + 5; + double new_x[arr_length]; + double new_y[arr_length]; + + int k = 0; + for ( int i = 0; i < n-1; i++ ) + { + for ( double j = x[i]; j <= x[i+1]; j += 0.1 ) + { + new_x[k] = j; + new_y[k] = ( (double)( y[i+1]-y[i] ) / ( x[i+1]-x[i] ) )*( j - x[i] )+y[i]; + k++; + } + } + + new_x[arr_length-1] = x[n-1]; + new_y[arr_length-1] = y[n-1]; + + + //for ( int i = 0; i < arr_length; i++) + //cout << "new_x[" << i << "] = " << new_x[i] << " " << "new_y[" << i << "] = " << new_y[i] << "\n"; + + Agrawal(new_x,new_y,arr_length,1); + } -int main(void) +int main() { - return 0; + //cout << "\n" <