source: molecuilder/src/vector.hpp@ c3294f

Last change on this file since c3294f was 06e3ff, checked in by Frederik Heber <heber@…>, 15 years ago

FIX: operator implementation of Vector algebra was wrong and caused memory leaks.

  • operator+, operator- and operator* were implemented as creating new Vectors and returning its pointer instead of creating an object and returning it as constant. This would cause memory leaks, as these pointers in complex algebraic expressions would never get free'd.
  • return values of operatorx= with x in {+,-,*} have been made const (suggested by Meyers' Effective C++)
  • Property mode set to 100755
File size: 4.0 KB
Line 
1#ifndef VECTOR_HPP_
2#define VECTOR_HPP_
3
4using namespace std;
5
6/*********************************************** includes ***********************************/
7
8// include config.h
9#ifdef HAVE_CONFIG_H
10#include <config.h>
11#endif
12
13#include <iostream>
14#include <gsl/gsl_vector.h>
15#include <gsl/gsl_multimin.h>
16
17#include "defs.hpp"
18
19/********************************************** declarations *******************************/
20
21/** Single vector.
22 * basically, just a x[3] but with helpful functions
23 */
24class Vector {
25 public:
26 double x[NDIM];
27
28 Vector();
29 Vector(const double x1, const double x2, const double x3);
30 ~Vector();
31
32 double Distance(const Vector * const y) const;
33 double DistanceSquared(const Vector * const y) const;
34 double DistanceToPlane(const Vector * const PlaneNormal, const Vector * const PlaneOffset) const;
35 double PeriodicDistance(const Vector * const y, const double * const cell_size) const;
36 double PeriodicDistanceSquared(const Vector * const y, const double * const cell_size) const;
37 double ScalarProduct(const Vector * const y) const;
38 double Norm() const;
39 double NormSquared() const;
40 double Angle(const Vector * const y) const;
41 bool IsZero() const;
42 bool IsOne() const;
43 bool IsNormalTo(const Vector * const normal) const;
44 bool IsEqualTo(const Vector * const a) const;
45
46 void AddVector(const Vector * const y);
47 void SubtractVector(const Vector * const y);
48 void CopyVector(const Vector * const y);
49 void CopyVector(const Vector &y);
50 void RotateVector(const Vector * const y, const double alpha);
51 void VectorProduct(const Vector * const y);
52 void ProjectOntoPlane(const Vector * const y);
53 void ProjectIt(const Vector * const y);
54 Vector Projection(const Vector * const y) const;
55 void Zero();
56 void One(const double one);
57 void Init(const double x1, const double x2, const double x3);
58 void Normalize();
59 void Translate(const Vector * const x);
60 void Mirror(const Vector * const x);
61 void Scale(const double ** const factor);
62 void Scale(const double * const factor);
63 void Scale(const double factor);
64 void MatrixMultiplication(const double * const M);
65 void InverseMatrixMultiplication(const double * const M);
66 void KeepPeriodic(const double * const matrix);
67 void LinearCombinationOfVectors(const Vector * const x1, const Vector * const x2, const Vector * const x3, const double * const factors);
68 double CutsPlaneAt(const Vector * const A, const Vector * const B, const Vector * const C) const;
69 bool GetIntersectionWithPlane(const Vector * const PlaneNormal, const Vector * const PlaneOffset, const Vector * const Origin, const Vector * const LineVector);
70 bool GetIntersectionOfTwoLinesOnPlane(const Vector * const Line1a, const Vector * const Line1b, const Vector * const Line2a, const Vector * const Line2b, const Vector *Normal = NULL);
71 bool GetOneNormalVector(const Vector * const x1);
72 bool MakeNormalVector(const Vector * const y1);
73 bool MakeNormalVector(const Vector * const y1, const Vector * const y2);
74 bool MakeNormalVector(const Vector * const x1, const Vector * const x2, const Vector * const x3);
75 bool SolveSystem(Vector * x1, Vector * x2, Vector * y, const double alpha, const double beta, const double c);
76 bool LSQdistance(const Vector ** vectors, int dim);
77 void AskPosition(const double * const cell_size, const bool check);
78 void Output() const;
79 bool IsInParallelepiped(const Vector &offset, const double * const parallelepiped) const;
80 void WrapPeriodically(const double * const M, const double * const Minv);
81
82};
83
84ostream & operator << (ostream& ost, const Vector &m);
85bool operator==(const Vector& a, const Vector& b);
86const Vector& operator+=(Vector& a, const Vector& b);
87const Vector& operator-=(Vector& a, const Vector& b);
88const Vector& operator*=(Vector& a, const double m);
89Vector const operator*(const Vector& a, const double m);
90Vector const operator*(const double m, const Vector& a);
91Vector const operator+(const Vector& a, const Vector& b);
92Vector const operator-(const Vector& a, const Vector& b);
93
94
95#endif /*VECTOR_HPP_*/
Note: See TracBrowser for help on using the repository browser.