remove ref to VMS and others
[scilab.git] / scilab / modules / graphics / src / c / math_graphics.c
1 /*------------------------------------------------------------------------
2  *    Graphic library
3  *    Copyright (C) 1998-2001 Enpc/Jean-Philippe Chancelier
4  *    jpc@cermics.enpc.fr 
5  --------------------------------------------------------------------------*/
6
7 #include "math_graphics.h"
8
9 /* 
10  * we use spConfig.h for machine constants 
11  * XXX : spConfig should be merged and unified 
12  *       with other machine constant scilab code 
13  */
14
15 #define spINSIDE_SPARSE
16 #include "../../sparse/includes/spConfig.h"
17
18
19 double Mini(double *vect, integer n);
20 double Maxi(double *vect,integer n);
21
22
23 double Mini(double *vect, integer n)
24 {
25   int i;
26   double vmin;
27   vmin = LARGEST_REAL;
28   for (i = 0 ; i < n ; i++)
29     /*    if ( isinf(vect[i])== 0 && isnan(vect[i])==0 && vect[i] < vmin)  */
30     if ( finite(vect[i])== 1 && vect[i] < vmin) 
31       vmin=vect[i];
32   return(vmin);
33 }
34
35 double Maxi(double *vect,integer n)
36 {
37   int i;
38   double maxi;
39   maxi= - LARGEST_REAL;
40   for (i =0 ; i < n ; i++)
41     /* if ( isinf(vect[i])== 0 && isnan(vect[i])==0 && vect[i] > maxi) */
42     if ( finite(vect[i])== 1 && vect[i] > maxi) 
43       maxi=vect[i];
44   return(maxi);
45 }
46
47 /*----------------------------------------------------------------------------*/
48
49 /* perform the rotation of point from to point dest  */
50 void rotate2D( double from[2], double center[2], double angle, double dest[2] )
51 {
52   rotate2Dim( from, center, cos( angle ), sin( angle ), dest ) ;
53 }
54
55 /*----------------------------------------------------------------------------*/
56 /* perform the rotation of point from to point to. */
57 /* the angle is directly given with its sine and cosine for speed */
58 void rotate2Dim( double from[2]   ,
59                  double center[2] ,
60                  double cosAngle  ,
61                  double sinAngle  ,
62                  double dest[2]    )
63 {
64   double diff[2] ;
65
66   /* put the center to (0,0) */
67   diff[0] = from[0] - center[0] ;
68   diff[1] = from[1] - center[1] ;
69
70   /* turn and translate back */
71   dest[0] = diff[0] * cosAngle - diff[1] * sinAngle + center[0] ;
72   dest[1] = diff[0] * sinAngle + diff[1] * cosAngle + center[1] ;
73 }
74 /*----------------------------------------------------------------------------*/
75 /* perform the rotation of point from to point dest given in int with angle in radian  */
76 void iRotate2D( int from[2], int center[2], double angle, int dest[2] )
77 {
78   iRotate2Dim( from, center, cos( angle ), sin( angle ), dest ) ;
79 }
80
81 /*----------------------------------------------------------------------------*/
82 /* perform the rotation of point from to point to. */
83 /* the angle is directly given with its sine and cosine for speed */
84 void iRotate2Dim( int    from[2]   ,
85                   int    center[2] ,
86                   double cosAngle  ,
87                   double sinAngle  ,
88                   int    dest[2]    )
89 {
90   int diff[2] ;
91
92   /* put the center to (0,0) */
93   diff[0] = from[0] - center[0] ;
94   diff[1] = from[1] - center[1] ;
95
96   /* turn and translate back */
97   dest[0] = round( diff[0] * cosAngle - diff[1] * sinAngle + center[0] ) ;
98   dest[1] = round( diff[0] * sinAngle + diff[1] * cosAngle + center[1] ) ;
99 }
100 /*----------------------------------------------------------------------------*/
101 /* perform an homethety point from to point dest. The 2 factors stand for the ration */
102 /* along the 2 coordinates */
103 void homothety2D( double from[2], double center[2], double factors[2], double dest[2] )
104 {
105   dest[0] = center[0] + factors[0] * ( from[0] - center[0] ) ;
106   dest[1] = center[1] + factors[1] * ( from[1] - center[1] ) ;
107 }
108 /*----------------------------------------------------------------------------*/
109 /* perform an homethety point from to point dest given in pixels. */
110 /* The 2 factors stand for the ration along the 2 coordinates */
111 void iHomothety2D( int from[2], int center[2], double factors[2], int dest[2] )
112 {
113   dest[0] = round( center[0] + factors[0] * ( from[0] - center[0] ) ) ;
114   dest[1] = round( center[1] + factors[1] * ( from[1] - center[1] ) ) ;
115 }
116 /*----------------------------------------------------------------------------*/
117 /* perform the translation of point from to point to with vector trans */
118 void translate2D( double from[2], double trans[2], double dest[2] )
119 {
120   dest[0] = from[0] + trans[0] ;
121   dest[1] = from[1] + trans[1] ;
122 }
123 /*----------------------------------------------------------------------------*/
124 void iTranslate2D( int from[2], int trans[2], int dest[2] )
125 {
126   dest[0] = from[0] + trans[0] ;
127   dest[1] = from[1] + trans[1] ;
128 }
129 /*----------------------------------------------------------------------------*/
130 void normalize2d( double vect[2] )
131 {
132   double norm = sqrt( vect[0] * vect[0] + vect[1] * vect[1] ) ;
133   vect[0] /= norm ;
134   vect[1] /= norm ;
135 }
136 /*----------------------------------------------------------------------------*/
137 void iNormalize2d( int vect[2] )
138 {
139   double norm = sqrt( vect[0] * vect[0] + vect[1] * vect[1] ) ;
140   vect[0] = round( vect[0] / norm ) ;
141   vect[1] = round( vect[1] / norm ) ;
142 }
143 /*----------------------------------------------------------------------------*/
144 /* check if two values can be considered equal given an accurracy */
145 int safeEqual( double val1, double val2, double accuracy )
146 {
147   /* the val1 == val2 is put to avoid division by 0 */
148   return ( val1 == val2 ) || ( Abs( val1 - val2 ) < accuracy * Max( Abs(val1), Abs(val2 ) ) ) ;
149 }
150 /*----------------------------------------------------------------------------*/