26 Reduce::Reduce(
Isis::Cube *pInCube,
const double sampleScale,
const double lineScale)
37 miEndLine = mInCube->lineCount();
39 miInputSamples= mInCube->sampleCount();
40 miInputLines = mInCube->lineCount();
41 miInputBands = mInCube->bandCount();
44 mdSampleScale = sampleScale;
45 mdLineScale = lineScale;
48 miOutputSamples = (int)((
double)miInputSamples / mdSampleScale + 0.5);
49 miOutputLines = (int)((
double)miInputLines / mdLineScale + 0.5);
52 m_iPortal =
new Isis::Portal(miInputSamples, 1, mInCube->pixelType());
81 void Reduce::setInputBoundary(
int startSample,
int endSample,
int startLine,
int endLine){
82 miStartSample = startSample;
83 miEndSample = endSample;
84 miInputSamples = endSample - startSample + 1;
86 miStartLine = startLine;
88 miInputLines = endLine - startLine + 1;
92 miOutputSamples = (int)((
double)miInputSamples / mdSampleScale + 0.5);
93 miOutputLines = (int)((
double)miInputLines / mdLineScale + 0.5);
126 subArea.
SetSubArea(mInCube->lineCount(), mInCube->sampleCount(), miStartLine, miStartSample,
127 miEndLine, miEndSample, mdLineScale, mdSampleScale);
128 subArea.
UpdateLabel(mInCube, pOutCube, resultsGrp);
141 int readLine = (int)(mdLine + 0.5);
143 m_iPortal->SetPosition(miStartSample, readLine, miBandIndex);
144 mInCube->read(*m_iPortal);
147 for(
int os = 0; os < miOutputSamples; os++) {
148 out[os] = (*m_iPortal)[(int)((
double) os * mdSampleScale)];
151 if(out.
Line() == miOutputLines) {
156 mdLine += mdLineScale;
168 double rline = (double)out.
Line() * mdLineScale;
170 if(out.
Line() == 1 && out.
Band() == 1) {
171 mdIncTab =
new double[miOutputSamples];
172 mdSum =
new double[miOutputSamples];
173 mdNpts =
new double[miOutputSamples];
174 mdSum2 =
new double[miOutputSamples];
175 mdNpts2 =
new double[miOutputSamples];
178 for(
int osamp = 0; osamp < miOutputSamples; osamp++) {
179 mdIncTab[osamp] = ((double)osamp + 1.) * mdSampleScale;
183 mdNpts2[osamp] = 0.0;
185 mdIncTab[miOutputSamples-1] = miInputSamples;
188 while(mdLine <= rline) {
189 if((
int)mdLine <= miInputLines) {
190 m_iPortal->SetPosition(miStartSample, mdLine, miBandIndex);
191 mInCube->read(*m_iPortal);
194 for(
int osamp = 0; osamp < out.
size(); osamp++) {
195 while((
double)isamp <= mdIncTab[osamp]) {
198 mdSum[osamp] += (*m_iPortal)[isamp-1];
199 mdNpts[osamp] += 1.0;
204 double sdel = (double) isamp - mdIncTab[osamp];
205 if(isamp > miInputSamples)
continue;
208 mdSum[osamp] += (*m_iPortal)[isamp-1] * (1.0 - sdel);
209 mdNpts[osamp] += (1.0 - sdel);
210 if(osamp + 1 < miOutputSamples) {
211 mdSum[osamp+1] += (*m_iPortal)[isamp-1] * sdel;
212 mdNpts[osamp+1] += sdel;
220 if(mdLine <= miInputLines) {
221 m_iPortal->SetPosition(miStartSample, mdLine, miBandIndex);
222 mInCube->read(*m_iPortal);
224 double ldel = (double)mdLine - rline;
225 double ldel2 = 1.0 - ldel;
227 for(
int osamp = 0; osamp < miOutputSamples; osamp++) {
228 while(isamp <= mdIncTab[osamp]) {
230 mdSum[osamp] += (*m_iPortal)[isamp-1] * ldel2;
231 mdNpts[osamp] += ldel2;
232 mdSum2[osamp] += (*m_iPortal)[isamp-1] * ldel;
233 mdNpts2[osamp] += ldel;
238 double sdel = (double) isamp - mdIncTab[osamp];
239 if(isamp > miInputSamples)
continue;
241 mdSum[osamp] += (*m_iPortal)[isamp-1] * (1.0 - sdel) * ldel2;
242 mdNpts[osamp] += (1.0 - sdel) * ldel2;
243 if(osamp + 1 < miOutputSamples) {
244 mdSum[osamp+1] += (*m_iPortal)[isamp-1] * sdel * ldel2;
245 mdNpts[osamp+1] += sdel * ldel2;
247 mdSum2[osamp] += (*m_iPortal)[isamp-1] * (1.0 - sdel) * ldel;
248 mdNpts2[osamp] += (1.0 - sdel) * ldel;
249 if(osamp + 1 < miOutputSamples) {
250 mdSum2[osamp+1] += (*m_iPortal)[isamp-1] * sdel * ldel;
251 mdNpts2[osamp+1] += sdel * ldel;
257 if(mdLine < miInputLines) mdLine++;
259 double npix = mdSampleScale * mdLineScale;
260 for(
int osamp = 0; osamp < miOutputSamples; osamp++) {
261 if(mdNpts[osamp] > npix * mdValidPer) {
262 out[osamp] = mdSum[osamp] / mdNpts[osamp];
265 if(msReplaceMode ==
"NEAREST") {
266 out[osamp] = (*m_iPortal)[(int)(mdIncTab[osamp] + 0.5) - 1];
272 mdSum[osamp] = mdSum2[osamp];
273 mdNpts[osamp] = mdNpts2[osamp];
275 mdNpts2[osamp] = 0.0;
278 if(out.
Line() == miOutputLines && out.
Band() != miInputBands) {
281 for(
int osamp = 0; osamp < miOutputSamples; osamp++) {
285 mdNpts2[osamp] = 0.0;
289 if(out.
Line() == miOutputLines && out.
Band() == miInputBands) {