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