Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/vector.cpp

    rccf826 rd4c9ae  
    213213{
    214214  Vector tmp;
    215   tmp[0] = x[1]* y[2] - x[2]* y[1];
    216   tmp[1] = x[2]* y[0] - x[0]* y[2];
    217   tmp[2] = x[0]* y[1] - x[1]* y[0];
     215  tmp[0] = x[1]* (y[2]) - x[2]* (y[1]);
     216  tmp[1] = x[2]* (y[0]) - x[0]* (y[2]);
     217  tmp[2] = x[0]* (y[1]) - x[1]* (y[0]);
    218218  (*this) = tmp;
    219219};
     
    232232  *this -= tmp;
    233233};
     234
     235/** Calculates the minimum distance vector of this vector to the plane.
     236 * \param *out output stream for debugging
     237 * \param *PlaneNormal normal of plane
     238 * \param *PlaneOffset offset of plane
     239 * \return distance to plane
     240 * \return distance vector onto to plane
     241 */
     242Vector Vector::GetDistanceVectorToPlane(const Vector &PlaneNormal, const Vector &PlaneOffset) const
     243{
     244  Vector temp = (*this) - PlaneOffset;
     245  temp.MakeNormalTo(PlaneNormal);
     246  temp.Scale(-1.);
     247  // then add connecting vector from plane to point
     248  temp += (*this)-PlaneOffset;
     249  double sign = temp.ScalarProduct(PlaneNormal);
     250  if (fabs(sign) > MYEPSILON)
     251    sign /= fabs(sign);
     252  else
     253    sign = 0.;
     254
     255  temp.Normalize();
     256  temp.Scale(sign);
     257  return temp;
     258};
     259
    234260
    235261/** Calculates the minimum distance of this vector to the plane.
     
    525551  MatrixMultiplication(M);
    526552};
    527 
    528 std::pair<Vector,Vector> Vector::partition(const Vector &rhs) const{
    529   double factor = ScalarProduct(rhs)/rhs.NormSquared();
    530   Vector res= factor * rhs;
    531   return make_pair(res,(*this)-res);
    532 }
    533 
    534 std::pair<pointset,Vector> Vector::partition(const pointset &points) const{
    535   Vector helper = *this;
    536   pointset res;
    537   for(pointset::const_iterator iter=points.begin();iter!=points.end();++iter){
    538     pair<Vector,Vector> currPart = helper.partition(*iter);
    539     res.push_back(currPart.first);
    540     helper = currPart.second;
    541   }
    542   return make_pair(res,helper);
    543 }
    544553
    545554/** Do a matrix multiplication.
     
    602611};
    603612
     613/** Mirrors atom against a given plane.
     614 * \param n[] normal vector of mirror plane.
     615 */
     616void Vector::Mirror(const Vector &n)
     617{
     618  double projection;
     619  projection = ScalarProduct(n)/n.NormSquared();    // remove constancy from n (keep as logical one)
     620  // withdraw projected vector twice from original one
     621  for (int i=NDIM;i--;)
     622    at(i) -= 2.*projection*n[i];
     623};
     624
    604625/** Calculates orthonormal vector to one given vectors.
    605626 * Just subtracts the projection onto the given vector from this vector.
     
    612633  bool result = false;
    613634  double factor = y1.ScalarProduct(*this)/y1.NormSquared();
    614   Vector x1 = factor * y1;
     635  Vector x1;
     636  x1 = factor * y1;
    615637  SubtractVector(x1);
    616638  for (int i=NDIM;i--;)
Note: See TracChangeset for help on using the changeset viewer.