## CGAL::Point_d<Kernel>

### Definition

An instance of data type Point_d<Kernel> is a point of Euclidean space in dimension d. A point p = (p0,...,p d - 1 ) in d-dimensional space can be represented by homogeneous coordinates (h0,h1,...,hd) of number type RT such that pi = hi/hd, which is of type FT. The homogenizing coordinate hd is positive.

We call pi, 0 i < d the i-th Cartesian coordinate and hi, 0 i d, the i-th homogeneous coordinate. We call d the dimension of the point.

### Types

Point_d<Kernel>::RT
| the ring type.
Point_d<Kernel>::FT
| the field type.
Point_d<Kernel>::LA
| the linear algebra layer.
Point_d<Kernel>::Cartesian_const_iterator
| a read-only iterator for the Cartesian coordinates.
Point_d<Kernel>::Homogeneous_const_iterator
| a read-only iterator for the homogeneous coordinates.

### Creation

Point_d<Kernel> p;
| introduces a variable p of type Point_d<Kernel>.
Point_d<Kernel> p ( int d, Origin);
| introduces a variable p of type Point_d<Kernel> in d-dimensional space, initialized to the origin.
template <class InputIterator>
Point_d<Kernel> p ( int d, InputIterator first, InputIterator last);

introduces a variable p of type Point_d<Kernel> in dimension d. If size [first,last) == d this creates a point with Cartesian coordinates set [first,last). If size [first,last) == p+1 the range specifies the homogeneous coordinates H = set [first,last) = ( ± h0, ± h1, ..., ± hd) where the sign chosen is the sign of hd.
Precondition: d is nonnegative, [first,last) has d or d+1 elements where the last has to be non-zero.
Requirement: The value type of InputIterator is RT.

template <class InputIterator>
Point_d<Kernel> p ( int d, InputIterator first, InputIterator last, RT D);
| introduces a variable p of type Point_d<Kernel> in dimension d initialized to the point with homogeneous coordinates as defined by H = set [first,last) and D: ( ± H[0], ± H[1], ..., ± H[d-1], ± D). The sign chosen is the sign of D. Precondition: D is non-zero, the iterator range defines a d-tuple of RT. Requirement: The value type of InputIterator is RT.
Point_d<Kernel> p ( RT x, RT y, RT w = 1);
| introduces a variable p of type Point_d<Kernel> in 2-dimensional space. Precondition: w 0.
Point_d<Kernel> p ( RT x, RT y, RT z, RT w);
| introduces a variable p of type Point_d<Kernel> in 3-dimensional space. Precondition: w 0.

### Operations

int | p.dimension () | returns the dimension of p.
FT | p.cartesian ( int i)
|  | returns the i-th Cartesian coordinate of p. Precondition: 0 i < d.
FT | p [ int i] | returns the i-th Cartesian coordinate of p. Precondition: 0 i < d.
RT | p.homogeneous ( int i)
|  | returns the i-th homogeneous coordinate of p. Precondition: 0 i d.
Cartesian_const_iterator
| p.cartesian_begin ()
|  | returns an iterator pointing to the zeroth Cartesian coordinate p0 of p.
Cartesian_const_iterator
| p.cartesian_end () | returns an iterator pointing beyond the last Cartesian coordinate of p.
Homogeneous_const_iterator
| p.homogeneous_begin ()
|  | returns an iterator pointing to the zeroth homogeneous coordinate h0 of p.
Homogeneous_const_iterator
| p.homogeneous_end ()
|  | returns an iterator pointing beyond the last homogeneous coordinate of p.
Point_d<Kernel> | p.transform ( Aff_transformation_d<Kernel> t)
|  | returns t(p).

### Arithmetic Operators, Tests and IO

Vector_d<Kernel> | p - Origin o | returns the vector p-O.
Vector_d<Kernel> | p - q | returns p - q. Precondition: p.dimension() == q.dimension().
Point_d<Kernel> | p + Vector_d<Kernel> v
|  | returns p + v. Precondition: p.dimension() == v.dimension().
Point_d<Kernel> | p - Vector_d<Kernel> v
|  | returns p - v. Precondition: p.dimension() == v.dimension().
Point_d<Kernel>& | p += Vector_d<Kernel> v
|  | adds v to p. Precondition: p.dimension() == v.dimension().
Point_d<Kernel>& | p -= Vector_d<Kernel> v
|  | subtracts v from p. Precondition: p.dimension() == v.dimension().
bool | p == Origin | returns true if p is the origin.

### Downward compatibility

We provide operations of the lower dimensional interface x(), y(), z(), hx(), hy(), hz(), hw().

### Implementation

Points are implemented by arrays of RT items. All operations like creation, initialization, tests, point - vector arithmetic, input and output on a point p take time O(p.dimension()). dimension(), coordinate access and conversions take constant time. The space requirement for points is O(p.dimension()).