Skip to content

Commit

Permalink
persistent changes in parameters + variable nLayer
Browse files Browse the repository at this point in the history
Changes made by master students from Université de Lorraine: Joseph Schlesinger & Mathis Georgel
  • Loading branch information
David Jourdan committed Jun 25, 2024
1 parent 6e74cdb commit 5543cae
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 32 deletions.
11 changes: 6 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ file(GLOB SRCFILES
src/newton.cpp
src/parameterization.cpp
src/path_extraction.cpp
src/save.cpp
src/stripe_patterns.cpp
src/stretch_angles.cpp
src/simulation_utils.cpp)
Expand All @@ -110,7 +111,7 @@ set(EXECUTABLES
)

foreach(exec ${EXECUTABLES})
target_link_libraries(${exec} Eigen3::Eigen geometry-central polyscope TinyAD igl::core ${EXTRA_LIBS})
target_link_libraries(${exec} Eigen3::Eigen geometry-central polyscope TinyAD igl::core nlohmann_json::nlohmann_json ${EXTRA_LIBS})

# Compiler definitions and options
if(MKL_FOUND)
Expand All @@ -126,11 +127,11 @@ foreach(exec ${EXECUTABLES})
endif(SUITESPARSE_FOUND)

target_compile_definitions(${exec} PUBLIC DATA_PATH_STR="${CMAKE_CURRENT_SOURCE_DIR}/data/")
target_compile_options(${exec} PRIVATE $<$<CONFIG:RELEASE>:
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:-Ofast>
$<$<CXX_COMPILER_ID:MSVC>:/Ox>>)
# target_compile_options(${exec} PRIVATE $<$<CONFIG:RELEASE>:
# $<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:-Ofast>
# $<$<CXX_COMPILER_ID:MSVC>:/Ox>>)

# reomove annoying Polyscope-related compiler warning
# remove annoying Polyscope-related compiler warning
target_compile_options(${exec} PRIVATE
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:-Wno-nonnull>)
endforeach(exec ${EXECUTABLES})
1 change: 0 additions & 1 deletion src/constants.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#pragma once

const int nLayers = 10;
const double layerHeight = 0.08;
const double spacing = 0.4;
64 changes: 39 additions & 25 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "simulation_utils.h"
#include "stretch_angles.h"
#include "timer.h"
#include "save.h"

#include <geometrycentral/surface/manifold_surface_mesh.h>
#include <geometrycentral/surface/vertex_position_geometry.h>
Expand All @@ -23,6 +24,8 @@

#include <thread>



