Developer documentation | Axl-2.5.1

axlVolumeDiscrete.cpp
Go to the documentation of this file.
1 /* axlVolumeDiscrete.cpp ---
2  *
3  * Author: Anais Ducoffe
4  * Copyright (C) 2008 - Anais Ducoffe, Inria.
5  */
6 
7 /* Commentary:
8  *
9  */
10 
11 /* Change log:
12  *
13  */
14 
15 #include "axlVolumeDiscrete.h"
16 
17 #include <dtkCoreSupport/dtkGlobal.h>
18 #include <dtkCoreSupport/dtkAbstractData_p.h>
19 
20 #include <vtkSmartPointer.h>
21 #include <vtkImageData.h>
22 
23 // ///////////////////////////////////////////////////////////////////
24 // axlVolumeDiscretePrivate
25 // ///////////////////////////////////////////////////////////////////
26 
27 class axlVolumeDiscretePrivate
28 {
29 public:
30  vtkImageData *grid;
31 
32 public:
33  double *values;
34  double min_field_value;
35  double mid_field_value;
36  double max_field_value;
37 };
38 
39 // ///////////////////////////////////////////////////////////////////
40 // axlVolumeDiscrete protected constructors
41 // ///////////////////////////////////////////////////////////////////
42 
43 //DTK_IMPLEMENT_PRIVATE(axlVolumeDiscrete, dtkAbstractData);
44 
45 // ///////////////////////////////////////////////////////////////////
46 // axlVolumeDiscrete implementation
47 // ///////////////////////////////////////////////////////////////////
48 
49 axlVolumeDiscrete::axlVolumeDiscrete(void) : axlAbstractVolumeDiscrete(), d(new axlVolumeDiscretePrivate)
50 {
51  d->values = NULL;
52  d->grid = vtkImageData::New();
53  //d->grid->SetScalarType(VTK_DOUBLE);
54  d->min_field_value = d->grid->GetScalarTypeMax();
55  d->max_field_value = d->grid->GetScalarTypeMin();
56  d->mid_field_value = (maxValue() + minValue())/2.0;
57  this->setObjectName("axlVolumeDiscrete");
58 
59 }
60 
61 axlVolumeDiscrete::axlVolumeDiscrete(const axlVolumeDiscrete& other) : axlAbstractVolumeDiscrete(), d(new axlVolumeDiscretePrivate)
62 {
63  d->values = new double[other.xDimension() *other.yDimension() *other.zDimension()];
64 
65  vtkImageData *grid = static_cast<vtkImageData *>(other.data());
66  if(grid){
67  d->grid->DeepCopy(grid);
68  }else{
69  d->grid = vtkSmartPointer<vtkImageData>::New();
70  //d->grid->SetScalarType(VTK_DOUBLE);
71  }
72 
73  d->min_field_value = other.minValue();
74  d->max_field_value = other.maxValue();
75  d->mid_field_value = other.midValue();
76  this->setObjectName("axlVolumeDiscrete");
77 }
78 
80 {
81  d->grid->Delete();
82 }
83 
85 {
86  return new axlVolumeDiscrete(*this);
87 }
88 
90 {
91  vtkImageData *grid = static_cast<vtkImageData *>(other.data());
92  if(!grid){
93  d->grid = vtkSmartPointer<vtkImageData>::New();
94  //d->grid->SetScalarType(VTK_DOUBLE);
95  }
96 
97  d->grid->DeepCopy(grid);
98 
99  return (*this);
100 }
101 
102 QString axlVolumeDiscrete::identifier(void) const
103 {
104  return "axlVolumeDiscrete";
105 }
106 
108 {
109  if(vtkImageData *grid = static_cast<vtkImageData *>(data)){
110  if(grid){
111  d->grid->DeepCopy(grid);
112  }else{
113  d->grid = vtkSmartPointer<vtkImageData>::New();
114  //d->grid->SetScalarType(VTK_DOUBLE);
115  }
116  }
117 
118 }
119 
120 void *axlVolumeDiscrete::data(void) const
121 {
122 
123  return d->grid;
124 
125 }
126 
128 {
129  //DTK_D(const axlVolumeDiscrete);
130 
131  if(!d->grid)
132  return -1;
133 
134  return d->grid->GetDimensions()[0];
135 }
136 
138 {
139  //DTK_D(const axlVolumeDiscrete);
140 
141  if(!d->grid)
142  return -1;
143 
144  return d->grid->GetDimensions()[1];
145 }
146 
148 {
149  //DTK_D(const axlVolumeDiscrete);
150 
151  if(!d->grid)
152  return -1;
153 
154  return d->grid->GetDimensions()[2];
155 }
156 
157 void axlVolumeDiscrete::setDimensions(unsigned int x, unsigned int y,unsigned int z){
158  if(d->grid){
159  d->grid->Initialize();
160  d->grid->SetExtent(0,x-1,0,y-1,0,z-1);
161  d->grid->SetOrigin(-0.5*x, -0.5*y, -0.5*z);
162  //d->grid->SetNumberOfScalarComponents(1);
163  }
164 }
165 
166 double axlVolumeDiscrete::minValue(void) const
167 {
168 
169  // double min = 0.0;
170  // for(int i = 0; i < xDimension() ;i++){
171  // for(int j = 0; j < yDimension() ;j++){
172  // for(int k = 0; k < zDimension() ;k++){
173  // if(i== 0 & j== 0 & k ==0){
174  // min = getValue(i,j,k);
175  // }else{
176  // if(min > getValue(i,j,k)){
177  // min = getValue(i,j,k);
178  // }
179  // }
180  // }
181  // }
182  // }
183  // qDebug() << Q_FUNC_INFO << min;
184  // return min;
185  // double scalar_range[2];d->grid->GetScalarRange(scalar_range);
186  // qDebug() << Q_FUNC_INFO << scalar_range[0];
187  // return scalar_range[0];
188  return d->min_field_value;
189 }
190 
191 double axlVolumeDiscrete::midValue(void) const
192 {
193  //return (maxValue() + minValue())/2.0;
194 
195  return d->mid_field_value;
196 }
197 
198 double axlVolumeDiscrete::maxValue(void) const
199 {
200  // double max = 0.0;
201  // for(int i = 0; i < xDimension() ;i++){
202  // for(int j = 0; j < yDimension() ;j++){
203  // for(int k = 0; k < zDimension() ;k++){
204  // if(max < getValue(i,j,k))
205  // max = getValue(i,j,k);
206  // }
207  // }
208  // }
209  // qDebug() << Q_FUNC_INFO << max;
210  // return max;
211  // double scalar_range[2];d->grid->GetScalarRange(scalar_range);
212  // qDebug() << Q_FUNC_INFO << scalar_range[1];
213  // return scalar_range[1];
214  return d->max_field_value;
215 }
216 
217 void axlVolumeDiscrete::setMinValue(double min_field_value)
218 {
219  d->min_field_value = min_field_value;
220 }
221 
222 void axlVolumeDiscrete::setMidValue(double mid_field_value)
223 {
224  //DTK_D(axlVolumeDiscrete);
225 
226  d->mid_field_value = mid_field_value;
227 }
228 
229 void axlVolumeDiscrete::setMaxValue(double max_field_value)
230 {
231  //DTK_D(axlVolumeDiscrete);
232  d->max_field_value = max_field_value;
233 }
234 
235 
236 double axlVolumeDiscrete::getValue(int i, int j, int k) const{
237  // int nx = xDimension();
238  // int ny = yDimension();
239  // int nz = zDimension();
240  // int indice = k* nx *ny + j * nx + i;
241  return d->grid->GetScalarComponentAsDouble(i,j,k,0);
242 }
243 
244 
245 void axlVolumeDiscrete::setValue(double value, int i, int j, int k){
246  // int nx = xDimension();
247  // int ny = yDimension();
248  // int nz = zDimension();
249  // int indice = k* nx *ny + j * nx + i;
250  d->grid->SetScalarComponentFromDouble(i,j,k,0, value);
251  //d->grid->Update();
252 
253  if(value > maxValue()){
254  d->max_field_value = value;
255  }
256  if(value < minValue()){
257  d->min_field_value = value;
258  }
259 
260  d->mid_field_value = (maxValue() + minValue())/2.0;
261 
262 }
263 
264 // /////////////////////////////////////////////////////////////////
265 // Instanciation function
266 // /////////////////////////////////////////////////////////////////
267 
268 dtkAbstractData *createaxlVolumeDiscrete(void)
269 {
270  return new axlVolumeDiscrete;
271 };
double getValue(int i, int j, int k) const
axlVolumeDiscrete & operator=(const axlVolumeDiscrete &other)
double maxValue(void) const
void setMinValue(double min_field_value)
void * data(void) const
double minValue(void) const
void setData(void *data)
int yDimension(void) const
void setValue(double value, int i, int j, int k)
int xDimension(void) const
int zDimension(void) const
void setDimensions(unsigned int x, unsigned int y, unsigned int z)
QString identifier(void) const
axlVolumeDiscrete * clone(void) const
dtkAbstractData * createaxlVolumeDiscrete(void)
void setMidValue(double mid_field_value)
void setMaxValue(double max_field_value)
double midValue(void) const