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/>.
|
|
|
|
|
*/
|
2014-09-09 14:42:13 -04:00
|
|
|
#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) {}
|
2021-11-08 22:58:37 +01:00
|
|
|
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
|
|
|
|
2021-11-08 22:58:37 +01: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
|
|
|
|
2021-11-08 22:58:37 +01: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
|
|
|
|
2021-11-08 22:58:37 +01: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;
|
|
|
|
|
}
|
|
|
|
|
*/
|
2021-11-08 22:58:37 +01:00
|
|
|
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() {}
|
2021-11-08 22:58:37 +01:00
|
|
|
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:
|
2021-11-08 22:58:37 +01:00
|
|
|
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() {
|
2021-11-08 22:58:37 +01:00
|
|
|
--(*refCount);
|
|
|
|
|
if (*refCount == 0) {
|
|
|
|
|
delete[] Data;
|
|
|
|
|
delete refCount;
|
|
|
|
|
}
|
|
|
|
|
Data = 0;
|
|
|
|
|
refCount = 0;
|
|
|
|
|
length = 0;
|
2013-10-08 22:29:21 -04:00
|
|
|
}
|
2021-11-08 22:58:37 +01:00
|
|
|
|
2013-10-08 22:29:21 -04:00
|
|
|
DTList<T> &operator=(const DTList<T> &A) {
|
2021-11-08 22:58:37 +01:00
|
|
|
if (A.refCount != refCount) { // Otherwise doing A=A.
|
2013-10-08 22:29:21 -04:00
|
|
|
--(*refCount);
|
2021-11-08 22:58:37 +01:00
|
|
|
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
|
|
|
|
2021-11-08 22:58:37 +01: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;
|
2021-11-08 22:58:37 +01:00
|
|
|
|
2013-10-08 22:29:21 -04:00
|
|
|
// Should be static.
|
|
|
|
|
T outOfRange;
|
|
|
|
|
};
|
|
|
|
|
|
2021-11-08 22:58:37 +01:00
|
|
|
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) {}
|
2021-11-08 22:58:37 +01:00
|
|
|
|
|
|
|
|
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
|
|
|
};
|
|
|
|
|
|
2021-11-08 22:58:37 +01: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();
|
2021-11-08 22:58:37 +01:00
|
|
|
for (size_t i = 0; i < length; i++)
|
|
|
|
|
toP[i] = fromP[i];
|
2013-10-08 22:29:21 -04:00
|
|
|
return toReturn;
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-08 22:58:37 +01:00
|
|
|
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();
|
2021-11-08 22:58:37 +01:00
|
|
|
for (size_t i = 0; i < len; i++)
|
|
|
|
|
toP[i] = fromP[i];
|
2013-10-08 22:29:21 -04:00
|
|
|
return toReturn;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-09 14:42:13 -04:00
|
|
|
#endif
|