/*********************************************************************** * GNU Lesser General Public License * * This file is part of the GFDL Flexible Modeling System (FMS). * * FMS is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * FMS is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FMS. If not, see . **********************************************************************/ /*********************************************************************** mosaic_util.h This header file provide some utilities routine that will be used in many tools. contact: Zhi.Liang@noaa.gov ***********************************************************************/ #ifndef MOSAIC_UTIL_H_ #define MOSAIC_UTIL_H_ #ifndef RANGE_CHECK_CRITERIA #define RANGE_CHECK_CRITERIA 0.05 #endif #define min(a,b) (ab ? a:b) #define SMALL_VALUE ( 1.e-10 ) struct Node{ double x, y, z, u, u_clip; int intersect; /* indicate if this point is an intersection, 0 = no, 1= yes, 2=both intersect and vertices */ int inbound; /* -1 uninitialized, 0 coincident, 1 outbound, 2 inbound */ int initialized; /* = 0 means empty list */ int isInside; /* = 1 means one point is inside the other polygon, 0 is not, -1 undecided. */ int subj_index; /* the index of subject point that an intersection follow. */ int clip_index; /* the index of clip point that an intersection follow */ struct Node *Next; }; void error_handler(const char *msg); int nearest_index(double value, const double *array, int ia); int lon_fix(double *x, double *y, int n_in, double tlon); double minval_double(int size, const double *data); double maxval_double(int size, const double *data); double avgval_double(int size, const double *data); void latlon2xyz(int size, const double *lon, const double *lat, double *x, double *y, double *z); void xyz2latlon(int size, const double *x, const double *y, const double *z, double *lon, double *lat); double box_area(double ll_lon, double ll_lat, double ur_lon, double ur_lat); double poly_area(const double lon[], const double lat[], int n); int delete_vtx(double x[], double y[], int n, int n_del); int insert_vtx(double x[], double y[], int n, int n_ins, double lon_in, double lat_in); double poly_area_dimensionless(const double lon[], const double lat[], int n); double poly_area_no_adjust(const double x[], const double y[], int n); int fix_lon(double lon[], double lat[], int n, double tlon); void tokenize(const char * const string, const char *tokens, unsigned int varlen, unsigned int maxvar, char * pstring, unsigned int * const nstr); double great_circle_distance(double *p1, double *p2); double spherical_excess_area(const double* p_ll, const double* p_ul, const double* p_lr, const double* p_ur, double radius); void vect_cross(const double *p1, const double *p2, double *e ); double spherical_angle(const double *v1, const double *v2, const double *v3); void normalize_vect(double *e); void unit_vect_latlon(int size, const double *lon, const double *lat, double *vlon, double *vlat); double great_circle_area(int n, const double *x, const double *y, const double *z); double * cross(const double *p1, const double *p2); double dot(const double *p1, const double *p2); int intersect_tri_with_line(const double *plane, const double *l1, const double *l2, double *p, double *t); int invert_matrix_3x3(long double m[], long double m_inv[]); void mult(long double m[], long double v[], long double out_v[]); double metric(const double *p); int insidePolygon(struct Node *node, struct Node *list ); int inside_a_polygon( double *lon1, double *lat1, int *npts, double *lon2, double *lat2); void rewindList(void); struct Node *getNext(); void initNode(struct Node *node); void addEnd(struct Node *list, double x, double y, double z, int intersect, double u, int inbound, int inside); int addIntersect(struct Node *list, double x, double y, double z, int intersect, double u1, double u2, int inbound, int is1, int ie1, int is2, int ie2); int length(struct Node *list); int samePoint(double x1, double y1, double z1, double x2, double y2, double z2); int sameNode(struct Node node1, struct Node node2); void addNode(struct Node *list, struct Node nodeIn); struct Node *getNode(struct Node *list, struct Node inNode); struct Node *getNextNode(struct Node *list); void copyNode(struct Node *node_out, struct Node node_in); void printNode(struct Node *list, char *str); int intersectInList(struct Node *list, double x, double y, double z); void insertIntersect(struct Node *list, double x, double y, double z, double u1, double u2, int inbound, double x2, double y2, double z2); void insertAfter(struct Node *list, double x, double y, double z, int intersect, double u, int inbound, double x2, double y2, double z2); double gridArea(struct Node *grid); int isIntersect(struct Node node); int getInbound( struct Node node ); struct Node *getLast(struct Node *list); int getFirstInbound( struct Node *list, struct Node *nodeOut); void getCoordinate(struct Node node, double *x, double *y, double *z); void getCoordinates(struct Node *node, double *p); void setCoordinate(struct Node *node, double x, double y, double z); void setInbound(struct Node *interList, struct Node *list); int isInside(struct Node *node); void set_reproduce_siena_true(void); #ifndef __AIX void set_reproduce_siena_true_(void); int inside_a_polygon_(double *lon1, double *lat1, int *npts, double *lon2, double *lat2); #endif #endif