Interface margins and axes bounds properties.
[scilab.git] / scilab / modules / graphics / includes / math_graphics.h
1 /*------------------------------------------------------------------------
2  *    Graphic library
3  *    Copyright (C) 1998-2000 Enpc
4  *    Copyright INRIA 2006
5  *    Authors : Jean-Philippe Chancelier, Jean-Baptiste Silvy
6  --------------------------------------------------------------------------*/
7
8 #ifndef __SCIMATH_H__
9 #define __SCIMATH_H__
10 #include <limits.h>
11 #include <math.h>
12 #include "machine.h"
13
14 #include <stdlib.h>
15
16
17
18
19 #ifdef _MSC_VER 
20                 #include <float.h>
21                 #define finite(x) _finite(x) 
22 #else  /* _MSC_VER */ 
23         /** This should only be provided when finite prototype is missing **/
24         /** XXX : to be tested **/
25         #ifndef __cplusplus
26         int finite __PARAMS((double));
27         #endif
28 #endif /* _MSC_VER */
29
30 #ifdef _MSC_VER 
31         #include <float.h>
32         #define ISNAN(x) _isnan(x)
33 #else 
34         #define ISNAN(x) isnan(x)
35 #endif 
36
37 #define Abs(x) ( ( (x) >= 0) ? (x) : -( x) )
38 #ifndef Min
39 #define Min(x,y)        (((x)<(y))?(x):(y))
40 #endif 
41
42 #ifndef Max 
43 #define Max(x,y)        (((x)>(y))?(x):(y))
44 #endif
45
46 #define PI0 (integer *) 0
47 #define PD0 (double *) 0
48 #define SMDOUBLE 1.e-200 /* Smalest number to avoid dividing by zero */
49
50 /* angle conversion */
51 #define PI_OVER_180  0.01745329251994329576913914624236578987393
52 #define _180_OVER_PI 57.29577951308232087665461840231273527024
53 #define DEG2RAD(x) ((x) * PI_OVER_180  )
54 #define RAD2DEG(x) ((x) * _180_OVER_PI )
55
56 #define         round(a)        (int)(((a)<0.0)?(a)-.5:(a)+.5)
57 #define EPSILON 1.0e-13
58
59 #define linint(x) ((integer) floor(x + 0.5 )) 
60 #define inint(x) ((int) floor(x + 0.5 ))  
61
62 /* XWindow function arguments can be  int16 or unsigned16 */
63
64 #define SCIINT16   short
65 #define INT16MAX   SHRT_MAX
66 #define INT16MIN   SHRT_MIN
67 #define int16max   0x7FFF
68 #define uns16max   0xFFFF
69
70 #if (defined(sun) && defined(SYSV)) 
71 #include <ieeefp.h>
72 #endif
73
74 #if defined(_MSC_VER)
75   #define M_PI 3.14159265358979323846
76 #else
77   #if defined(HAVE_VALUES_H)
78     #include <values.h>
79   #else
80     #if defined(HAVE_LIMITS_H)
81      #include <limits.h>
82     #endif
83   #endif
84 #endif
85
86 #ifndef M_PI
87 #define M_PI 3.14159265358979323846 
88 #endif
89
90 double Mini(double *vect, integer n) ;
91
92 double Maxi(double *vect,integer n) ;
93
94 extern double exp10 __PARAMS((double));
95
96 /* prototypes */
97
98 /*----------------------------------------------------------------------------*/
99 /************************************************************************/
100 /* 2D algorithms                                                        */
101 /************************************************************************/
102 /* perform the rotation of point from to point dest with angle in radian  */
103 void rotate2D( double from[2], double center[2], double angle, double dest[2] ) ;
104
105 /* perform the rotation of point from to point to. */
106 /* the angle is directly given with its sine and cosine for speed */
107 void rotate2Dim( double from[2]   ,
108                  double center[2] ,
109                  double cosAngle  ,
110                  double sinAngle  ,
111                  double dest[2]    ) ;
112
113 /* perform the rotation of point from to point dest given in int with angle in radian  */
114 void iRotate2D( int from[2], int center[2], double angle, int dest[2] ) ;
115
116 /* perform the rotation of point from to point dest given in int. */
117 /* the angle is directly given with its sine and cosine for speed */
118 void iRotate2Dim( int    from[2]   ,
119                   int    center[2] ,
120                   double cosAngle  ,
121                   double sinAngle  ,
122                   int    dest[2]    ) ;
123
124 /* perform an homethety point from to point dest. The 2 factors stand for the ration */
125 /* along the 2 coordinates */
126 void homothety2D( double from[2], double center[2], double factors[2], double dest[2] ) ;
127
128 /* perform an homethety point from to point dest given in pixels. */
129 /* The 2 factors stand for the ration along the 2 coordinates */
130 void iHomothety2D( int from[2], int center[2], double factors[2], int dest[2] ) ;
131
132
133 /* perform the translation of point from to point dest with vector trans */
134 void translate2D( double from[2], double trans[2], double dest[2] ) ;
135
136 /* perform the translation of point from to point dest with vector trans given in pixels.*/
137 void iTranslate2D( int from[2], int trans[2], int dest[2] ) ;
138
139 /**
140  * Normalize a 2d vector.
141  */
142 void normalize2d( double vect[2] ) ;
143
144 /**
145  * Normalize a 2d vector in pixels coordinates.
146  */
147 void iNormalize2d( int vect[2] ) ;
148
149 /**
150  * return the scalar product of two 2d vectors.
151  */
152 #define DOT_PROD_2D(v1,v2) ( ((v1)[0]) * ((v2)[0]) + ((v1)[1]) * ((v2)[1]) )
153
154 /**
155  * Norm of a 2D vector
156  */
157 #define NORM_2D(v) ( sqrt( DOT_PROD_2D((v),(v)) ) ) ;
158
159 /************************************************************************/
160 /* 3D algorithms                                                        */
161 /************************************************************************/
162
163 /**
164  * Scalar product of 2 vectors in 3D
165  */
166 #define DOT_PROD_3D(v1,v2) ( ((v1)[0]) * ((v2)[0]) + ((v1)[1]) * ((v2)[1]) + ((v1)[2]) * ((v2)[2]) )
167
168 /**
169 * Norm of a 3D vector
170 */
171 #define NORM_3D(v) ( sqrt( DOT_PROD_3D((v),(v)) ) ) ;
172
173 /*----------------------------------------------------------------------------*/
174
175 /*----------------------------------------------------------------------------*/
176 /* check if two values can be considered equal given an accurracy */
177 int safeEqual( double val1, double val2, double accuracy ) ;
178
179 /* with a macro it is faster */
180 /* the x == y test is put to avoid division by 0 */
181 #define SAFE_EQUAL(x,y,acc) ( (x) == (y) ) || ( Abs( (x) - (y) ) < (acc) * Max( Abs( (x) ), Abs( (y) ) ) )
182
183 /* test if a value if lesser than an other or just sligthy greater */
184 #define SAFE_LT(x,y,acc) ( (x) == (y) || ( (x) - (y) ) < (acc) * Max( Abs( (x) ), Abs( (y) ) ) )
185 #define SAFE_GT(x,y,acc) ( (x) == (y) || ( (y) - (x) ) < (acc) * Max( Abs( (x) ), Abs( (y) ) ) )
186 /*----------------------------------------------------------------------------*/
187
188 /*----------------------------------------------------------------------------*/
189 /* truncate an integer to a 16 bits integer. Overflow value are truncated to the min */
190 /* and max of 16 bits integer. */
191 #define INT_2_16B(i) ( (i) > INT16MAX ? (INT16MAX) : ( (i) < INT16MIN ? INT16MIN : ((SCIINT16) i)) )
192 /*----------------------------------------------------------------------------*/
193
194 /*----------------------------------------------------------------------------*/
195 /* truncate an integer to a char. Overflow value are truncated to the min */
196 /* and max of char integer. */
197 #define INT_2_UCHAR(i) ( (i) > UCHAR_MAX ? (UCHAR_MAX) : ( (i) < 0  ? 0 : ((char) i)) )
198 /*----------------------------------------------------------------------------*/
199
200 /*----------------------------------------------------------------------------*/
201 /* truncate a float or double to an int. Overflow value are truncated to the min */
202 /* and max of 32 bits integer. */
203 #define FLOAT_2_INT(f) ( (f) > INT_MAX ? (INT_MAX) : ( (f) < INT_MIN ? (INT_MIN) : ( inint( f ) ) ) )
204 /*----------------------------------------------------------------------------*/
205
206 /*----------------------------------------------------------------------------*/
207 /* return the number of digits of a positive integer (ie for 10236 it is 5 )  */
208 /* the added 0.5 is to avoid trouble with 10^i which could become 9.999999999 */
209 #define GET_NB_DIGITS(i) ( (i) == 0 ? 1 : ((int) floor( log10( (i) + 0.5 ) ) ) + 1 )
210 /*----------------------------------------------------------------------------*/
211
212
213
214
215
216 #endif /* SCI_MATH.HG */
217