/*========================================================================= Program: Visualization Toolkit Module: vtkQuadric.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkQuadric.h" #include "vtkObjectFactory.h" vtkStandardNewMacro(vtkQuadric); // Construct quadric with all coefficients = 1. vtkQuadric::vtkQuadric() { for ( int i = 0; i < 10; i++ ) { this->Coefficients[i] = 1.0; } } // Set the 10 coefficients of the quadric equation. void vtkQuadric::SetCoefficients(double a[10]) { bool changed = false; // Check if at least one coefficient really changed for ( int i = 0; i < 10; i++ ) { if ( a[i] != this->Coefficients[i] ) { changed = true; break; } } if ( changed ) { memcpy(this->Coefficients, a, 10 * sizeof(double)); this->Modified(); } } // Set the 10 coefficients of the quadric equation. void vtkQuadric::SetCoefficients(double a0, double a1, double a2, double a3, double a4, double a5, double a6, double a7, double a8, double a9) { double a[10]; a[0] = a0; a[1] = a1; a[2] = a2; a[3] = a3; a[4] = a4; a[5] = a5; a[6] = a6; a[7] = a7; a[8] = a8; a[9] = a9; vtkQuadric::SetCoefficients(a); } // Evaluate quadric equation. double vtkQuadric::EvaluateFunction(double x[3]) { double *a = this->Coefficients; return ( a[0]*x[0]*x[0] + a[1]*x[1]*x[1] + a[2]*x[2]*x[2] + a[3]*x[0]*x[1] + a[4]*x[1]*x[2] + a[5]*x[0]*x[2] + a[6]*x[0] + a[7]*x[1] + a[8]*x[2] + a[9] ); } // Evaluate the gradient to the quadric equation. void vtkQuadric::EvaluateGradient(double x[3], double n[3]) { double *a = this->Coefficients; n[0] = 2.0*a[0]*x[0] + a[3]*x[1] + a[5]*x[2] + a[6]; n[1] = 2.0*a[1]*x[1] + a[3]*x[0] + a[4]*x[2] + a[7]; n[2] = 2.0*a[2]*x[2] + a[4]*x[1] + a[5]*x[0] + a[8]; } void vtkQuadric::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "Coefficients: " << "\n\ta0: " << this->Coefficients[0] << "\n\ta1: " << this->Coefficients[1] << "\n\ta2: " << this->Coefficients[2] << "\n\ta3: " << this->Coefficients[3] << "\n\ta4: " << this->Coefficients[4] << "\n\ta5: " << this->Coefficients[5] << "\n\ta6: " << this->Coefficients[6] << "\n\ta7: " << this->Coefficients[7] << "\n\ta8: " << this->Coefficients[8] << "\n\ta9: " << this->Coefficients[9] << "\n"; }