[Kst] branches/work/kst/1.5/kst/src/libkstmath (silent)
Andrew Walker
arwalker at sumusltd.com
Fri Jul 27 00:56:43 CEST 2007
SVN commit 693063 by arwalker:
CCBUG:86915 CVS_SILENT Allow for the case where the output vector for the vector view is of zero length
M +61 -29 kstvectorview.cpp
--- branches/work/kst/1.5/kst/src/libkstmath/kstvectorview.cpp #693062:693063
@@ -68,7 +68,7 @@
QString xmintag, xmaxtag, ymintag, ymaxtag;
QString in_tag;
- _interp = (KstVectorView::InterpType(0)); //defaults. shouldn't be necessary.
+ _interp = KstVectorView::InterpY;
_useXmin = false;
_useXmax = false;
_useYmin = false;
@@ -172,10 +172,12 @@
}
bool vecsUpdated = (KstObject::UPDATE == _inputVectors[IN_XVECTOR]->update(update_counter)) ||
- (KstObject::UPDATE == _inputVectors[IN_YVECTOR]->update(update_counter));
+ (KstObject::UPDATE == _inputVectors[IN_YVECTOR]->update(update_counter));
KstVectorPtr flagVec = *_inputVectors.find(IN_FLAGVECTOR);
- if (flagVec) { vecsUpdated = (vecsUpdated || (KstObject::UPDATE == flagVec->update(update_counter))); }
+ if (flagVec) {
+ vecsUpdated = (vecsUpdated || (KstObject::UPDATE == flagVec->update(update_counter)));
+ }
if (!vecsUpdated && !force) {
unlockInputsAndOutputs();
@@ -222,6 +224,7 @@
break;
default:
NS = kMax(inXVec->length(), inYVec->length());
+ break;
}
int NSm1 = NS-1;
@@ -230,14 +233,18 @@
double *outYArr;
if (inXVec->length() == NS && inXVec->isRising()) { //good scenario.
- int i_bot = inXVec->indexNearX(xmin,NS); //closest index to xmin
- int i_top = inXVec->indexNearX(xmax,NS);
+ int i_bot = inXVec->indexNearX(xmin, NS); //closest index to xmin
+ int i_top = inXVec->indexNearX(xmax, NS);
- if (inXVec->value(i_bot) < xmin && i_bot < NSm1) { i_bot++; } //closest index above xmin
- if (inXVec->value(i_top) > xmax && i_top > 0) { i_top--; }
+ if (inXVec->value(i_bot) < xmin && i_bot < NSm1) {
+ i_bot++;
+ }
+ if (inXVec->value(i_top) > xmax && i_top > 0) {
+ i_top--;
+ }
- outXVec->resize(i_top - i_bot + 1,true); //initial resize. will trim later.
- outYVec->resize(i_top - i_bot + 1,true);
+ outXVec->resize(i_top - i_bot + 1, true); //initial resize. will trim later.
+ outYVec->resize(i_top - i_bot + 1, true);
outXArr = outXVec->value();
outYArr = outYVec->value();
@@ -247,9 +254,9 @@
int in = 0;
double yv;
for (long i=i_bot; i<=i_top; i++) {
- if (!flagVec || !flagVec->interpolate(i,NS)) { //only the LHS should be evaluated !flagVec
+ if (!flagVec || !flagVec->interpolate(i, NS)) { //only the LHS should be evaluated !flagVec
yv = inYVec->interpolate(i,NS);
- if ( (ymin <= yv) && (ymax >= yv) ) {
+ if (ymin <= yv && ymax >= yv) {
outXArr[in] = inXArr[i];
outYArr[in] = yv;
in++;
@@ -257,17 +264,28 @@
}
}
- outXVec->resize(in,false);
- outYVec->resize(in,false);
+ if (in > 0) {
+ outXVec->resize(in, false);
+ outYVec->resize(in, false);
+ } else {
+ outXArr[0] = 0.0;
+ outYArr[0] = 0.0;
+ outXVec->resize(1, false);
+ outYVec->resize(1, false);
+ }
} else if (inYVec->length() == NS && inYVec->isRising()) { //also good.
- int i_bot = inYVec->indexNearX(ymin,NS); //closest index to xmin
- int i_top = inYVec->indexNearX(ymax,NS);
+ int i_bot = inYVec->indexNearX(ymin, NS); //closest index to xmin
+ int i_top = inYVec->indexNearX(ymax, NS);
- if (inYVec->value(i_bot) < ymin && i_bot < NSm1) { i_bot++; } //closest index above xmin
- if (inYVec->value(i_top) > ymax && i_top > 0) { i_top--; }
+ if (inYVec->value(i_bot) < ymin && i_bot < NSm1) {
+ i_bot++;
+ } // closest index above xmin
+ if (inYVec->value(i_top) > ymax && i_top > 0) {
+ i_top--;
+ }
- outXVec->resize(i_top - i_bot + 1,true); //initial resize. will trim later.
- outYVec->resize(i_top - i_bot + 1,true);
+ outXVec->resize(i_top - i_bot + 1, true); //initial resize. will trim later.
+ outYVec->resize(i_top - i_bot + 1, true);
outXArr = outXVec->value();
outYArr = outYVec->value();
@@ -287,11 +305,18 @@
}
}
- outXVec->resize(in,false);
- outYVec->resize(in,false);
+ if (in > 0) {
+ outXVec->resize(in, false);
+ outYVec->resize(in, false);
+ } else {
+ outXArr[0] = 0.0;
+ outYArr[0] = 0.0;
+ outXVec->resize(1, false);
+ outYVec->resize(1, false);
+ }
} else { //worst case scenario. could do more ifs on y->isRising();
- outXVec->resize(NS,true); //initial resize. will trim later.
- outYVec->resize(NS,true);
+ outXVec->resize(NS, true); // initial resize. will trim later.
+ outYVec->resize(NS, true);
outXArr = outXVec->value();
outYArr = outYVec->value();
@@ -301,9 +326,9 @@
for (long i=0; i<=NSm1; i++) {
if (!flagVec || !flagVec->interpolate(i,NS)) { //only the LHS should be evaluated if !flagVec.
double xv = inXVec->interpolate(i,NS);
- if ( (xmin <= xv) && (xmax >= xv) ) {
+ if (xmin <= xv && xmax >= xv) {
yv = inYVec->interpolate(i,NS);
- if ( (ymin <= yv) && (ymax >= yv) ) {
+ if (ymin <= yv && ymax >= yv) {
outXArr[in] = xv;
outYArr[in] = yv;
in++;
@@ -311,11 +336,20 @@
}
}
}
- outXVec->resize(in, false);
- outYVec->resize(in, false);
+
+ if (in > 0) {
+ outXVec->resize(in, false);
+ outYVec->resize(in, false);
+ } else {
+ outXArr[0] = 0.0;
+ outYArr[0] = 0.0;
+ outXVec->resize(1, false);
+ outYVec->resize(1, false);
+ }
}
unlockInputsAndOutputs();
+
return setLastUpdateResult(UPDATE);
}
@@ -541,5 +575,3 @@
}
#include "kstvectorview.moc"
-
-// vim: ts=2 sw=2 et
More information about the Kst
mailing list