505a11e6aa67fdaa6de66f000b946e024f8319e2
[scilab.git] / scilab / modules / renderer / src / cpp / grayplotDrawing / GrayplotDecomposer.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Jean-Baptiste Silvy
4  * desc : Strategy decomposing grayplot objects
5  * 
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at    
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 #include "GrayplotDecomposer.hxx"
15
16 extern "C"
17 {
18 #include "GetProperty.h"
19 }
20
21 namespace sciGraphics
22 {
23 /*---------------------------------------------------------------------------------*/
24 GrayplotDecomposer::GrayplotDecomposer(DrawableGrayplot * grayplot)
25   : GrayplotDecompositionStrategy(grayplot)
26 {
27   
28 }
29 /*---------------------------------------------------------------------------------*/
30 GrayplotDecomposer::~GrayplotDecomposer(void)
31 {
32   
33 }
34 /*---------------------------------------------------------------------------------*/
35 int GrayplotDecomposer::getNbRow(void)
36 {
37   return pGRAYPLOT_FEATURE(m_pDrawed->getDrawedObject())->nx;
38 }
39 /*---------------------------------------------------------------------------------*/
40 int GrayplotDecomposer::getNbCol(void)
41 {
42   return pGRAYPLOT_FEATURE(m_pDrawed->getDrawedObject())->ny;
43 }
44 /*---------------------------------------------------------------------------------*/
45 int GrayplotDecomposer::getNbColors(void)
46 {
47   // we draw insie the grid
48   return (getNbRow() - 1) * (getNbCol() - 1);
49 }
50 /*---------------------------------------------------------------------------------*/
51 double GrayplotDecomposer::getZCoordinate(void)
52 {
53   return 0.0;
54 }
55 /*---------------------------------------------------------------------------------*/
56 void GrayplotDecomposer::decomposeGrayplot(double xGrid[], double yGrid[], int colors[])
57 {
58   sciPointObj * pGray = m_pDrawed->getDrawedObject();
59   sciGrayplot * ppGray = pGRAYPLOT_FEATURE(pGray);
60   int nbRow = getNbRow();
61   int nbCol = getNbCol();
62
63   // fill xgrid
64   for (int i = 0; i < nbCol; i++)
65   {
66     xGrid[i] = ppGray->pvecx[i];
67   }
68
69   // fill y grid
70   for (int j = 0; j < nbRow; j++)
71   {
72     yGrid[j] = ppGray->pvecy[j];
73   }
74
75   // fill color
76   if (ppGray->datamapping[0] == 's')
77   {
78     // s for scaled
79     decomposeScaledColors(colors);
80   }
81   else
82   {
83     // d for direct
84     decomposeDirectColors(colors);
85   }
86
87   // apply log scale if needed
88   m_pDrawed->pointScale(xGrid, NULL, NULL, nbRow);
89   m_pDrawed->pointScale(NULL, yGrid, NULL, nbCol);
90
91 }
92 /*---------------------------------------------------------------------------------*/
93 void GrayplotDecomposer::decomposeScaledColors(int colors[])
94 {
95   int nbRow = getNbRow();
96   int nbCol = getNbCol();
97
98   sciPointObj * pGray = m_pDrawed->getDrawedObject();
99   sciGrayplot * ppGray = pGRAYPLOT_FEATURE(pGray);
100
101   double lowColor = ppGray->pvecz[0];
102   double highColor = ppGray->pvecz[0];
103
104   // first find lower and higher Z values
105   for (int i = 1; i < nbRow * nbCol; i++)
106   {
107     double curColor = ppGray->pvecz[i];
108     if (curColor > highColor)
109     {
110       highColor = curColor;
111     }
112     else if (curColor < lowColor)
113     {
114       lowColor = curColor;
115     }
116   }
117
118
119   // prevent from dividing by 0
120   double zRange = highColor - lowColor;
121   if (zRange < SMDOUBLE)
122   {
123     zRange = SMDOUBLE;
124   }
125   int colorMapSize = sciGetNumColors(sciGetParentFigure(pGray));
126
127   // fill color
128   for (int i = 0; i < nbRow - 1; i++)
129   {
130     for (int j = 0; j < nbCol - 1; j++)
131     {
132       // current value is the average on the facet
133       double curZvalue = getFacetZvalue(ppGray->pvecz, nbRow, i, j);
134       // colors is of size (nx - 1) x (ny -1) and pvecz of size nx x ny.
135       // a 1 is added here and I don't know why
136       // scilab data are stored column wise
137       colors[j + (nbRow - 1) * i]
138         = 1 + (int) floor( (colorMapSize - 1) * (curZvalue - lowColor) / zRange + 0.5);
139     }
140   }
141 }
142 /*---------------------------------------------------------------------------------*/
143 void GrayplotDecomposer::decomposeDirectColors(int colors[])
144 {
145   int nbRow = getNbRow();
146   int nbCol = getNbCol();
147   sciPointObj * pGray = m_pDrawed->getDrawedObject();
148   sciGrayplot * ppGray = pGRAYPLOT_FEATURE(pGray);
149
150
151   // fill color
152   for (int i = 0; i < nbRow - 1; i++)
153   {
154     for (int j = 0; j < nbCol - 1; j++)
155     {
156       // colors is of size (nx - 1) x (ny -1) and pvecz of size nx x ny.
157       // scilab data are stored column wise
158       colors[j + (nbRow - 1) * i] = (int) ppGray->pvecz[i + nbCol * j];
159     }
160   }
161
162 }
163 /*---------------------------------------------------------------------------------*/
164 double GrayplotDecomposer::getFacetZvalue(const double zValues[], int nbRow, int i, int j)
165 {
166   // mean on the facet
167    return 0.25 * (  zValues[i + nbRow * j] + zValues[i + 1 + nbRow * j]
168                   + zValues[i + 1 + nbRow * (j + 1)] + zValues[i + nbRow * (j + 1)]);
169 }
170 /*---------------------------------------------------------------------------------*/
171 }
172