9b40905854bccbc14de2e8f8e83a728590d0a180
[scilab.git] / scilab / modules / renderer / src / cpp / grayplotDrawing / MatplotDecomposer.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 matplot 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 "MatplotDecomposer.hxx"
15
16 extern "C"
17 {
18 #include "GetProperty.h"
19 }
20
21 namespace sciGraphics
22 {
23 /*---------------------------------------------------------------------------------*/
24 MatplotDecomposer::MatplotDecomposer(DrawableGrayplot * grayplot)
25   : GrayplotDecompositionStrategy(grayplot)
26 {
27   
28 }
29 /*---------------------------------------------------------------------------------*/
30 MatplotDecomposer::~MatplotDecomposer(void)
31 {
32
33 }
34 /*---------------------------------------------------------------------------------*/
35 int MatplotDecomposer::getNbRow(void)
36 {
37   return pGRAYPLOT_FEATURE(m_pDrawed->getDrawedObject())->nx;
38 }
39 /*---------------------------------------------------------------------------------*/
40 int MatplotDecomposer::getNbCol(void)
41 {
42   return pGRAYPLOT_FEATURE(m_pDrawed->getDrawedObject())->ny;
43 }
44 /*---------------------------------------------------------------------------------*/
45 int MatplotDecomposer::getNbColors(void)
46 {
47   // we draw insie the grid
48   return (getNbRow() - 1) * (getNbCol() - 1);
49 }
50 /*---------------------------------------------------------------------------------*/
51 double MatplotDecomposer::getZCoordinate(void)
52 {
53   return 0.0;
54 }
55 /*---------------------------------------------------------------------------------*/
56 void MatplotDecomposer::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   if (ppGray->type == 1)
64   {
65     decomposeMatplot(xGrid, yGrid);
66   }
67   else
68   {
69     decomposeMatplot1(xGrid, yGrid);
70   }
71
72   // fill color
73   for (int i = 0; i < nbCol - 1; i++)
74   {
75     for (int j = 0; j < nbRow - 1; j++)
76     {
77       // scilab data are stored column wise
78       colors[j + (nbRow - 1) * i] = (int) ppGray->pvecz[j + (nbRow - 1) * i];
79     }
80   }
81
82   // apply log scale if needed
83   m_pDrawed->pointScale(xGrid, NULL, NULL, nbRow);
84   m_pDrawed->pointScale(NULL, yGrid, NULL, nbCol);
85
86 }
87 /*---------------------------------------------------------------------------------*/
88 void MatplotDecomposer::decomposeMatplot(double xGrid[], double yGrid[])
89 {
90   int nbRow = getNbRow();
91   int nbCol = getNbCol();
92
93   // the center of each facet is on (i,j) where i and j are integer
94   // so facet (i,j) vertices are (i-0.5,j-0.5), (i+0.5,j-0.5),
95   // (i+0.5,j+0.5), (i-0.5,j+0.5)
96
97   // fill xgrid
98   for (int i = 0; i < nbCol; i++)
99   {
100     // we start at i = 0, but matrix indices at 1
101     xGrid[i] = i + 0.5;
102   }
103
104   // fill y grid
105   // top of the matrix starts on Y max
106   for (int j = 0; j < nbRow; j++)
107   {
108      // so the result is j - 0.5 + 1
109     yGrid[j] = nbRow - j - 0.5;
110   }
111 }
112 /*---------------------------------------------------------------------------------*/
113 void MatplotDecomposer::decomposeMatplot1(double xGrid[], double yGrid[])
114 {
115   int nbRow = getNbRow();
116   int nbCol = getNbCol();
117
118   sciPointObj * pGray = m_pDrawed->getDrawedObject();
119   sciGrayplot * ppGray = pGRAYPLOT_FEATURE(pGray);
120
121   // get data bounds
122   double xMin = ppGray->pvecx[0];
123   double xMax = ppGray->pvecx[2];
124   double yMin = ppGray->pvecx[1];
125   double yMax = ppGray->pvecx[3];
126
127   // the matplot should fit in [xMin,xMax]x[yMin,yMax]
128
129   // fill xgrid
130   for (int i = 0; i < nbCol; i++)
131   {
132     xGrid[i] = xMin + i * (xMax - xMin) / (nbCol - 1);
133   }
134
135   // top of the matrix starts on Y max
136   for (int j = 0; j < nbRow; j++)
137   {
138     yGrid[j] = yMax - j * (yMax - yMin) / (nbRow - 1);
139   }
140 }
141 /*---------------------------------------------------------------------------------*/
142 }