func (p Point) CellUnionBound() []CellID {
	return p.CapBound().CellUnionBound()
}
CellUnionBound computes a covering of the Point.
package s2
import (
	"fmt"
	"io"
	"math"
	"sort"
	"github.com/golang/geo/r3"
	"github.com/golang/geo/s1"
)
type Point struct {
	r3.Vector
}
func sortPoints(e []Point) {
	sort.Sort(points(e))
}
type points []Point
func (p points) Len() int           { return len(p) }
func (p points) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
func (p points) Less(i, j int) bool { return p[i].Cmp(p[j].Vector) == -1 }
func PointFromCoords(x, y, z float64) Point {
	if x == 0 && y == 0 && z == 0 {
		return OriginPoint()
	}
	return Point{r3.Vector{x, y, z}.Normalize()}
}
func OriginPoint() Point {
	return Point{r3.Vector{-0.0099994664350250197, 0.0025924542609324121, 0.99994664350250195}}
}
func (p Point) PointCross(op Point) Point {
	x := p.Add(op.Vector).Cross(op.Sub(p.Vector))
	if x == (r3.Vector{}) {
		return Point{p.Ortho()}
	}
	return Point{x}
}
func OrderedCCW(a, b, c, o Point) bool {
	sum := 0
	if RobustSign(b, o, a) != Clockwise {
		sum++
	}
	if RobustSign(c, o, b) != Clockwise {
		sum++
	}
	if RobustSign(a, o, c) == CounterClockwise {
		sum++
	}
	return sum >= 2
}
func (p Point) Distance(b Point) s1.Angle {
	return p.Vector.Angle(b.Vector)
}
func (p Point) ApproxEqual(other Point) bool {
	return p.approxEqual(other, s1.Angle(epsilon))
}
func (p Point) approxEqual(other Point, eps s1.Angle) bool {
	return p.Vector.Angle(other.Vector) <= eps
}
func ChordAngleBetweenPoints(x, y Point) s1.ChordAngle {
	return s1.ChordAngle(math.Min(4.0, x.Sub(y.Vector).Norm2()))
}
func regularPoints(center Point, radius s1.Angle, numVertices int) []Point {
	return regularPointsForFrame(getFrame(center), radius, numVertices)
}
func regularPointsForFrame(frame matrix3x3, radius s1.Angle, numVertices int) []Point {
	z := math.Cos(radius.Radians())
	r := math.Sin(radius.Radians())
	radianStep := 2 * math.Pi / float64(numVertices)
	var vertices []Point
	for i := 0; i < numVertices; i++ {
		angle := float64(i) * radianStep
		p := Point{r3.Vector{r * math.Cos(angle), r * math.Sin(angle), z}}
		vertices = append(vertices, Point{fromFrame(frame, p).Normalize()})
	}
	return vertices
}
func (p Point) CapBound() Cap {
	return CapFromPoint(p)
}
func (p Point) RectBound() Rect {
	return RectFromLatLng(LatLngFromPoint(p))
}
func (p Point) ContainsCell(c Cell) bool { return false }
func (p Point) IntersectsCell(c Cell) bool {
	return c.ContainsPoint(p)
}
func (p Point) ContainsPoint(other Point) bool {
	return p.Contains(other)
}