Added functions for changing the geometry and material props of the reduced model
This commit is contained in:
parent
a7fdf431dd
commit
0cb175e72e
102
reducedmodel.cpp
102
reducedmodel.cpp
|
@ -1,24 +1,94 @@
|
||||||
#include "reducedmodel.hpp"
|
#include "reducedmodel.hpp"
|
||||||
|
|
||||||
void ReducedModel::constructReducedModelBaseTriangleGeometry()
|
ReducedModel::ReducedModel() : PatternGeometry({1, 0, 0, 2, 1, 2, 1}, {{0, 3}})
|
||||||
{
|
|
||||||
std::vector<vcg::Point3d> vertices{{0, 0, 0},
|
|
||||||
{-0.1666666666666666, -0.2886751345948129, 0},
|
|
||||||
{-0.3333333333333333, -0.5773502691896257, 0},
|
|
||||||
{0, -0.8660254037844387, 0},
|
|
||||||
{0.3333333333333333, -0.5773502691896258, 0},
|
|
||||||
{0.1666666666666666, -0.288675134594813, 0},
|
|
||||||
{0, -0.3333333, 0}};
|
|
||||||
std::vector<vcg::Point2i> edges{{0, 3}};
|
|
||||||
add(vertices, edges);
|
|
||||||
|
|
||||||
updateBaseTriangle();
|
{
|
||||||
interfaceNodeIndex = 3;
|
interfaceNodeIndex = 3;
|
||||||
vcg::tri::UpdateTopology<PatternGeometry>::VertexEdge(*this);
|
label = "ReducedModel";
|
||||||
vcg::tri::UpdateTopology<PatternGeometry>::EdgeEdge(*this);
|
// constexpr double initialHexSize = 0.3;
|
||||||
|
// CoordType movableVertex_barycentric(1 - initialHexSize, initialHexSize / 2, initialHexSize / 2);
|
||||||
|
// const vcg::Triangle3<double> &baseTriangle = getBaseTriangle();
|
||||||
|
// vert[0].P() = baseTriangle.cP(0) * movableVertex_barycentric[0]
|
||||||
|
// + baseTriangle.cP(1) * movableVertex_barycentric[1]
|
||||||
|
// + baseTriangle.cP(2) * movableVertex_barycentric[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
ReducedModel::ReducedModel()
|
void ReducedModel::updateBaseTriangleGeometry_theta(const double &newTheta_deg)
|
||||||
{
|
{
|
||||||
constructReducedModelBaseTriangleGeometry();
|
const CoordType baseTriangleHexagonVertexPosition = vert[0].cP();
|
||||||
|
|
||||||
|
const CoordType thetaRotatedHexagonBaseTriangleVertexPosition
|
||||||
|
= vcg::RotationMatrix(PatternGeometry::DefaultNormal, vcg::math::ToRad(newTheta_deg))
|
||||||
|
* baseTriangleHexagonVertexPosition;
|
||||||
|
vert[0].P() = thetaRotatedHexagonBaseTriangleVertexPosition;
|
||||||
|
|
||||||
|
// constexpr int fanSize = 6;
|
||||||
|
// for (int rotationCounter = 0; rotationCounter < /*ReducedModelOptimizer::*/ fanSize;
|
||||||
|
// rotationCounter++) {
|
||||||
|
// vert[2 * rotationCounter].P() = vcg::RotationMatrix(PatternGeometry::DefaultNormal,
|
||||||
|
// vcg::math::ToRad(60.0 * rotationCounter))
|
||||||
|
// * thetaRotatedHexagonBaseTriangleVertexPosition;
|
||||||
|
// }
|
||||||
|
updateEigenEdgeAndVertices();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReducedModel::updateBaseTriangleGeometry_R(const double &newR)
|
||||||
|
{
|
||||||
|
const CoordType barycentricCoordinates_hexagonBaseTriangleVertex(1 - newR, newR / 2, newR / 2);
|
||||||
|
const vcg::Triangle3<double> &baseTriangle = getBaseTriangle();
|
||||||
|
const CoordType hexagonBaseTriangleVertexPosition
|
||||||
|
= baseTriangle.cP(0) * barycentricCoordinates_hexagonBaseTriangleVertex[0]
|
||||||
|
+ baseTriangle.cP(1) * barycentricCoordinates_hexagonBaseTriangleVertex[1]
|
||||||
|
+ baseTriangle.cP(2) * barycentricCoordinates_hexagonBaseTriangleVertex[2];
|
||||||
|
vert[0].P() = hexagonBaseTriangleVertexPosition;
|
||||||
|
|
||||||
|
// constexpr int fanSize = 6;
|
||||||
|
// for (int rotationCounter = 0; rotationCounter < /*ReducedModelOptimizer::*/ fanSize;
|
||||||
|
// rotationCounter++) {
|
||||||
|
// vert[2 * rotationCounter].P() = vcg::RotationMatrix(PatternGeometry::DefaultNormal,
|
||||||
|
// vcg::math::ToRad(60.0 * rotationCounter))
|
||||||
|
// * hexagonBaseTriangleVertexPosition;
|
||||||
|
// // std::cout << vert[2 * rotationCounter].P()[0] << " " << vert[2 * rotationCounter].P()[1]
|
||||||
|
// // << " " << vert[2 * rotationCounter].P()[2] << std::endl;
|
||||||
|
// }
|
||||||
|
updateEigenEdgeAndVertices();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReducedModel::updateBaseTriangleGeometry_theta(
|
||||||
|
const double &newTheta_deg, std::shared_ptr<VCGEdgeMesh> &pReducedModel_edgeMesh)
|
||||||
|
{
|
||||||
|
std::dynamic_pointer_cast<ReducedModel>(pReducedModel_edgeMesh)
|
||||||
|
->updateBaseTriangleGeometry_theta(newTheta_deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReducedModel::updateBaseTriangleGeometry_R(const double &newR,
|
||||||
|
std::shared_ptr<VCGEdgeMesh> &pReducedModel_edgeMesh)
|
||||||
|
{
|
||||||
|
std::dynamic_pointer_cast<ReducedModel>(pReducedModel_edgeMesh)
|
||||||
|
->updateBaseTriangleGeometry_R(newR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReducedModel::createFan(const size_t &fanSize)
|
||||||
|
{
|
||||||
|
deleteDanglingVertices();
|
||||||
|
PatternGeometry rotatedPattern;
|
||||||
|
vcg::tri::Append<PatternGeometry, PatternGeometry>::MeshCopy(rotatedPattern, *this);
|
||||||
|
for (int rotationCounter = 1; rotationCounter < fanSize; rotationCounter++) {
|
||||||
|
vcg::Matrix44d R;
|
||||||
|
auto rotationAxis = PatternGeometry::DefaultNormal;
|
||||||
|
R.SetRotateDeg(360.0 / fanSize, rotationAxis);
|
||||||
|
vcg::tri::UpdatePosition<PatternGeometry>::Matrix(rotatedPattern, R);
|
||||||
|
vcg::tri::Append<PatternGeometry, PatternGeometry>::Mesh(*this, rotatedPattern);
|
||||||
|
//For the reduced model we also need to connect to neighbouring base triangles of the fan
|
||||||
|
if (rotationCounter == fanSize - 1) {
|
||||||
|
vcg::tri::Allocator<PatternGeometry>::AddEdge(*this,
|
||||||
|
0,
|
||||||
|
this->VN() - rotatedPattern.VN());
|
||||||
|
}
|
||||||
|
vcg::tri::Allocator<PatternGeometry>::AddEdge(*this,
|
||||||
|
this->VN() - 2 * rotatedPattern.VN(),
|
||||||
|
this->VN() - rotatedPattern.VN());
|
||||||
|
removeDuplicateVertices();
|
||||||
|
updateEigenEdgeAndVertices();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,10 +5,16 @@
|
||||||
|
|
||||||
class ReducedModel : public PatternGeometry
|
class ReducedModel : public PatternGeometry
|
||||||
{
|
{
|
||||||
void constructReducedModelBaseTriangleGeometry();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ReducedModel();
|
ReducedModel();
|
||||||
|
void updateBaseTriangleGeometry_theta(const double &newTheta_deg);
|
||||||
|
void updateBaseTriangleGeometry_R(const double &newR);
|
||||||
|
static void updateBaseTriangleGeometry_theta(
|
||||||
|
const double &newTheta_deg, std::shared_ptr<VCGEdgeMesh> &pReducedModel_edgeMesh);
|
||||||
|
static void updateBaseTriangleGeometry_R(const double &newR,
|
||||||
|
std::shared_ptr<VCGEdgeMesh> &pReducedModel_edgeMesh);
|
||||||
|
void createFan(const size_t &fanSize = 6) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // REDUCEDMODEL_HPP
|
#endif // REDUCEDMODEL_HPP
|
||||||
|
|
Loading…
Reference in New Issue