Files
LBPM/analysis/PointList.h

236 lines
6.0 KiB
C
Raw Normal View History

2018-06-11 15:19:05 -04:00
/*
Copyright 2013--2018 James E. McClure, Virginia Polytechnic & State University
2020-10-12 06:08:29 -04:00
Copyright Equnior ASA
2018-06-11 15:19:05 -04:00
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PointList_INC
#define PointList_INC
2013-10-08 22:29:21 -04:00
#include <math.h>
2014-11-04 21:58:20 -05:00
struct LBPM_Point {
LBPM_Point() : x(0.0), y(0.0), z(0.0) {}
LBPM_Point(double xv, double yv, double zv) : x(xv), y(yv), z(zv) {}
double x, y, z;
2013-10-08 22:29:21 -04:00
};
2014-11-04 21:58:20 -05:00
typedef LBPM_Point Point;
2013-10-08 22:29:21 -04:00
inline Point operator+(const Point &A, const Point &B) {
return Point(A.x + B.x, A.y + B.y, A.z + B.z);
}
inline Point operator-(const Point &A, const Point &B) {
return Point(A.x - B.x, A.y - B.y, A.z - B.z);
}
inline Point operator*(const Point &A, double v) {
return Point(A.x * v, A.y * v, A.z * v);
}
inline Point operator*(double v, const Point &A) {
return Point(A.x * v, A.y * v, A.z * v);
}
inline Point operator/(const Point &A, double v) {
return Point(A.x / v, A.y / v, A.z / v);
}
inline Point operator-(const Point &A) { return Point(-A.x, -A.y, -A.z); }
2013-10-08 22:29:21 -04:00
inline bool operator==(const Point &A, const Point &B) {
return (A.x == B.x && A.y == B.y && A.z == B.z);
}
inline bool operator!=(const Point &A, const Point &B) {
return (A.x != B.x || A.y != B.y || A.z != B.z);
}
2013-10-08 22:29:21 -04:00
inline double Norm(const Point &A) {
return sqrt(A.x * A.x + A.y * A.y + A.z * A.z);
}
inline Point Cross(const Point &A, const Point &B) {
return Point(A.y * B.z - A.z * B.y, B.x * A.z - A.x * B.z,
A.x * B.y - A.y * B.x);
}
inline double Dot(const Point &A, const Point &B) {
return (A.x * B.x + A.y * B.y + A.z * B.z);
}
inline double Distance(const Point &A, const Point &B) {
return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y) +
(A.z - B.z) * (A.z - B.z));
}
2013-10-08 22:29:21 -04:00
/*
class PointList{
public:
int length;
int m;
int index;
Point pt;
double *data;
PointList();
PointList(int size);
~PointList();
void New(int size);
Point & operator()(int idx)
{
index = idx;
pt.x = data[3*index];
pt.y = data[3*index+1];
pt.z = data[3*index+2];
return pt;
}
Point &operator=(Point &P){
pt.x = P.x;
pt.y = P.y;
pt.z = P.z;
data[3*index]=pt.x;
data[3*index+1]=pt.y;
data[3*index+2]=pt.z;
}
};
// *****************************************
// ******** class PointList **************
// *****************************************
PointList::PointList()
{
m=length=0;
}
PointList::PointList(int size)
{
m=size;
data = new double [3*size];
length = size;
}
void PointList::New(int size)
{
m=size;
data = new double [3*size];
length = size;
}
PointList::~PointList()
{
delete data;
}
*/
template <class T> class DTList {
2013-10-08 22:29:21 -04:00
public:
DTList() : Data(0), length(0), refCount(new size_t(1)), outOfRange() {}
DTList(const DTList<T> &A)
: Data(A.Data), length(A.length), refCount(A.refCount), outOfRange() {
++(*refCount);
}
2013-10-08 22:29:21 -04:00
protected:
DTList(size_t len)
: Data(len <= 0 ? 0 : new T[len]), length(len <= 0 ? 0 : len),
refCount(new size_t(1)), outOfRange() {}
2013-10-08 22:29:21 -04:00
public:
virtual ~DTList() {
--(*refCount);
if (*refCount == 0) {
delete[] Data;
delete refCount;
}
Data = 0;
refCount = 0;
length = 0;
2013-10-08 22:29:21 -04:00
}
2013-10-08 22:29:21 -04:00
DTList<T> &operator=(const DTList<T> &A) {
if (A.refCount != refCount) { // Otherwise doing A=A.
2013-10-08 22:29:21 -04:00
--(*refCount);
if (*refCount == 0) {
delete[] Data;
delete refCount;
}
2013-10-08 22:29:21 -04:00
refCount = A.refCount;
++(*refCount);
length = A.length;
Data = A.Data;
}
return *this;
}
2015-01-07 13:29:11 -05:00
size_t MemoryUsed(void) const { return length * sizeof(T); }
const T *Pointer(void) const { return Data; }
size_t IsEmpty(void) const { return (Data == 0); }
size_t Length(void) const { return length; }
const T operator()(size_t i) const { return Data[i]; }
2013-10-08 22:29:21 -04:00
protected:
T *Data;
size_t length;
size_t *refCount;
2013-10-08 22:29:21 -04:00
// Should be static.
T outOfRange;
};
template <class T> class DTMutableList : public DTList<T> {
2013-10-08 22:29:21 -04:00
public:
DTMutableList() : DTList<T>() {}
DTMutableList(size_t len) : DTList<T>(len) {}
DTMutableList(const DTMutableList<T> &A) : DTList<T>(A) {}
DTMutableList<T> &operator=(const DTMutableList<T> &A) {
DTList<T>::operator=(A);
return *this;
}
T *Pointer(void) { return DTList<T>::Data; }
const T *Pointer(void) const { return DTList<T>::Data; }
T &operator()(size_t i) { return DTList<T>::Data[i]; }
T operator()(size_t i) const { return DTList<T>::Data[i]; }
DTMutableList<T> &operator=(T v) {
for (size_t i = 0; i < DTList<T>::length; i++)
DTList<T>::Data[i] = v;
return *this;
}
2013-10-08 22:29:21 -04:00
};
template <class T>
DTMutableList<T> TruncateSize(const DTList<T> &A, size_t length) {
if (length > A.Length())
length = A.Length();
2013-10-08 22:29:21 -04:00
DTMutableList<T> toReturn(length);
const T *fromP = A.Pointer();
T *toP = toReturn.Pointer();
for (size_t i = 0; i < length; i++)
toP[i] = fromP[i];
2013-10-08 22:29:21 -04:00
return toReturn;
}
template <class T>
DTMutableList<T> IncreaseSize(const DTList<T> &A, size_t addLength) {
DTMutableList<T> toReturn(A.Length() + (addLength >= 0 ? addLength : 0));
2013-10-08 22:29:21 -04:00
size_t len = A.Length();
const T *fromP = A.Pointer();
T *toP = toReturn.Pointer();
for (size_t i = 0; i < len; i++)
toP[i] = fromP[i];
2013-10-08 22:29:21 -04:00
return toReturn;
}
#endif