## go-geometry

go-geometry

## Synopsis

    #define             GO_GEOMETRY_ANGLE_TOLERANCE
    enum                GOGeometrySide;
    enum                GODirection;
    enum                GOGeometryRotationType;
                        GOGeometryOBR;
    #define             GOGeometryAABR
    void                go_geometry_cartesian_to_polar      (double x,
                                                             double y,
                                                             double *rho,
                                                             double *theta);
    double              go_geometry_point_to_segment        (double xp,
                                                             double yp,
                                                             double xs,
                                                             double ys,
                                                             double w,
                                                             double h);
    void                go_geometry_AABR_add                (GOGeometryAABR *aabr0,
                                                             GOGeometryAABR const *aabr1);
    void                go_geometry_OBR_to_AABR             (GOGeometryOBR const *obr,
                                                             GOGeometryAABR *aabr);
    gboolean            go_geometry_test_OBR_overlap        (GOGeometryOBR const *obr0,
                                                             GOGeometryOBR const *obr1);
    GOGeometryRotationType go_geometry_get_rotation_type    (double alpha);
    GOGeometrySide      go_geometry_calc_label_anchor       (GOGeometryOBR *obr,
                                                             double alpha);
    GOGeometrySide      go_geometry_calc_label_position     (GOGeometryOBR *obr,
                                                             double alpha,
                                                             double offset,
                                                             GOGeometrySide side,
                                                             GOGeometrySide anchor);
    #define             GO_DIRECTION_TYPE
    GType               go_direction_get_type               (void);
    gboolean            go_direction_is_horizontal          (GODirection d);
    gboolean            go_direction_is_forward             (GODirection d);

## Description

## Details

### GO_GEOMETRY_ANGLE_TOLERANCE

    #define GO_GEOMETRY_ANGLE_TOLERANCE 1E-3

### enum GOGeometrySide

    typedef enum {
    	GO_SIDE_LEFT		= 1 << 0,
    	GO_SIDE_RIGHT		= 1 << 1,
    	GO_SIDE_LEFT_RIGHT	= 3 << 0,
    	GO_SIDE_TOP		= 1 << 2,
    	GO_SIDE_BOTTOM		= 1 << 3,
    	GO_SIDE_TOP_BOTTOM	= 3 << 2,
    	GO_SIDE_AUTO		= 15
    } GOGeometrySide;

### enum GODirection

    typedef enum {
    	GO_DIRECTION_UP    = 0,
    	GO_DIRECTION_DOWN  = 1,
    	GO_DIRECTION_LEFT  = 2,
    	GO_DIRECTION_RIGHT = 3,
    	GO_DIRECTION_NONE  = 4
    } GODirection;

### enum GOGeometryRotationType

    typedef enum {
    	GO_ROTATE_NONE = 0,
    	GO_ROTATE_COUNTERCLOCKWISE = 1,
    	GO_ROTATE_UPSIDEDOWN = 2,
    	GO_ROTATE_CLOCKWISE = 3,
    	GO_ROTATE_FREE = 4
    } GOGeometryRotationType;

### GOGeometryOBR

    typedef struct {
            double x,y;     /* Center */
            double w,h;     /* Edges */
            double alpha;   /* Angle from x axis to w edge, in radians */
    } GOGeometryOBR;

### GOGeometryAABR

    #define GOGeometryAABR GogViewAllocation /* x, y: top left corner */

### go_geometry_cartesian_to_polar ()

    void                go_geometry_cartesian_to_polar      (double x,
                                                             double y,
                                                             double *rho,
                                                             double *theta);

Converts cartesion coordinates to polar coordinates.

`x` : | cartesian coordinate
`y` : | cartesian coordinate
`rho` : | polar coordinate
`theta` : | polar coordinate

### go_geometry_point_to_segment ()

    double              go_geometry_point_to_segment        (double xp,
                                                             double yp,
                                                             double xs,
                                                             double ys,
                                                             double w,
                                                             double h);

Computes the distance between a point and a segment.

`xp` : | point coordinate
`yp` : | point coordinate
`xs` : | segment start coordinate
`ys` : | segment start coordinate
`w` : | extent of segment
`h` : | extent of segment
Returns : |

### go_geometry_AABR_add ()

    void                go_geometry_AABR_add                (GOGeometryAABR *aabr0,
                                                             GOGeometryAABR const *aabr1);

Computes the Axis Aligned Bounding Rectangle of aabr0 and aabr1, and stores result in aabr0.

`aabr0` : | a GOGeometryAABR
`aabr1` : | a GOGeometryAABR

### go_geometry_OBR_to_AABR ()

    void                go_geometry_OBR_to_AABR             (GOGeometryOBR const *obr,
                                                             GOGeometryAABR *aabr);

Stores Axis Aligned Bouding Rectangle of `obr` in `aabr`.

`obr` : | a GOGeometryOBR
`aabr` : | a GOGeometryAABR

### go_geometry_test_OBR_overlap ()

    gboolean            go_geometry_test_OBR_overlap        (GOGeometryOBR const *obr0,
                                                             GOGeometryOBR const *obr1);

Overlap test of Oriented Bounding Rectangles by the separating axis method.

`obr0` : | a GOGeometryOBR
`obr1` : | a GOGeometryOBR
Returns : | `TRUE` if OOBRs overlap

### go_geometry_get_rotation_type ()

    GOGeometryRotationType go_geometry_get_rotation_type    (double alpha);

Calculates rotation type for handling of special angles (alpha = n * pi / 2)

`alpha` : | angle in radians
Returns : | a GOGeometryRotationType

### go_geometry_calc_label_anchor ()

    GOGeometrySide      go_geometry_calc_label_anchor       (GOGeometryOBR *obr,
                                                             double alpha);

`obr` : | bounding rectangle of label
`alpha` : | angle of axis
Returns : | computed label anchor, to be used by go_geometry_calc_label_position.

### go_geometry_calc_label_position ()

    GOGeometrySide      go_geometry_calc_label_position     (GOGeometryOBR *obr,
                                                             double alpha,
                                                             double offset,
                                                             GOGeometrySide side,
                                                             GOGeometrySide anchor);

Convenience routine that computes position of a label relative to an axis.

`obr` : | bounding rectangle of label
`alpha` : | angle of axis
`offset` : | minimum distance between label and axis
`side` : | side of label with respect to axis
`anchor` : | where to anchor the label
Returns : | the computed anchor if `anchor` == GO_SIDE_AUTO, or `anchor` value.

### GO_DIRECTION_TYPE

    #define  GO_DIRECTION_TYPE (go_direction_get_type())

### go_direction_get_type ()

    GType               go_direction_get_type               (void);

Returns : |

### go_direction_is_horizontal ()

    gboolean            go_direction_is_horizontal          (GODirection d);

`d` : | GODirection
Returns : | TRUE for GO_DIRECTION_LEFT and GO_DIRECTION_RIGHT.

### go_direction_is_forward ()

    gboolean            go_direction_is_forward             (GODirection d);

`d` : | GODirection
Returns : | TRUE for GO_DIRECTION_DOWN or GO_DIRECTION_RIGHT.