fix relaxation + radius arg

This commit is contained in:
CookieKastanie 2022-03-15 15:24:30 +01:00
parent d31d9629f0
commit a60191b068
4 changed files with 42 additions and 12 deletions

View File

@ -16,6 +16,7 @@
#include <vtkXMLUnstructuredGridReader.h> #include <vtkXMLUnstructuredGridReader.h>
#include <vtkXMLUnstructuredGridWriter.h> #include <vtkXMLUnstructuredGridWriter.h>
#include <vtksys/SystemTools.hxx> #include <vtksys/SystemTools.hxx>
#include <string>
#ifdef USE_VIEWER #ifdef USE_VIEWER
#include <vtkCamera.h> #include <vtkCamera.h>
@ -58,11 +59,16 @@ vtkSmartPointer<vtkAlgorithm> readerFromFileName(const char *fileName) {
int main(int argc, char **argv) { int main(int argc, char **argv) {
if (argc != 3) { if (argc < 3 || argc > 5) {
std::cerr << "Usage: " << argv[0] << " tetmesh polydata" << std::endl; std::cerr << "Usage: " << argv[0] << " tetmesh polydata [radiusScale]" << std::endl;
return EXIT_FAILURE; return EXIT_FAILURE;
} }
double radiusScale = 2.;
if(argc == 4) {
radiusScale = std::stod(argv[3]);
}
auto tetMeshReader = readerFromFileName(argv[1]); auto tetMeshReader = readerFromFileName(argv[1]);
auto polyMeshReader = readerFromFileName(argv[2]); auto polyMeshReader = readerFromFileName(argv[2]);
@ -77,6 +83,7 @@ int main(int argc, char **argv) {
removeExternalCellsFilter->GetOutputPort()); removeExternalCellsFilter->GetOutputPort());
vtkNew<ProjectSurfacePointsOnPoly> project; vtkNew<ProjectSurfacePointsOnPoly> project;
project->SetRadiusScale(radiusScale);
project->SetInputConnection(0, surfacePointsFilter->GetOutputPort()); project->SetInputConnection(0, surfacePointsFilter->GetOutputPort());
project->SetInputConnection(1, polyMeshReader->GetOutputPort()); project->SetInputConnection(1, polyMeshReader->GetOutputPort());

View File

@ -9,9 +9,6 @@
#include <vtkCellIterator.h> #include <vtkCellIterator.h>
#include <vtkInformation.h> #include <vtkInformation.h>
#include <vtkInformationVector.h> #include <vtkInformationVector.h>
#include <vtkPolyData.h>
#include <vtkKdTree.h>
#include <vtkStaticCellLinks.h>
#include <vtkDoubleArray.h> #include <vtkDoubleArray.h>
#include <limits> #include <limits>
@ -22,6 +19,8 @@ vtkStandardNewMacro(ProjectSurfacePointsOnPoly);
ProjectSurfacePointsOnPoly::ProjectSurfacePointsOnPoly() { ProjectSurfacePointsOnPoly::ProjectSurfacePointsOnPoly() {
SetNumberOfInputPorts(2); SetNumberOfInputPorts(2);
RadiusScale = 2.;
} }
@ -84,7 +83,7 @@ void findPointsWithinRadius(double radius, vtkPointSet *pointSet,
} }
static void moveSurfacePoint(vtkUnstructuredGrid *tetMesh, void ProjectSurfacePointsOnPoly::moveSurfacePoint(vtkUnstructuredGrid *tetMesh,
vtkPolyData *polyMesh, vtkPolyData *polyMesh,
vtkIdType pointId, vtkIdType pointId,
std::vector<double> &motionVectors, std::vector<double> &motionVectors,
@ -96,11 +95,9 @@ static void moveSurfacePoint(vtkUnstructuredGrid *tetMesh,
double direction[3]; double direction[3];
double distance; double distance;
double radiusScale = 5.;
closestPolyMeshPoint(polyMesh, point, kdTree, links, direction, &distance); closestPolyMeshPoint(polyMesh, point, kdTree, links, direction, &distance);
vtkNew<vtkIdList> affectedPoints; vtkNew<vtkIdList> affectedPoints;
findPointsWithinRadius(distance * radiusScale, tetMesh, point, affectedPoints); findPointsWithinRadius(distance * RadiusScale, tetMesh, point, affectedPoints);
// kdTree->FindPointsWithinRadius(distance * radiusScale, point, affectedPoints); // kdTree->FindPointsWithinRadius(distance * radiusScale, point, affectedPoints);
if(distance > 0) for (vtkIdType j = 0; j < affectedPoints->GetNumberOfIds(); j++) { if(distance > 0) for (vtkIdType j = 0; j < affectedPoints->GetNumberOfIds(); j++) {
@ -111,7 +108,7 @@ static void moveSurfacePoint(vtkUnstructuredGrid *tetMesh,
// if(dist2 > (distance * radiusScale) * (distance * radiusScale)) continue; // if(dist2 > (distance * radiusScale) * (distance * radiusScale)) continue;
double motion[3] = {direction[0], direction[1], direction[2]}; double motion[3] = {direction[0], direction[1], direction[2]};
double factor = 1. - std::sqrt(dist2) / (distance * radiusScale); double factor = 1. - std::sqrt(dist2) / (distance * RadiusScale);
vtkMath::MultiplyScalar(motion, factor); vtkMath::MultiplyScalar(motion, factor);
//std::cout << std::sqrt(dist2) << " " << (distance * radiusScale) << " " << factor << "\n"; //std::cout << std::sqrt(dist2) << " " << (distance * radiusScale) << " " << factor << "\n";
motionVectors[affectedPointId * 3 + 0] += motion[0]; motionVectors[affectedPointId * 3 + 0] += motion[0];

View File

@ -3,7 +3,10 @@
#include <vtkUnstructuredGridAlgorithm.h> #include <vtkUnstructuredGridAlgorithm.h>
#include <vtkIdList.h> #include <vtkIdList.h>
#include <vector>
#include <vtkPolyData.h>
#include <vtkKdTree.h>
#include <vtkStaticCellLinks.h>
class ProjectSurfacePointsOnPoly : public vtkUnstructuredGridAlgorithm { class ProjectSurfacePointsOnPoly : public vtkUnstructuredGridAlgorithm {
public: public:
@ -17,9 +20,20 @@ public:
vtkSetMacro(affectedNeighborsCount, int); vtkSetMacro(affectedNeighborsCount, int);
vtkGetMacro(affectedNeighborsCount, int); vtkGetMacro(affectedNeighborsCount, int);
vtkSetMacro(RadiusScale, double);
protected: protected:
int affectedNeighborsCount = 0; int affectedNeighborsCount = 0;
double RadiusScale;
~ProjectSurfacePointsOnPoly() override = default; ~ProjectSurfacePointsOnPoly() override = default;
void moveSurfacePoint(vtkUnstructuredGrid *tetMesh,
vtkPolyData *polyMesh,
vtkIdType pointId,
std::vector<double> &motionVectors,
std::vector<unsigned> &numberOfAffectors,
vtkKdTree *kdTree,
vtkStaticCellLinks *links);
}; };

View File

@ -30,13 +30,21 @@ vtkTypeBool RelaxationFilter::RequestData(
std::set<vtkIdType> neighbors; std::set<vtkIdType> neighbors;
output->BuildLinks(); output->BuildLinks();
double avg[3]; double avg[3];
for (vtkIdType i = 0; i < output->GetNumberOfPoints(); i++) { for (vtkIdType i = 0; i < output->GetNumberOfPoints(); i++) {
if (!isSurface->GetValue(i)) continue;
output->GetPointCells(i, neighborCells); output->GetPointCells(i, neighborCells);
if (neighborCells->GetNumberOfIds() != 0) { if (neighborCells->GetNumberOfIds() != 0) {
for (vtkIdType j = 0; j < neighborCells->GetNumberOfIds(); j++) { for (vtkIdType j = 0; j < neighborCells->GetNumberOfIds(); j++) {
vtkIdType cellId = neighborCells->GetId(j); vtkIdType cellId = neighborCells->GetId(j);
output->GetCellPoints(cellId, cellPoints); output->GetCellPoints(cellId, cellPoints);
for (vtkIdType k = 0; k < cellPoints->GetNumberOfIds(); k++) { for (vtkIdType k = 0; k < cellPoints->GetNumberOfIds(); k++) {
vtkIdType neighborId = cellPoints->GetId(k); vtkIdType neighborId = cellPoints->GetId(k);
if (isSurface->GetValue(neighborId)) { if (isSurface->GetValue(neighborId)) {
neighbors.insert(neighborId); neighbors.insert(neighborId);
@ -44,7 +52,10 @@ vtkTypeBool RelaxationFilter::RequestData(
} }
cellPoints->Reset(); cellPoints->Reset();
} }
neighbors.erase(neighbors.find(i));
if (neighbors.find(i) != neighbors.end()) {
neighbors.erase(neighbors.find(i));
}
if (neighbors.size() != 0) { if (neighbors.size() != 0) {
avg[0] = 0; avg[1] = 0; avg[2] = 0; avg[0] = 0; avg[1] = 0; avg[2] = 0;
for (const vtkIdType &j : neighbors) { for (const vtkIdType &j : neighbors) {
@ -59,6 +70,7 @@ vtkTypeBool RelaxationFilter::RequestData(
neighborCells->Reset(); neighborCells->Reset();
neighbors.clear(); neighbors.clear();
} }
output->SetPoints(newPoints); output->SetPoints(newPoints);
return true; return true;
} }