14 template<
class Coordinate_,
unsigned D>
15 class Point:
public std::array<Coordinate_, D>
18 typedef Coordinate_ Coordinate;
19 typedef std::array<Coordinate, D> ArrayParent;
28 Point() {
for (
unsigned i = 0; i < D; ++i) (*
this)[i] = 0; }
29 Point(
const ArrayParent& a):
31 template<
class T> Point(
const Point<T, D>& p) {
for (
size_t i = 0; i < D; ++i) (*
this)[i] = p[i]; }
32 template<
class T> Point(
const T* a) {
for (
unsigned i = 0; i < D; ++i) (*
this)[i] = a[i]; }
33 template<
class T> Point(
const std::vector<T>& a) {
for (
unsigned i = 0; i < D; ++i) (*
this)[i] = a[i]; }
34 Point(std::initializer_list<Coordinate> lst) {
unsigned i = 0;
for (Coordinate x : lst) (*this)[i++] = x; }
36 Point(Point&&) =
default;
37 Point(
const Point&) =
default;
38 Point& operator=(
const Point&) =
default;
41 unsigned dimension() {
return D; }
43 static Point zero() {
return Point(); }
44 static Point one() { Point p;
for (
unsigned i = 0; i < D; ++i) p[i] = 1;
return p; }
46 LPoint drop(
int dim)
const { LPoint p;
unsigned c = 0;
for (
unsigned i = 0; i < D; ++i) {
if (i == dim)
continue; p[c++] = (*this)[i]; }
return p; }
47 UPoint lift(
int dim, Coordinate x)
const { UPoint p;
for (
unsigned i = 0; i < D+1; ++i) {
if (i < dim) p[i] = (*this)[i];
else if (i == dim) p[i] = x;
else if (i > dim) p[i] = (*this)[i-1]; }
return p; }
49 using ArrayParent::operator[];
51 Point& operator+=(
const Point& y) {
for (
unsigned i = 0; i < D; ++i) (*
this)[i] += y[i];
return *
this; }
52 Point& operator-=(
const Point& y) {
for (
unsigned i = 0; i < D; ++i) (*
this)[i] -= y[i];
return *
this; }
53 Point& operator*=(Coordinate a) {
for (
unsigned i = 0; i < D; ++i) (*
this)[i] *= a;
return *
this; }
54 Point& operator/=(Coordinate a) {
for (
unsigned i = 0; i < D; ++i) (*
this)[i] /= a;
return *
this; }
56 Coordinate norm()
const {
return (*
this)*(*this); }
58 std::ostream& operator<<(std::ostream& out)
const { out << (*this)[0];
for (
unsigned i = 1; i < D; ++i) out <<
" " << (*
this)[i];
return out; }
59 std::istream& operator>>(std::istream&
in);
62 Point operator+(Point x,
const Point& y) { x += y;
return x; }
65 Point operator-(Point x,
const Point& y) { x -= y;
return x; }
68 Point operator/(Point x, Coordinate y) { x /= y;
return x; }
71 Point operator*(Point x, Coordinate y) { x *= y;
return x; }
74 Point operator*(Coordinate y, Point x) { x *= y;
return x; }
77 Coordinate operator*(
const Point& x,
const Point& y) { Coordinate n = 0;
for (
size_t i = 0; i < D; ++i) n += x[i] * y[i];
return n; }
81 Coordinate operator*(
const Point<T,D>& x,
const Point& y) { Coordinate n = 0;
for (
size_t i = 0; i < D; ++i) n += x[i] * y[i];
return n; }
84 template<
class C,
unsigned D>
87 operator>>(std::istream&
in)
89 std::string point_str;
91 std::stringstream ps(point_str);
94 for (
unsigned i = 0; i < dimension(); ++i)
104 template<
class Coordinate,
unsigned D>
105 Coordinate norm2(
const Point<Coordinate,D>& p)
106 { Coordinate res = 0;
for (
unsigned i = 0; i < D; ++i) res += p[i]*p[i];
return res; }
108 template<
class C,
unsigned D>
110 operator<<(std::ostream& out, const Point<C,D>& p)
111 {
return p.operator<<(out); }
113 template<
class C,
unsigned D>
115 operator>>(std::istream& in, Point<C,D>& p)
116 {
return p.operator>>(
in); }
120 #endif // DIY_POINT_HPP
void in(const RegularLink< Bounds > &link, const Point &p, OutIter out, const Bounds &domain)
Finds the neighbor(s) containing the target point.
Definition: pick.hpp:102