These functions create a unit object describing a location somewhere on the boundary of a grob. They are generic.

```
grobX(x, theta)
grobY(x, theta)
```

x

A grob, or gList, or gTree, or gPath.

theta

An angle indicating where the location is
on the grob boundary. Can be one of `"east"`

,
`"north"`

, `"west"`

, or `"south"`

,
which correspond to angles 0, 90, 180, and 270,
respectively.

A unit object.

The angle is anti-clockwise with zero corresponding to a line with an origin centred between the extreme points of the shape, and pointing at 3 o'clock.

If the grob describes a single shape, the boundary value should correspond to the exact edge of the shape.

If the grob describes multiple shapes, the boundary value will either correspond to the edge of a bounding box around all of the shapes described by the grob (for multiple rectangles, circles, xsplines, or text), or to a convex hull around all vertices of all shapes described by the grob (for multiple polygons, points, lines, polylines, and segments).

Points grobs are currently a special case because the convex hull
is based on the data symbol *locations* and does not take
into account the extent of the data symbols themselves.

The extents of any arrow heads are currently *not* taken into account.