//
#include "VTKViewer_ArcBuilder.h"
-#include <math.h>
+#include <cmath>
#include <float.h>
//VTK includes
#define ANGLE_PRECISION 0.5
//#define _MY_DEBUG_
+#include <limits>
#ifdef _MY_DEBUG_
#include <iostream>
#endif
-
bool CheckAngle(const double compare, const double angle){
if((angle <= compare - ANGLE_PRECISION) || (angle >= compare + ANGLE_PRECISION))
return true;
const double Zv)
{
double D = sqrt (Xv * Xv + Yv * Yv + Zv * Zv);
- if(D != 0) {
+ if(D > std::numeric_limits<double>::min() ) {
coord.SetX(Xv / D);
coord.SetY(Yv / D);
coord.SetZ(Zv / D);
}
+ else {
+ coord.SetX(0);
+ coord.SetY(0);
+ coord.SetZ(0);
+ }
}
/*!
double x = GetXYZ().Y()*Other.GetXYZ().Z() - GetXYZ().Z()*Other.GetXYZ().Y();
double y = GetXYZ().Z()*Other.GetXYZ().X() - GetXYZ().X()*Other.GetXYZ().Z();
double z = GetXYZ().X()*Other.GetXYZ().Y() - GetXYZ().Y()*Other.GetXYZ().X();
- Vec *aRes = new Vec(x,y,z);
- return *aRes;
+ return Vec(x,y,z);
}
/*---------------------Class Plane --------------------------------*/
aInputPnts.push_back(thePnt2);
aInputPnts.push_back(thePnt3);
- vtkUnstructuredGrid* aGrid = BuildGrid(aInputPnts);
+ vtkSmartPointer<vtkUnstructuredGrid> aGrid = BuildGrid(aInputPnts);
+ aGrid->Delete();
bool needRotation = true;
if(anAngle == 0 || anAngle == 180)
needRotation = false;
if(aGrid) {
- vtkUnstructuredGrid* aTransformedGrid;
if(needRotation) {
- aTransformedGrid = TransformGrid(aGrid,aAxis,anAngle);
+ aGrid = TransformGrid(aGrid,aAxis,anAngle);
+ aGrid->Delete();
#ifdef _MY_DEBUG_
cout<<"Need Rotation!!!"<<endl;
#endif
}
else {
- aTransformedGrid = aGrid;
#ifdef _MY_DEBUG_
cout<<"Rotation does not need!!!"<<endl;
#endif
}
double coords[3];
- aTransformedGrid->GetPoint(0,coords);
+ aGrid->GetPoint(0,coords);
myPnt1 = Pnt(coords[0],coords[1],coords[2], thePnt1.GetScalarValue());
- aTransformedGrid->GetPoint(1,coords);
+ aGrid->GetPoint(1,coords);
myPnt2 = Pnt(coords[0],coords[1],coords[2], thePnt2.GetScalarValue());
- aTransformedGrid->GetPoint(2,coords);
+ aGrid->GetPoint(2,coords);
myPnt3 = Pnt(coords[0],coords[1],coords[2], thePnt3.GetScalarValue());
- std::vector<double> aScalarValues;
- vtkUnstructuredGrid* anArc = BuildArc(aScalarValues);
- vtkUnstructuredGrid* anTransArc;
- if(needRotation)
- anTransArc = TransformGrid(anArc,aAxis,-anAngle);
- else
- anTransArc = anArc;
-
- myPoints = anTransArc->GetPoints();
- myScalarValues = aScalarValues;
+
+ vtkSmartPointer<vtkUnstructuredGrid> anArc = BuildArc(myScalarValues);
+ anArc->Delete();
+ if(needRotation) {
+ anArc = TransformGrid(anArc,aAxis,-anAngle);
+ anArc->Delete();
+ }
+ myPoints = anArc->GetPoints();
myStatus = Arc_Done;
}
}
aList.push_back(thePnt3);
vtkUnstructuredGrid* aGrid = BuildGrid(aList);
myPoints = aGrid->GetPoints();
+ aGrid->Delete();
myScalarValues.clear();
myScalarValues.push_back(thePnt1.GetScalarValue());
return value;
}
-vtkUnstructuredGrid* VTKViewer_ArcBuilder::BuildArc(std::vector<double>& theScalarValues){
+vtkUnstructuredGrid* VTKViewer_ArcBuilder::BuildArc(std::vector<double>& theScalarValues)
+{
double x1 = myPnt1.GetXYZ().X(); double x2 = myPnt2.GetXYZ().X(); double x3 = myPnt3.GetXYZ().X();
double y1 = myPnt1.GetXYZ().Y(); double y2 = myPnt2.GetXYZ().Y(); double y3 = myPnt3.GetXYZ().Y();
double z = myPnt1.GetXYZ().Z(); //Points on plane || XOY
vtkPoints* aPoints = aBuilder.GetPoints();
std::vector<double> aScalarValues = aBuilder.GetScalarValues();
vtkIdType aNbPts = aPoints->GetNumberOfPoints();
- aNewPoints = new vtkIdType[aNbPts];
+ std::vector< vtkIdType > aNewPoints( aNbPts );
vtkIdType curID;
vtkIdType aCellType = VTK_POLY_LINE;
-
+
aNewPoints[0] = pts[0];
for(vtkIdType idx = 1; idx < aNbPts-1;idx++) {
curID = output->GetPoints()->InsertNextPoint(aPoints->GetPoint(idx));
aNewPoints[idx] = curID;
}
aNewPoints[aNbPts-1] = pts[1];
-
- aResult = output->InsertNextCell(aCellType,aNbPts,aNewPoints);
+
+ aResult = output->InsertNextCell(aCellType,aNbPts,&aNewPoints[0]);
return aResult;
- }
+ }
}
/*!
* Add all points from the input vector theCollection into thePoints.
* Array theIds - it is array with ids of added points.
*/
-vtkIdType MergevtkPoints(const std::vector<vtkPoints*>& theCollection,
+vtkIdType MergevtkPoints(const std::vector< vtkSmartPointer< vtkPoints > >& theCollection,
const std::vector< std::vector<double> >& theScalarCollection,
vtkPoints* thePoints,
std::map<int, double>& thePntId2ScalarValue,
vtkIdType aNbPoints = 0;
vtkIdType anIdCounter = 0;
vtkIdType aNewPntId = 0;
-
+
//Compute number of points
- std::vector<vtkPoints*>::const_iterator it = theCollection.begin();
+ std::vector< vtkSmartPointer< vtkPoints > >::const_iterator it = theCollection.begin();
for(;it != theCollection.end();it++){
vtkPoints* aPoints = *it;
if(aPoints) {
}
case VTK_TETRA: {
#ifdef SHOW_COINCIDING_3D_PAL21924
- faceIdsTmp->Reset();
- for (int ai=0; ai<npts; ai++)
- faceIdsTmp->InsertNextId(pts[ai]);
- input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
+ faceIdsTmp->Reset();
+ for (int ai=0; ai<npts; ai++)
+ faceIdsTmp->InsertNextId(pts[ai]);
+ input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
#endif
for (faceId = 0; faceId < 4; faceId++)
{
numFacePts = 3;
input->GetCellNeighbors(cellId, faceIds, cellIds);
#ifdef SHOW_COINCIDING_3D_PAL21924
- int nbNeighbors = 0;
- for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
- if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
- }
+ int nbNeighbors = 0;
+ for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
+ if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
+ }
bool process = nbNeighbors <= 0;
#else
bool process = cellIds->GetNumberOfIds() <= 0 || GetAppendCoincident3D();
}
case VTK_VOXEL: {
#ifdef SHOW_COINCIDING_3D_PAL21924
- faceIdsTmp->Reset();
- for (int ai=0; ai<npts; ai++)
- faceIdsTmp->InsertNextId(pts[ai]);
- input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
+ faceIdsTmp->Reset();
+ for (int ai=0; ai<npts; ai++)
+ faceIdsTmp->InsertNextId(pts[ai]);
+ input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
#endif
for (faceId = 0; faceId < 6; faceId++)
{
numFacePts = 4;
input->GetCellNeighbors(cellId, faceIds, cellIds);
#ifdef SHOW_COINCIDING_3D_PAL21924
- int nbNeighbors = 0;
- for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
- if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
- }
+ int nbNeighbors = 0;
+ for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
+ if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
+ }
bool process = nbNeighbors <= 0;
#else
bool process = cellIds->GetNumberOfIds() <= 0 || GetAppendCoincident3D();
}
case VTK_HEXAHEDRON: {
#ifdef SHOW_COINCIDING_3D_PAL21924
- faceIdsTmp->Reset();
- for (int ai=0; ai<npts; ai++)
- faceIdsTmp->InsertNextId(pts[ai]);
- input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
+ faceIdsTmp->Reset();
+ for (int ai=0; ai<npts; ai++)
+ faceIdsTmp->InsertNextId(pts[ai]);
+ input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
#endif
for (faceId = 0; faceId < 6; faceId++)
{
numFacePts = 4;
input->GetCellNeighbors(cellId, faceIds, cellIds);
#ifdef SHOW_COINCIDING_3D_PAL21924
- int nbNeighbors = 0;
- for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
- if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
- }
+ int nbNeighbors = 0;
+ for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
+ if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
+ }
bool process = nbNeighbors <= 0;
#else
bool process = cellIds->GetNumberOfIds() <= 0 || GetAppendCoincident3D();
}
case VTK_WEDGE: {
#ifdef SHOW_COINCIDING_3D_PAL21924
- faceIdsTmp->Reset();
- for (int ai=0; ai<npts; ai++)
- faceIdsTmp->InsertNextId(pts[ai]);
- input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
+ faceIdsTmp->Reset();
+ for (int ai=0; ai<npts; ai++)
+ faceIdsTmp->InsertNextId(pts[ai]);
+ input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
#endif
for (faceId = 0; faceId < 5; faceId++)
{
input->GetCellNeighbors(cellId, faceIds, cellIds);
#ifdef SHOW_COINCIDING_3D_PAL21924
- int nbNeighbors = 0;
- for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
- if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
- }
+ int nbNeighbors = 0;
+ for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
+ if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
+ }
bool process = nbNeighbors <= 0;
#else
bool process = cellIds->GetNumberOfIds() <= 0 || GetAppendCoincident3D();
}
case VTK_HEXAGONAL_PRISM: {
#ifdef SHOW_COINCIDING_3D_PAL21924
- faceIdsTmp->Reset();
- for (int ai=0; ai<npts; ai++)
- faceIdsTmp->InsertNextId(pts[ai]);
- input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
+ faceIdsTmp->Reset();
+ for (int ai=0; ai<npts; ai++)
+ faceIdsTmp->InsertNextId(pts[ai]);
+ input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
#endif
for (faceId = 0; faceId < 8; faceId++)
{
}
input->GetCellNeighbors(cellId, faceIds, cellIds);
#ifdef SHOW_COINCIDING_3D_PAL21924
- int nbNeighbors = 0;
- for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
- if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
- }
+ int nbNeighbors = 0;
+ for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
+ if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
+ }
bool process = nbNeighbors <= 0;
#else
bool process = cellIds->GetNumberOfIds() <= 0 || GetAppendCoincident3D();
}
case VTK_PYRAMID: {
#ifdef SHOW_COINCIDING_3D_PAL21924
- faceIdsTmp->Reset();
- for (int ai=0; ai<npts; ai++)
- faceIdsTmp->InsertNextId(pts[ai]);
- input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
+ faceIdsTmp->Reset();
+ for (int ai=0; ai<npts; ai++)
+ faceIdsTmp->InsertNextId(pts[ai]);
+ input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
#endif
for (faceId = 0; faceId < 5; faceId++)
{
}
input->GetCellNeighbors(cellId, faceIds, cellIds);
#ifdef SHOW_COINCIDING_3D_PAL21924
- int nbNeighbors = 0;
- for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
- if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
- }
+ int nbNeighbors = 0;
+ for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
+ if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
+ }
bool process = nbNeighbors <= 0;
#else
bool process = cellIds->GetNumberOfIds() <= 0 || GetAppendCoincident3D();
int idp = 0;
input->GetFaceStream(cellId, nFaces, ptIds);
#ifdef SHOW_COINCIDING_3D_PAL21924
- faceIdsTmp->Reset();
- for (int ai=0; ai<npts; ai++)
- faceIdsTmp->InsertNextId(pts[ai]);
- input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
+ faceIdsTmp->Reset();
+ for (int ai=0; ai<npts; ai++)
+ faceIdsTmp->InsertNextId(pts[ai]);
+ input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
#endif
for (faceId = 0; faceId < nFaces; faceId++)
{
// TODO understand and fix display of several polyhedrons
input->GetCellNeighbors(cellId, faceIds, cellIds);
#ifdef SHOW_COINCIDING_3D_PAL21924
- int nbNeighbors = 0;
- for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
- if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
- }
- bool process = nbNeighbors <= 0;
+ int nbNeighbors = 0;
+ for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
+ if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
+ }
+ bool process = nbNeighbors <= 0;
#else
- bool process = cellIds->GetNumberOfIds() <= 0 || GetAppendCoincident3D();
+ bool process = cellIds->GetNumberOfIds() <= 0 || GetAppendCoincident3D();
#endif
if (process || myShowInside
|| (!allVisible && !cellVis[cellIds->GetId(0)]))
else //3D nonlinear cell
{
#ifdef SHOW_COINCIDING_3D_PAL21924
- faceIdsTmp->Reset();
- int npts1 = 0;
- switch (aCellType ){
- case VTK_QUADRATIC_TETRA: npts1 = 4; break;
- case VTK_QUADRATIC_HEXAHEDRON: npts1 = 8; break;
- case VTK_TRIQUADRATIC_HEXAHEDRON: npts1 = 8; break;
- case VTK_QUADRATIC_WEDGE: npts1 = 6; break;
- case VTK_QUADRATIC_PYRAMID: npts1 = 5; break;
- }
- if ( npts1 > 0 ) {
- for (int ai=0; ai<npts; ai++)
- faceIdsTmp->InsertNextId(pts[ai]);
- input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
- }
+ faceIdsTmp->Reset();
+ int npts1 = 0;
+ switch (aCellType ){
+ case VTK_QUADRATIC_TETRA: npts1 = 4; break;
+ case VTK_QUADRATIC_HEXAHEDRON: npts1 = 8; break;
+ case VTK_TRIQUADRATIC_HEXAHEDRON: npts1 = 8; break;
+ case VTK_QUADRATIC_WEDGE: npts1 = 6; break;
+ case VTK_QUADRATIC_PYRAMID: npts1 = 5; break;
+ }
+ if ( npts1 > 0 ) {
+ for (int ai=0; ai<npts; ai++)
+ faceIdsTmp->InsertNextId(pts[ai]);
+ input->GetCellNeighbors(cellId, faceIdsTmp, cellIdsTmp);
+ }
#endif
aCellType = VTK_TRIANGLE;
numFacePts = 3;
vtkCell *face = cell->GetFace(j);
input->GetCellNeighbors(cellId, face->PointIds, cellIds);
#ifdef SHOW_COINCIDING_3D_PAL21924
- int nbNeighbors = 0;
- for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
- if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
- }
- bool process = nbNeighbors <= 0;
+ int nbNeighbors = 0;
+ for(int ai=0;ai<cellIds->GetNumberOfIds();ai++) {
+ if (cellIdsTmp->IsId(cellIds->GetId(ai)) == -1) nbNeighbors++;
+ }
+ bool process = nbNeighbors <= 0;
#else
- bool process = cellIds->GetNumberOfIds() <= 0 || GetAppendCoincident3D();
+ bool process = cellIds->GetNumberOfIds() <= 0 || GetAppendCoincident3D();
#endif
if ( process || myShowInside ) {
face->Triangulate(0,lpts,coords);
vtkUnstructuredGrid* input,
vtkPolyData *output,
TMapOfVectorId& theDimension2VTK2ObjIds,
- bool triangulate){
+ bool triangulate)
+{
vtkIdType aCellType = VTK_POLYGON;
vtkIdType *aNewPoints = NULL;
vtkIdType aNbPoints = 0;
vtkDataArray* inputScalars = input->GetPointData()->GetScalars();
vtkDataArray* outputScalars = output->GetPointData()->GetScalars();
- std::vector<vtkPoints*> aCollection;
+ std::vector< vtkSmartPointer<vtkPoints> > aCollection;
std::vector< std::vector<double> > aScalarCollection;
vtkCell* aCell = input->GetCell(cellId);