From: <ro...@us...> - 2012-08-30 11:53:24
|
Revision: 2047 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=2047&view=rev Author: ron-fox Date: 2012-08-30 11:53:12 +0000 (Thu, 30 Aug 2012) Log Message: ----------- Ensure integrations stay in spectrum boundaries (Issue #1218) Modified Paths: -------------- trunk/SpecTcl/Display/integrate.cc Modified: trunk/SpecTcl/Display/integrate.cc =================================================================== --- trunk/SpecTcl/Display/integrate.cc 2012-08-15 14:04:10 UTC (rev 2046) +++ trunk/SpecTcl/Display/integrate.cc 2012-08-30 11:53:12 UTC (rev 2047) @@ -39,10 +39,15 @@ #include <math.h> #include <string.h> #include <stdio.h> +#include <algorithm> + #include <memory.h> #include "integrate.h" #include "dispshare.h" #include "dispgrob.h" + +using namespace std; + /* ** Some compilers such as ultrix have problems including both math.h ** and limits.h @@ -76,6 +81,14 @@ edge_list_pointer *edges; /* List of edge tables. */ }; + +// inline utility to determin if a point is inside limits: + +bool inside(int pt, int low, int high) +{ + return (pt >= low) && (pt <= high); +} + /* ** Functional Description: @@ -293,6 +306,7 @@ int yh = 0; int yl = INT_MAX; + grobj_point *pt1 = polygon->firstpt(); while(pt1 != NULL) { int y = pt1->gety(); @@ -300,6 +314,11 @@ if(y < yl) yl = y; pt1 = polygon->nextpt(); } + // Limit yl,yh to spectrum boundaries: + // Now the edge table will be inside the spectrum. + + + /* Next allocate the root of the edge table and the edge list pointers: */ /* We initialize all of the edges pointers to null. */ @@ -382,7 +401,16 @@ hilim = lolim; lolim = temp; } + // Limit to spectrum boundaries. + int specid = sumregion->getspectrum(); + int spec_xmax = xamine_shared->getxdim(specid); + + lolim = max(0,lolim); + hilim = max(0,hilim); + lolim = min(lolim, spec_xmax); + hilim = min(hilim, spec_xmax); + /* Hoist the spectrum base pointer to allow efficient pointer usage in the ** summing pass.. */ @@ -440,7 +468,16 @@ hilim = lolim; lolim = temp; } + // Limit to spectrum boundaries. + int specid = sumregion->getspectrum(); + int spec_xmax = xamine_shared->getxdim(specid); + + lolim = max(0,lolim); + hilim = max(0,hilim); + lolim = min(lolim, spec_xmax); + hilim = min(hilim, spec_xmax); + /* Hoist the spectrum base pointer to allow efficient pointer usage in the ** summing pass.. */ @@ -606,6 +643,10 @@ double ysum = 0; double xsqsum = 0; double ysqsum = 0; + int spectrumid = sumregion->getspectrum(); + int xdimension = xamine_shared->getxdim(spectrumid) - 1; + int ydimension = xamine_shared->getydim(spectrumid) - 1; + int y = e->ybase; /* Keep track of y coord. */ for(int l = 0; l < nlines; l++) { /* Loop over scan lines. */ @@ -617,13 +658,16 @@ for(int k = lo; k <= hi; k ++) { /* Sum over one interior region. */ double xchannel = XChannel(k); double ychannel = YChannel(y); - float ch = (float)*s++; - sum += ch; - xsum += ch * xchannel; - ysum += ch * ychannel; - xsqsum += ch * (xchannel*xchannel); - ysqsum += ch * (ychannel*ychannel); - + if (inside(k, 0, xdimension) && inside(y, 0, ydimension)) { + float ch = (float)*s++; + sum += ch; + xsum += ch * xchannel; + ysum += ch * ychannel; + xsqsum += ch * (xchannel*xchannel); + ysqsum += ch * (ychannel*ychannel); + } else { + s++; + } } /* Sum over one interior region. */ } /* Scan over all pairs. */ /* Now on to the next scan line: */ @@ -692,6 +736,11 @@ double ysum = 0; double xsqsum = 0; double ysqsum = 0; + int spectrumid = sumregion->getspectrum(); + int xdimension = xamine_shared->getxdim(spectrumid) - 1; + int ydimension = xamine_shared->getydim(spectrumid) - 1; + + int y = e->ybase; /* Keep track of y coord. */ for(int l = 0; l < nlines; l++) { /* Loop over scan lines. */ @@ -704,12 +753,20 @@ for(int k = lo; k <= hi; k ++) { /* Sum over one interior region. */ double xchannel = XChannel(k); double ychannel = YChannel(y); - float ch = (float)*s++; - sum += ch; - xsum += ch * xchannel; - ysum += ch * ychannel; - xsqsum += ch * (xchannel*xchannel); - ysqsum += ch * (ychannel*ychannel); + + // Only sum points that are actually in the spectrum: + + if (inside(k, 0, xdimension) && inside(y, 0, ydimension)) { + + float ch = (float)*s++; + sum += ch; + xsum += ch * xchannel; + ysum += ch * ychannel; + xsqsum += ch * (xchannel*xchannel); + ysqsum += ch * (ychannel*ychannel); + } else { + s++; + } } } /* Sum over one interior region. */ } /* Scan over all pairs. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |