#ifndef GEOMETRY_H_ #define GEOMETRY_H_ #include #define EDGE_NONE 0 #define EDGE_LEFT (1<<0) #define EDGE_RIGHT (1<<1) #define EDGE_TOP (1<<2) #define EDGE_BOTTOM (1<<3) #define EDGE_ALL (EDGE_LEFT|EDGE_RIGHT|EDGE_TOP|EDGE_BOTTOM) #define INTERSECTION_ERROR -1 #define INTERSECTION_NONE 0 #define INTERSECTION_IDENTICAL 1 #define INTERSECTION_LINE 2 #define INTERSECTION_LINE_LINE 2 #define INTERSECTION_LINE_SEGMENT 3 #define INTERSECTION_SEGMENT_LINE 6 #define INTERSECTION_SEGMENT_SEGMENT 7 typedef struct _VERTEX { double x, y; } VERTEX; typedef struct _RECTANGLE { double x, y, width, height; } RECTANGLE; typedef struct _LINE { VERTEX v1, v2; } LINE; typedef struct _VERTEX_LIST { unsigned int nVertices; VERTEX *vertices; } VERTEX_LIST, POLYGON; void addVertex(VERTEX_LIST *list, VERTEX *v); void insertVertex(VERTEX_LIST *list, VERTEX *v, unsigned int n); void deleteVertex(VERTEX_LIST *list, unsigned int n); double vertexDistanceSquare(const VERTEX *v1, const VERTEX *v2); double vertexDistance(const VERTEX *v1, const VERTEX *v2); int vertexInRect(const VERTEX *v, const RECTANGLE *rect); gboolean vertexInPolygon(const VERTEX *v, const POLYGON *p); double polygonPerimeter(const POLYGON *p); double polygonArea(const POLYGON *p); int lineIntersection(const LINE *la, const LINE *lb, VERTEX *v); int lineRectIntersection(const LINE *l, const RECTANGLE *rect, int edge, VERTEX *v); int lineRectIntersections(const LINE *line, const RECTANGLE *rect, int edge, VERTEX *v1, VERTEX *v2); gboolean linePolygonIntersection(const LINE *l, const POLYGON *p); void simplifyPolygon(const POLYGON *in, const RECTANGLE *rect, POLYGON *out); #endif /*GEOMETRY_H_*/