## GoGeometry

GoGeometry —

## Synopsis

    #include <goffice/graph/go-geometry.h>

    #define     GO_GEOMETRY_ANGLE_TOLERANCE
    enum        GOGeometrySide;
    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);
    void        go_geometry_calc_label_position (GOGeometryOBR *obr,
                                                 double alpha,
                                                 double offset,
                                                 GOGeometrySide side);

## Description

## Details

### GO_GEOMETRY_ANGLE_TOLERANCE

    #define GO_GEOMETRY_ANGLE_TOLERANCE 1E-3

### enum GOGeometrySide

    typedef enum {
    	GO_SIDE_LEFT,
    	GO_SIDE_RIGHT
    } GOGeometrySide;

### 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);

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

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

### go_geometry_calc_label_position ()

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

`obr` : |
`alpha` : |
`offset` : |
`side` : |