_________________________________________________________________
Express yourself instantly with MSN Messenger! Download today it's FREE!
http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/
#include <vtkHorizontalAverage.h>
#include <vtkDataSet.h>
#include <vtkStructuredGrid.h>
#include <vtkStructuredPoints.h>
#include <vtkRectilinearGrid.h>
#include <vtkDataArray.h>
#include <vtkObjectFactory.h>
#include <vtkPointData.h>
#include <vtkFloatArray.h>

vtkStandardNewMacro(vtkHorizontalAverage);

vtkHorizontalAverage::vtkHorizontalAverage()
{
	this -> Normalize = 0;
}

void vtkHorizontalAverage::PrintSelf(ostream& os, vtkIndent indent)
{
	this->Superclass::PrintSelf(os,indent);
	
	os << indent << "Normalize: " 
     << (this->Normalize ? this->Normalize : 0) << endl;
}

void vtkHorizontalAverage::Execute()
{vtkDataSet *input = this -> GetInput();
 vtkStructuredGrid *output = this ->GetOutput();

 int DataSetType;
 DataSetType = input -> GetDataObjectType();

 int dims[3],i,j,k;
 // pointer for casting
 vtkRectilinearGrid *rect_input = vtkRectilinearGrid::New();
 vtkStructuredGrid *structgrid_input = vtkStructuredGrid::New();

 vtkPointData *iPtr,*oPtr;
 double *inPtr, *outPtr;

 vtkDataArray *scaldat;
 vtkDataArray *new_scaldat;

 vtkFloatArray *scalars = vtkFloatArray::New();
 vtkFloatArray *new_scalars = vtkFloatArray::New();

 int numPts = input -> GetNumberOfPoints();
 output -> Allocate(numPts);


 if((DataSetType == VTK_RECTILINEAR_GRID) && (rect_input = vtkRectilinearGrid::SafeDownCast(input)))
  {
   rect_input -> GetDimensions(dims);

   //get the scalar attribute Data
 iPtr = rect_input->GetPointData();
 scaldat = iPtr -> GetScalars();
 oPtr = output->GetPointData();
 new_scaldat = oPtr -> GetScalars();

 scalars = vtkFloatArray::SafeDownCast(scaldat);
 new_scalars = vtkFloatArray::SafeDownCast(new_scaldat);

 if(!scaldat && !new_scaldat) vtkErrorMacro("Downcast to vtkFloatArray failed");

//  inPtr = rect_input->GetPoint(0);
//  outPtr = output->GetPoint(0);
 }

 else if((DataSetType == VTK_STRUCTURED_GRID )&& (structgrid_input = vtkStructuredGrid::SafeDownCast(input)))
 {vtkPointData *iPtr = structgrid_input->GetPointData();
  vtkPointData *oPtr = output->GetPointData();

  iPtr = structgrid_input->GetPointData();
 scaldat = iPtr -> GetScalars();
 oPtr = output->GetPointData();
 new_scaldat = oPtr -> GetScalars();

 scalars = vtkFloatArray::SafeDownCast(scaldat);
 new_scalars = vtkFloatArray::SafeDownCast(new_scaldat);

 if(!scaldat && !new_scaldat) vtkErrorMacro("Downcast to vtkFloatArray failed");

 structgrid_input->GetDimensions(dims);
 }

 else vtkErrorMacro("unsupported Dataset Format");

 double *horizontal = new double[dims[0]];
  	double *horizontal_sigma = new double[dims[0]];
  	int index;
  	// compute the horizontal average
    for (i=0; i<dims[0]; i++) { 
    	horizontal[i] = 0.0;
		for (j=0; j<dims[1]; j++) {
			for (k=0; k<dims[2]; k++) {
				index = k*(dims[1]*dims[0]) + j*dims[0] + i;
				horizontal[i] += scalars -> GetComponent(index, 1); //horizontal[i] += inPtr[index];
			}
		}
		horizontal[i] = horizontal[i]/(dims[1]*dims[2]);
    }

	//subtract horizontal average
    for (i=0; i<dims[0]; i++) { 
    	for (j=0; j<dims[1]; j++) {
			for (k=0; k<dims[2]; k++) {
				index = k*(dims[1]*dims[0]) + j*dims[0] + i;
				new_scalars -> InsertNextTuple ((scalars -> GetScalar(index)) - horizontal[i]);
			}
		}
    }

	if (this->GetNormalize()) {
		// compute sigma
	    for (i=0; i<dims[0]; i++) { 
			horizontal_sigma[i] = 0.0;
 			for (j=0; j<dims[1]; j++) {
				for (k=0; k<dims[2]; k++) {
	 				index = k*(dims[1]*dims[0]) + j*dims[0] + i;
   					horizontal_sigma[i] += (scalars -> GetComponent(index, 1))*(GetComponent(index, 1));
				}
    		}
  			horizontal_sigma[i] /= (dims[1]*dims[2]-1);
  			horizontal_sigma[i] = sqrt(horizontal_sigma[i]);	
		}
		
		// now normalize
	    for (i=0; i<dims[0]; i++) { 
 			for (j=0; j<dims[1]; j++) {
				for (k=0; k<dims[2]; k++) {
	 				index = k*(dims[1]*dims[0]) + j*dims[0] + i;
   					//outPtr[index] /= horizontal_sigma[i];
					new_scalars -> InsertNextTuple((new_scalars -> GetScalar(index)) /= horizontal_sigma[i])
				}
    		}
 		}
	}

	delete [] horizontal;
	delete [] horizontal_sigma;
	
	//now set output
	output -> CopyStructure(input);
	output -> SetScalars (new_scalars);

		
	
	iPtr->Delete();
    oPtr->Delete();
    delete [] inPtr;
    delete [] outPtr;


}

#ifndef __vtkHorizontalAverage_h
#define __vtkHorizontalAverage_h

#include <vtkDataSetToStructuredGridFilter.h>

class VTK_EXPORT vtkHorizontalAverage : public vtkDataSetToStructuredGridFilter 
{ public:
  static vtkHorizontalAverage *New();
 // vtkStandardNewMacro(vtkHorizontalAverage);
  vtkTypeMacro(vtkHorizontalAverage,vtkDataSetToStructuredGridFilter);
  vtkSetMacro(Normalize,int);
  vtkGetMacro(Normalize,int);
  vtkBooleanMacro(Normalize, int);
  void PrintSelf(ostream&, vtkIndent);

  protected: vtkHorizontalAverage();
		    ~vtkHorizontalAverage(){};
			
		     int Normalize;
 
			 void operator=(const vtkHorizontalAverage&) {};
			 void Execute();
};
#endif
_______________________________________________
ParaView mailing list
[email protected]
http://www.paraview.org/mailman/listinfo/paraview

Reply via email to