00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _PFSGeo_h
00022 #define _PFSGeo_h
00023
00024
00025
00026
00027
00028
00029 typedef struct _PFSGeoPoint { double x, y, z ; } PFSGeoPoint ;
00030
00031 typedef struct _PFSGeoLine { PFSGeoPoint d, e ; } PFSGeoLine ;
00032
00033 typedef struct _PFSGeoPlane { PFSGeoPoint a, b, c ; } PFSGeoPlane ;
00034
00035 typedef struct _PFSGeoNormPlane { PFSGeoPoint a, u,
00036 v, n ; } PFSGeoNormPlane ;
00037
00038 typedef struct _PFSGeoPoly { PFSGeoNormPlane nplane ;
00039 int n_verts; PFSGeoPoint *verts ; } PFSGeoPoly ;
00040
00041 typedef struct _PFSGeoPlanEqn { double a, b, c, d ; } PFSGeoPlanEqn ;
00042
00043 typedef struct _PFSGeoSurfPoint { double x, y, z ;
00044 double xn, yn, zn ; } PFSGeoSurfPoint ;
00045
00046 typedef double PFSGeoPointPar ;
00047
00048 typedef struct _PFSGeoSurfPar { double u, v ; } PFSGeoSurfPar ;
00049
00050 typedef enum _PFSGeoStatus { PFSGeoInvalid, PFSGeoValid } PFSGeoStatus ;
00051
00052 typedef enum _PFSGeoPredicate { PFSGeoFalse, PFSGeoTrue } PFSGeoPredicate ;
00053
00054 typedef enum _PFSGeoPtTest { PFSGeoAbove,
00055 PFSGeoOn,
00056 PFSGeoBelow } PFSGeoPtTest ;
00057
00058
00059
00060
00061
00062 #ifdef __cplusplus
00063 extern "C" {
00064 #endif
00065
00066 void PFSGeoSetTolerance( double tol );
00067 double PFSGeoGetTolerance( void );
00068
00069 PFSGeoPredicate PFSGeoIntscPolyLine ( PFSGeoSurfPar *line, PFSGeoSurfPar *spar ) ;
00070 PFSGeoPredicate PFSGeoIsInsidePoly ( PFSGeoPoly *poly, PFSGeoSurfPar *spar ) ;
00071 PFSGeoPredicate PFSGeoIsOnPolyBdry ( PFSGeoPoly *poly, PFSGeoPoint *pt );
00072
00073 void PFSGeoGenLine ( PFSGeoPoint *pt0, PFSGeoPoint *pt1, PFSGeoLine *line ) ;
00074 void PFSGeoGenPlane ( PFSGeoPoint *pt0, PFSGeoPoint *pt1, PFSGeoPoint *pt2,
00075 PFSGeoPlane *plane ) ;
00076 void PFSGeoGenPlanEqn( PFSGeoPoint *pt0, PFSGeoPoint *pt1, PFSGeoPoint *pt2,
00077 PFSGeoPlanEqn *plan_eqn ) ;
00078
00079 PFSGeoStatus PFSGeoGenPoly ( int *n_verts, PFSGeoPoint *verts, PFSGeoNormPlane *plane ) ;
00080
00081 void PFSGeoEvalLine ( PFSGeoPointPar *par, PFSGeoLine *line, PFSGeoPoint *pt ) ;
00082 void PFSGeoEvalPlane ( PFSGeoSurfPar *par, PFSGeoPlane *pln, PFSGeoPoint *pt ) ;
00083
00084 double PFSGeoDotProd ( PFSGeoPoint *in0, PFSGeoPoint *in1 ) ;
00085 void PFSGeoCrossProd ( PFSGeoPoint *in0, PFSGeoPoint *in1, PFSGeoPoint *out ) ;
00086 double PFSGeoTripleProd ( PFSGeoPoint *in0, PFSGeoPoint *in1, PFSGeoPoint *in2 ) ;
00087 double PFSGeoVecLen ( PFSGeoPoint *vec ) ;
00088 void PFSGeoVecNormalize ( PFSGeoPoint *vec, PFSGeoPoint *n ) ;
00089 double PFSGeoDist ( PFSGeoPoint *in0, PFSGeoPoint *in1 ) ;
00090 PFSGeoPredicate PFSGeoNullVec ( PFSGeoPoint *vec, double *tolerance ) ;
00091
00092 void PFSGeoDiffVec( PFSGeoPoint *in0, PFSGeoPoint *in1, PFSGeoPoint *out );
00093 void PFSGeoSumVec( PFSGeoPoint *in0, PFSGeoPoint *in1, PFSGeoPoint *out );
00094 void PFSGeoProdScalVec( PFSGeoPoint *in, double *csi, PFSGeoPoint *out );
00095 void PFSGeoLinCombVec( PFSGeoPoint *in0, double *csi0, PFSGeoPoint *in1, double *csi1,
00096 PFSGeoPoint *out );
00097
00098 void PFSGeoRotateX ( double *angle, PFSGeoPoint *in, PFSGeoPoint *out ) ;
00099 void PFSGeoRotateY ( double *angle, PFSGeoPoint *in, PFSGeoPoint *out ) ;
00100 void PFSGeoRotateZ ( double *angle, PFSGeoPoint *in, PFSGeoPoint *out ) ;
00101 void PFSGeoRotateAxis ( PFSGeoPoint *axis, double *angle,
00102 PFSGeoPoint *in, PFSGeoPoint *out ) ;
00103
00104 PFSGeoStatus PFSGeoIntscLinePlane ( PFSGeoLine *line, PFSGeoPlane *plane,
00105 PFSGeoPoint *pt, PFSGeoPointPar *ptpar,
00106 PFSGeoSurfPar *spar ) ;
00107 PFSGeoStatus PFSGeoIntscLinePoly ( PFSGeoLine *line, PFSGeoPoly *poly,
00108 PFSGeoPoint *pt, PFSGeoPointPar *ptpar,
00109 PFSGeoSurfPar *spar ) ;
00110
00111 PFSGeoStatus PFSGeoPolyNormal ( int *n_verts, PFSGeoPoint *verts, PFSGeoPoint *norm ) ;
00112
00113 PFSGeoStatus PFSGeoLstSqrPlanEqn( int *num_pts, PFSGeoPoint *pts,
00114 PFSGeoPlanEqn *plan_eqn ) ;
00115
00116 void PFSGeoClstPtLine ( PFSGeoLine *line, PFSGeoPoint *pt, PFSGeoPoint *clst,
00117 PFSGeoPointPar *par ) ;
00118 void PFSGeoClstPtNormPlane ( PFSGeoNormPlane *plane, PFSGeoPoint *pt,
00119 PFSGeoPoint *clst, PFSGeoSurfPar *spar ) ;
00120 PFSGeoStatus PFSGeoClstPtPoly ( PFSGeoPoly *poly, PFSGeoPoint *pt,
00121 PFSGeoPoint *clst, PFSGeoSurfPar *spar ) ;
00122
00123 PFSGeoPredicate PFSGeoIsOnPlane( PFSGeoPoint *pt, PFSGeoNormPlane *pla ) ;
00124
00125 PFSGeoStatus PFSGeoInvert2x2 ( double a[2][2], double b[2][2] ) ;
00126 PFSGeoStatus PFSGeoInvert3x3 ( double a[3][3], double b[3][3] ) ;
00127 PFSGeoStatus PFSGeodInvert3x3 ( double a[3][3], double b[3][3] ) ;
00128
00129 void PFSGeoCentroid( int *num_pts, PFSGeoPoint *pts, PFSGeoPoint *cntrd ) ;
00130
00131 PFSGeoStatus PFSGeoPerpLine ( PFSGeoLine *in0, PFSGeoLine *in1, PFSGeoLine *out,
00132 PFSGeoPointPar *par0, PFSGeoPointPar *par1,
00133 PFSGeoPointPar *parout ) ;
00134
00135 void PFSGeoPtNormToParPlan( PFSGeoPoint *pt, PFSGeoPoint *normal, PFSGeoNormPlane *plane ) ;
00136
00137 void PFSGeoPlanToNormPlan( PFSGeoPlane *plane, PFSGeoNormPlane *normplane );
00138 PFSGeoStatus PFSGeo3PointsToNormPlane( PFSGeoPoint *in0, PFSGeoPoint *in1,
00139 PFSGeoPoint *in2, PFSGeoNormPlane *plane );
00140
00141 void PFSGeoPlanEqnToParPlan( PFSGeoPlanEqn *plan_eqn, PFSGeoNormPlane *plane ) ;
00142
00143 PFSGeoPtTest PFSGeoSideofPlan( PFSGeoPlanEqn *plan_eqn, PFSGeoPoint *pt ) ;
00144
00145 void PFSGeoSurfInterp( int *num_pts, double *map_func,PFSGeoSurfPar *pts_val,
00146 PFSGeoSurfPar *interp_val ) ;
00147
00148 void PFSGeoSurfJacob( int *num_pts, double *map_deriv_s, double *map_deriv_t,
00149 PFSGeoSurfPar *pts_val, double jac[2][2] ) ;
00150
00151 double PFSGeoAngVecAboutLine( PFSGeoLine *l, PFSGeoPoint *v0, PFSGeoPoint *v1 ) ;
00152 double PFSGeoAngPtAboutLine ( PFSGeoLine *l, PFSGeoPoint *p0, PFSGeoPoint *p1 ) ;
00153 double PFSGeoAngPtAboutPt( PFSGeoPoint *pivot, PFSGeoPoint *p0, PFSGeoPoint *p1 ) ;
00154
00155 PFSGeoStatus PFSGeoProjVecPlane( PFSGeoPoint *vec, PFSGeoPlane *plane, PFSGeoPoint *proj ) ;
00156 double PFSGeoDistPtNormPlane( PFSGeoNormPlane *plane, PFSGeoPoint *pt );
00157
00158 #ifdef __cplusplus
00159 }
00160 #endif
00161
00162 #endif