`Gg.P2`

2D points.

`type t = p2`

The type for points.

`dim`

is the dimension of points of type `p2`

.

`type mh = m3`

The type for matrices representing linear transformations of *homogenous* 2D space.

`val v : float -> float -> p2`

`v x y`

is the point `(x y)`

.

`val x : p2 -> float`

`x p`

is the x coordinate of `p`

.

`val y : p2 -> float`

`y p`

is the y coordinate of `p`

.

`val o : p2`

`o`

is the point `(0 0)`

.

`tr m p`

is the affine transform in homogenous 2D space of the *point* `p`

by `m`

.

**Note.** Since `m`

is supposed to be affine the function ignores the last row of `m`

. `p`

is treated as a finite point (its last coordinate in homogenous space is 1). Use `V2.tr`

to transform vectors (infinite points).

`orient p q r`

is:

`> 0.`

if the sequence`p`

,`q`

,`r`

is in counterclockwise order.`r`

is on the left of the line`pq`

.`< 0.`

if the sequence`p`

,`q`

,`r`

is in clockwise order.`r`

is on the right of line`pq`

.`= ±0.`

if`p`

,`q`

and`r`

are collinear.`r`

is on`pq`

.

This is a port of Jonathan Richard Shewchuk robust orientation predicate.

`orient_fast`

is like `orient`

but faster and less accurate.

The returned magnitude is the signed area of the parallelogram spanned by vectors `pr`

and `qr`

, which is twice the signed area of the triangle `pqr`

.

```
val seg_inter :
?eps2:float ->
p0:p2 ->
p1:p2 ->
q0:p2 ->
q1:p2 ->
unit ->
[ `None | `Pt of p2 | `Seg of p2 * p2 ]
```

`seg_inter ~p0 ~p1 ~q0 ~q1 ()`

is the intersection between segments `p0p1`

and `q0q1`

. This is:

``None`

if the segments do not intersect.``Pt i`

if they intersect on the single point`i`

.``Seg (i0, i1)`

if they intersect on the segment`i0i1`

.

`eps2`

is a squared relative epsilon. It is used as a threshold for testing the zeroness of the angle between the segments. Defaults to `1e-8`

.