_vector.c
Upload User: gzelex
Upload Date: 2007-01-07
Package Size: 707k
Code Size: 4k
Development Platform:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _vector.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #include <LEDA/vector.h>
  12. #include <math.h>
  13. void vector::check_dimensions(const vector& vec) const
  14. { if (d!=vec.d)
  15.    error_handler(1,"vector arguments have different dimensions.");
  16.  }
  17. vector::vector() 
  18. { d = 0; 
  19.   v = nil;
  20.  }
  21. vector::vector(int n) 
  22.  if (n<0) error_handler(1,"vector: negative dimension."); 
  23.  d = n; 
  24.  v = nil;
  25.  if (d > 0)
  26.  { if (d < 32)
  27.        v = (double*)allocate_bytes(d*sizeof(double));
  28.    else
  29.        v = new double[d];
  30.    while (n--) v[n] = 0.0;
  31.   }
  32. }
  33. vector::~vector() 
  34. { if (v) 
  35.     if (d < 32) 
  36.        deallocate_bytes(v,d*sizeof(double));
  37.     else
  38.        delete[] v;
  39. }
  40. vector::vector(const vector& p) 
  41. { d = p.d; 
  42.   v = nil;
  43.   if (d > 0) 
  44.   { if (d < 32)
  45.         v = (double*)allocate_bytes(d*sizeof(double));
  46.     else
  47.         v = new double[d];
  48.     for(int i=0; i<d; i++) v[i] = p.v[i];
  49.    }
  50. }
  51. vector::vector(double x, double y) 
  52. { v = (double*)allocate_bytes(2*sizeof(double));
  53.   d = 2;
  54.   v[0] = x;
  55.   v[1] = y;
  56.  }
  57. vector::vector(double x, double y, double z) 
  58. { v = (double*)allocate_bytes(3*sizeof(double));
  59.   d = 3;
  60.   v[0] = x;
  61.   v[1] = y;
  62.   v[2] = z;
  63.  }
  64. double  vector::operator[](int i) const
  65. { if (i<0 || i>=d)  error_handler(1,"vector: index out of range ");
  66.   return v[i]; 
  67. }
  68. double& vector::operator[](int i)
  69. { if (i<0 || i>=d)  error_handler(1,"vector: index out of range ");
  70.   return v[i]; 
  71. }
  72. vector& vector::operator+=(const vector& vec)
  73. { check_dimensions(vec);
  74.   register int n = d;
  75.   while (n--) v[n] += vec.v[n];
  76.   return *this;
  77. }
  78. vector& vector::operator-=(const vector& vec)
  79. { check_dimensions(vec);
  80.   register int n = d;
  81.   while (n--) v[n] -= vec.v[n];
  82.   return *this;
  83. }
  84. vector vector::operator+(const vector& vec) const
  85. { check_dimensions(vec);
  86.   register int n = d;
  87.   vector result(n);
  88.   while (n--) result.v[n] = v[n]+vec.v[n];
  89.   return result;
  90. }
  91. vector vector::operator-(const vector& vec) const
  92. { check_dimensions(vec);
  93.   register int n = d;
  94.   vector result(n);
  95.   while (n--) result.v[n] = v[n]-vec.v[n];
  96.   return result;
  97. }
  98. vector vector::operator-() const  // unary minus
  99. { register int n = d;
  100.   vector result(n);
  101.   while (n--) result.v[n] = -v[n];
  102.   return result;
  103. }
  104. vector vector::operator*(double x) const
  105. { int n = d;
  106.   vector result(n);
  107.   while (n--) result.v[n] = v[n] * x;
  108.   return result;
  109. }
  110. vector vector::operator/(double x) const
  111. { int n = d;
  112.   vector result(n);
  113.   while (n--) result.v[n] = v[n] / x;
  114.   return result;
  115. }
  116. //friend
  117. vector operator*(double f, const vector& v) { return v*f;     } 
  118. double vector::operator*(const vector& vec) const
  119. { check_dimensions(vec);
  120.   double result=0;
  121.   register int n = d;
  122.   while (n--) result = result+v[n]*vec.v[n];
  123.   return result;
  124. }
  125. vector& vector::operator=(const vector& vec)
  126. { register int n = vec.d;
  127.   if (n != d)
  128.   { 
  129.     if (v)
  130.     { if (d < 32)
  131.           deallocate_bytes(v,d*sizeof(double));
  132.       else
  133.           delete[] v;
  134.      }
  135.     if (n < 32)
  136.         v = (double*)allocate_bytes(n*sizeof(double));
  137.     else
  138.         v = new double[n];
  139.     d = n;
  140.    }
  141.   while (n--) v[n] = vec.v[n];
  142.   return *this;
  143. }
  144. bool vector::operator==(const vector& vec)  const
  145. { if (vec.d != d) return false;
  146.   int i = 0;
  147.   while ((i<d) && (v[i]==vec.v[i])) i++;
  148.   return (i==d) ? true : false;
  149.  }
  150. ostream& operator<<(ostream& s, const vector& v)
  151. { for (int i=0;i<v.d;i++)  s << string("%7.2f ",v[i]);
  152.   return s;
  153. }
  154. istream& operator>>(istream& s, vector& x)
  155. { int i=0;
  156.   while (i<x.d && s >> x.v[i++]);
  157.   return s;
  158. }
  159. double vector::length() const { return sqrt(*this * *this); }
  160. double vector::angle(const vector& y)  const
  161. { double l = length();
  162.   double yl = y.length();
  163.   if ( l==0 || yl==0)
  164.     error_handler(1,"angle: zero argumentn");
  165.   return  acos((*this)*y/(l*yl));  
  166. }
  167. int vector::cmp(const vector& v1, const vector& v2)
  168. { register int i;
  169.   if (v1.dim() != v2.dim())
  170.     error_handler(1,"compare(vector,vector): different dimensionsn");
  171.   for(i=0; i < v1.dim() && v1[i]==v2[i]; i++);
  172.   if (i == v1.dim()) return 0;
  173.    
  174.   return (v1[i] < v2[i]) ?  -1 : 1;
  175. }