int main(int argc, char* argv[])
{
using namespace geometrycentral;
Expand All @@ -40,11 +43,11 @@ int main(int argc, char* argv[])
float imguiStackMargin = 10;
float rightWindowsWidth = 370;

// Material data
double lambda1 = 0.58;
double lambda2 = 1.08;
double thickness = 1.218;
double deltaLambda = 0.0226764665509417;
double lambda1, lambda2, thickness, deltaLambda, lim;
int nIter, nLayers;

// Load advanced parameters from file
loadAdvancedParams(lambda1, lambda2, thickness, deltaLambda, nLayers, nIter, lim);

// Load a mesh in OBJ format
std::string filename;
Expand Down Expand Up @@ -99,10 +102,7 @@ int main(int argc, char* argv[])
polyscope::state::userCallback = [&]() {
// parameters modifiable in the GUI
static double wD = 0.1;
static double lim = 1e-6;
static int n_iter = 1000;
static double rotAngle = 0;
static double curvature = deltaLambda / thickness / lambda1;

ImGui::PushID("user_callback");
ImGui::SetNextWindowPos(
Expand All @@ -119,7 +119,7 @@ int main(int argc, char* argv[])
auto func = parameterizationFunction(geometry, wD, lambda1, lambda2);

// optimize the parameterization function with Newton's method
newton(geometry, P, func, n_iter, lim);
newton(geometry, P, func, nIter, lim);
paramTimer.stop();

// Show resulting parametrization
Expand All @@ -145,15 +145,29 @@ int main(int argc, char* argv[])

if(ImGui::TreeNode("Advanced"))
{
ImGui::InputDouble("lambda1", &lambda1, 0, 0, "%.1e");
ImGui::InputDouble("lambda2", &lambda2, 0, 0, "%.1e");
ImGui::InputDouble("Thickness", &thickness, 0, 0, "%.1e");
if(ImGui::InputDouble("Curvature", &curvature, 0, 0, "%.1e"))
{
deltaLambda = thickness * lambda1 * curvature;
if(ImGui::InputDouble("lambda1", &lambda1, 0, 0, "%.1e")){
updateAndSaveAdvancedParams(lambda1, lambda2, thickness, deltaLambda, nLayers, nIter, lim);
}
if(ImGui::InputDouble("lambda2", &lambda2, 0, 0, "%.1e")){
updateAndSaveAdvancedParams(lambda1, lambda2, thickness, deltaLambda, nLayers, nIter, lim);
}
if(ImGui::InputDouble("Thickness", &thickness, 0, 0, "%.1e")){
updateAndSaveAdvancedParams(lambda1, lambda2, thickness, deltaLambda, nLayers, nIter, lim);
}
//if (ImGui::InputDouble("Curvature", &curvature, 0, 0, "%.1e"))
//{
// deltaLambda = thickness * lambda1 * curvature;
// updateAndSaveAdvancedParams(lambda1, lambda2, thickness, deltaLambda, n_layers, nIter, lim);
//}
if(ImGui::InputInt("Nb of layers",&nLayers)){
updateAndSaveAdvancedParams(lambda1, lambda2, thickness, deltaLambda, nLayers, nIter, lim);
}
if(ImGui::InputInt("Iterations", &nIter)){
updateAndSaveAdvancedParams(lambda1, lambda2, thickness, deltaLambda, nLayers, nIter, lim);
}
if(ImGui::InputDouble("Limit", &lim, 0, 0, "%.1e")){
updateAndSaveAdvancedParams(lambda1, lambda2, thickness, deltaLambda, nLayers, nIter, lim);
}
ImGui::InputInt("Iterations", &n_iter);
ImGui::InputDouble("Limit", &lim, 0, 0, "%.1e");
if(ImGui::Button("Rotate"))
{
// run ARAP
Expand Down Expand Up @@ -246,7 +260,7 @@ int main(int argc, char* argv[])
static double E1 = 10;
static double width = 100;
static double lim = 1e-6;
static int n_iter = 1000;
static int nIter = 1000;
static bool displayTravel = false;

ImGui::PushID("user_callback");
Expand Down Expand Up @@ -289,7 +303,7 @@ int main(int argc, char* argv[])
auto func = simulationFunction(geometry, MrInv, theta1, theta2, E1, lambda1, lambda2, deltaLambda, thickness);

// (Projected) Newton optimization
newton(geometry, V, func, n_iter, lim, true, fixedIdx, [&](const Eigen::VectorXd& X) {
newton(geometry, V, func, nIter, lim, true, fixedIdx, [&](const Eigen::VectorXd& X) {
// convert X to V for visualizing individual iterations
for(int i = 0; i < V.rows(); ++i)
for(int j = 0; j < 3; ++j)
Expand Down Expand Up @@ -337,7 +351,7 @@ int main(int argc, char* argv[])
auto adjointFunc = adjointFunction(geometry, F, MrInv, theta1, E1, lambda1, lambda2, deltaLambda, thickness);

// Optimize this energy function using SGN [Zehnder et al. 2021]
sparse_gauss_newton(geometry, V, xTarget, MrInv, theta1, theta2, adjointFunc, fixedIdx, n_iter, lim, wM, wL, E1,
sparse_gauss_newton(geometry, V, xTarget, MrInv, theta1, theta2, adjointFunc, fixedIdx, nIter, lim, wM, wL, E1,
lambda1, lambda2, deltaLambda, thickness, [&](const Eigen::VectorXd& X) {
// convert X to V for visualizing individual iterations
for(int i = 0; i < V.rows(); ++i)
Expand Down Expand Up @@ -392,7 +406,7 @@ int main(int argc, char* argv[])

trajTimer.start();
trajectoriesRun = true;
stripePattern(geometry, V, P, F, theta2, filename, timeLimit);
stripePattern(geometry, V, P, F, theta2, filename, timeLimit, 0.08, 0.4, nLayers);
trajTimer.stop();
}
ImGui::SameLine();
Expand All @@ -402,7 +416,7 @@ int main(int argc, char* argv[])

if(ImGui::TreeNode("Advanced parameters"))
{
ImGui::InputInt("Iterations", &n_iter);
ImGui::InputInt("Iterations", &nIter);
ImGui::InputDouble("Limit", &lim, 0, 0, "%.1e");
ImGui::InputDouble("E1 / E2 ratio", &E1, 0, 0, "%.0f");

Expand Down Expand Up @@ -443,7 +457,7 @@ int main(int argc, char* argv[])
ImGui::End();
}

static int lastLayer = 10;
static int lastLayer = nLayers;
if(trajectoriesRun)
{
ImGui::SetNextWindowPos(ImVec2(polyscope::view::windowWidth - (rightWindowsWidth + imguiStackMargin),
Expand All @@ -456,7 +470,7 @@ int main(int argc, char* argv[])
else
{
auto onChangeLayer = [&]() {
for(int i = 1; i <= 10; ++i)
for(int i = 1; i <= nLayers; ++i)
{
if(i == lastLayer)
{
Expand All @@ -470,7 +484,7 @@ int main(int argc, char* argv[])
}
}
};
if(ImGui::SliderInt("Layer", &lastLayer, 1, 10))
if(ImGui::SliderInt("Layer", &lastLayer, 1, lastLayer))
{
onChangeLayer();
}
Expand Down
5 changes: 4 additions & 1 deletion src/path_extraction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -320,9 +320,12 @@ void stripePattern(VertexPositionGeometry& geometry,
std::vector<std::vector<std::vector<Vector3>>> paths =
generatePaths(geometryUV, th1, th2, layerHeight, nLayers, spacing, timeLimit);

//Update height every layers
static double height = 0;
for(int i = 0; i < nLayers; ++i)
{
writePaths(filename + ".path", paths[i], (i + 1) * layerHeight);
height += layerHeight + static_cast<float>(i) / (nLayers - 1) * 2 * (0.8 / nLayers - layerHeight);
writePaths(filename + ".path", paths[i],height);
drawPathsAndTravels(paths[i], spacing, i + 1);
}
}
Expand Down
56 changes: 56 additions & 0 deletions src/save.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#include "save.h"

#include <fstream>
#include <nlohmann/json.hpp>

// Function to update and save advanced parameters to a JSON file
void updateAndSaveAdvancedParams(double lambda1, double lambda2, double thickness, double deltaLambda, int n_layers, int n_iter, double lim) {
// Create a JSON object to store advanced parameters
nlohmann::json advancedParams;
advancedParams["lambda1"] = lambda1;
advancedParams["lambda2"] = lambda2;
advancedParams["thickness"] = thickness;
advancedParams["deltaLambda"] = deltaLambda;
advancedParams["n_layers"] = n_layers;
advancedParams["n_iter"] = n_iter;
advancedParams["lim"] = lim;

// Serialize JSON to file
std::ofstream outputFile("advanced_params.json");
outputFile << advancedParams.dump(4); // dump with indentation for readability
outputFile.close();
}

// Function to load advanced parameters from a JSON file
void loadAdvancedParams(double& lambda1, double& lambda2, double& thickness, double& deltaLambda, int& n_layers, int& n_iter, double& lim) {
// Read the JSON file
std::ifstream inputFile("advanced_params.json");
if (!inputFile.is_open()) {
// Material data
lambda1 = 0.58;
lambda2 = 1.08;
thickness = 1.218;
deltaLambda = 0.0226764665509417;
n_layers = 10;
lim = 1e-6;
n_iter = 1000;
return;
}

// Parse JSON from file
nlohmann::json advancedParams;
inputFile >> advancedParams;

// Extract parameters from JSON
lambda1 = advancedParams["lambda1"];
lambda2 = advancedParams["lambda2"];
thickness = advancedParams["thickness"];
deltaLambda = advancedParams["deltaLambda"];
n_layers = advancedParams["n_layers"];
n_iter = advancedParams["n_iter"];
lim = advancedParams["lim"];

// Close the file
inputFile.close();
}

7 changes: 7 additions & 0 deletions src/save.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#pragma once

// Function to update and save advanced parameters to a JSON file
void updateAndSaveAdvancedParams(double lambda1, double lambda2, double thickness, double deltaLambda, int n_layers, int n_iter, double lim);

// Function to load advanced parameters from a JSON file
void loadAdvancedParams(double& lambda1, double& lambda2, double& thickness, double& deltaLambda, int& n_layers, int& n_iter, double& lim);
32 changes: 32 additions & 0 deletions varying_heights.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
length = 150
width = 20
nb_layers = 10
layer_height = 0.08
jump_y = width+10
jump_x = 0
shift_y = 2 * jump_y
shift_x = 0

with open("sample.path", "w") as file:
nb_layers = 9
layer_height = 0.08
for j in range(5):
z = 0
for i in range(nb_layers):
z += layer_height + i / (nb_layers - 1) * 2 * (0.8 / nb_layers - 0.08)
y = -width/2 -j*jump_y + shift_y
x = -length/2 + shift_x
while(y < width/2 - j*jump_y + shift_y):
if x < 0 + shift_x:
file.write("2\n")
file.write(f"{x:.2f} {y:.2f} {z:.4f}\n")
x = length/2 + shift_x
file.write(f"{x:.2f} {y:.2f} {z:.4f}\n")
else:
file.write("2\n")
file.write(f"{x:.2f} {y:.2f} {z:.4f}\n")
x = -length/2 + shift_x
file.write(f"{x:.2f} {y:.2f} {z:.4f}\n")
# y += 0.3 + i / (nb_layers - 1) * 0.5
y += 0.4
print(f"{z:.4f}")

0 comments on commit 5543cae

Please sign in to comment.