Étapes 1, 2 et 3
This commit is contained in:
parent
37cb0de14b
commit
cceb38c7ee
|
@ -6,19 +6,19 @@ project(GTI320-labos)
|
||||||
#--------------------------------------------------
|
#--------------------------------------------------
|
||||||
include(FetchContent)
|
include(FetchContent)
|
||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
googletest
|
googletest
|
||||||
GIT_REPOSITORY https://github.com/google/googletest.git
|
GIT_REPOSITORY https://github.com/google/googletest.git
|
||||||
GIT_TAG release-1.11.0
|
GIT_TAG release-1.11.0
|
||||||
)
|
)
|
||||||
|
|
||||||
# For Windows: Prevent overriding the parent project's compiler/linker settings
|
# For Windows: Prevent overriding the parent project's compiler/linker settings
|
||||||
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
|
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
|
||||||
|
|
||||||
# No need for GMock
|
# No need for GMock
|
||||||
set( BUILD_GMOCK OFF CACHE BOOL "" FORCE)
|
set(BUILD_GMOCK OFF CACHE BOOL "" FORCE)
|
||||||
set( INSTALL_GTEST OFF CACHE BOOL "" FORCE)
|
set(INSTALL_GTEST OFF CACHE BOOL "" FORCE)
|
||||||
set( GTEST_FORCE_SHARED_CRT ON CACHE BOOL "" FORCE)
|
set(GTEST_FORCE_SHARED_CRT ON CACHE BOOL "" FORCE)
|
||||||
set( GTEST_DISABLE_PTHREADS ON CACHE BOOL "" FORCE)
|
set(GTEST_DISABLE_PTHREADS ON CACHE BOOL "" FORCE)
|
||||||
FetchContent_MakeAvailable(googletest)
|
FetchContent_MakeAvailable(googletest)
|
||||||
|
|
||||||
#--------------------------------------------------
|
#--------------------------------------------------
|
||||||
|
@ -26,22 +26,22 @@ FetchContent_MakeAvailable(googletest)
|
||||||
#--------------------------------------------------
|
#--------------------------------------------------
|
||||||
include(FetchContent)
|
include(FetchContent)
|
||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
nanogui
|
nanogui
|
||||||
GIT_REPOSITORY https://github.com/mitsuba-renderer/nanogui.git
|
GIT_REPOSITORY https://github.com/mitsuba-renderer/nanogui.git
|
||||||
GIT_PROGRESS TRUE
|
GIT_PROGRESS TRUE
|
||||||
)
|
)
|
||||||
set( NANOGUI_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
|
set(NANOGUI_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
|
||||||
set( NANOGUI_BUILD_SHARED OFF CACHE BOOL "" FORCE)
|
set(NANOGUI_BUILD_SHARED OFF CACHE BOOL "" FORCE)
|
||||||
set( NANOGUI_BUILD_PYTHON OFF CACHE BOOL "" FORCE)
|
set(NANOGUI_BUILD_PYTHON OFF CACHE BOOL "" FORCE)
|
||||||
set( NANOGUI_USE_OPENGL ON CACHE BOOL "" FORCE)
|
set(NANOGUI_USE_OPENGL ON CACHE BOOL "" FORCE)
|
||||||
FetchContent_MakeAvailable(nanogui)
|
FetchContent_MakeAvailable(nanogui)
|
||||||
|
|
||||||
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
|
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
|
||||||
include_directories(${CMAKE_SOURCE_DIR}/labo01/src ${COMMON_INCLUDES})
|
include_directories(${CMAKE_SOURCE_DIR}/labo01 ${COMMON_INCLUDES})
|
||||||
add_subdirectory(labo01)
|
add_subdirectory(labo01)
|
||||||
add_subdirectory(labo_physique)
|
add_subdirectory(labo_physique)
|
||||||
|
|
||||||
if( MSVC )
|
if (MSVC)
|
||||||
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT labo_physique)
|
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT labo_physique)
|
||||||
endif()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -3,14 +3,17 @@ cmake_minimum_required(VERSION 3.15)
|
||||||
project(labo01)
|
project(labo01)
|
||||||
|
|
||||||
# Setup language requirements
|
# Setup language requirements
|
||||||
set(CMAKE_CXX_STANDARD 11)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
|
|
||||||
|
|
||||||
# Add .cpp and .h files
|
# Add .cpp and .h files
|
||||||
set(HEADERS DenseStorage.h MatrixBase.h Matrix.h Math3D.h Vector.h Operators.h)
|
file(GLOB_RECURSE MAIN_SOURCES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" CONFIGURE_DEPENDS "*.h")
|
||||||
set(SOURCE main.cpp)
|
add_executable(labo01 main.cpp ${MAIN_SOURCES} ${TESTS_SOURCES})
|
||||||
add_executable(labo01 ${SOURCE} ${HEADERS})
|
|
||||||
|
# Add .cpp and .h files
|
||||||
|
#set(HEADERS DenseStorage.h MatrixBase.h Matrix.h Math3D.h Vector.h Operators.h)
|
||||||
|
#set(SOURCE main.cpp)
|
||||||
|
#add_executable(labo01 ${SOURCE} ${HEADERS})
|
||||||
|
|
||||||
# Add linking information for Google Test
|
# Add linking information for Google Test
|
||||||
target_link_libraries(labo01 gtest)
|
target_link_libraries(labo01 gtest)
|
||||||
|
|
|
@ -314,7 +314,7 @@ void ParticleSimApplication::initGui()
|
||||||
m_stiffness = std::exp(value);
|
m_stiffness = std::exp(value);
|
||||||
onStiffnessSliderChanged();
|
onStiffnessSliderChanged();
|
||||||
});
|
});
|
||||||
m_sliderStiffness->set_value(std::logf(300.f));
|
m_sliderStiffness->set_value(std::log(300.f));
|
||||||
|
|
||||||
// Curseur du nombre maximum d'itération pour Jacobi et Gauss-Seidel
|
// Curseur du nombre maximum d'itération pour Jacobi et Gauss-Seidel
|
||||||
Widget* panelMaxIter = new Widget(panelSimControl);
|
Widget* panelMaxIter = new Widget(panelSimControl);
|
||||||
|
|
|
@ -8,64 +8,93 @@ using namespace gti320;
|
||||||
* Étant donné une particule p, la force est stockée dans le vecteur p.f
|
* Étant donné une particule p, la force est stockée dans le vecteur p.f
|
||||||
* Les forces prisent en compte sont : la gravité et la force des ressorts.
|
* Les forces prisent en compte sont : la gravité et la force des ressorts.
|
||||||
*/
|
*/
|
||||||
void ParticleSystem::computeForces()
|
void ParticleSystem::computeForces() {
|
||||||
{
|
|
||||||
// TODO
|
// TODO
|
||||||
//
|
//
|
||||||
// Calcul de la force gravitationnelle sur chacune des particules
|
// Calcul de la force gravitationnelle sur chacune des particules
|
||||||
for (Particle& p : m_particles)
|
for (Particle &p: m_particles) {
|
||||||
{
|
p.f(0) = 0; // x
|
||||||
|
p.f(1) = -p.m * 9.81f; // y
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
//
|
//
|
||||||
// Pour chaque ressort, ajouter la force exercée à chacune des exptrémités sur
|
// Pour chaque ressort, ajouter la force exercée à chacune des extrémités sur
|
||||||
// les particules appropriées. Pour un ressort s, les deux particules
|
// les particules appropriées. Pour un ressort s, les deux particules
|
||||||
// auxquelles le ressort est attaché sont m_particles[s.index0] et
|
// auxquelles le ressort est attaché sont m_particles[s.index0] et
|
||||||
// m_particles[s.index1]. On rappelle que les deux forces sont de même
|
// m_particles[s.index1]. On rappelle que les deux forces sont de même
|
||||||
// magnitude mais dans des directions opposées.
|
// magnitude mais dans des directions opposées.
|
||||||
for (const Spring& s : m_springs)
|
for (const Spring &s: m_springs) {
|
||||||
{
|
Particle &p0 = m_particles[s.index0];
|
||||||
|
Particle &p1 = m_particles[s.index1];
|
||||||
|
|
||||||
|
p0.f = p0.f + (s.k * p0.x);
|
||||||
|
p1.f = p1.f + (-s.k * p1.x);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assemble les données du système dans les vecteurs trois vecteurs d'état _pos,
|
* Assemble les données du système dans les trois vecteurs d'état _pos,
|
||||||
* _vel et _force.
|
* _vel et _force.
|
||||||
*/
|
*/
|
||||||
void ParticleSystem::pack(Vector<float, Dynamic>& _pos,
|
void ParticleSystem::pack(Vector<float, Dynamic> &_pos,
|
||||||
Vector<float, Dynamic>& _vel,
|
Vector<float, Dynamic> &_vel,
|
||||||
Vector<float, Dynamic>& _force)
|
Vector<float, Dynamic> &_force) {
|
||||||
{
|
|
||||||
// TODO
|
// TODO
|
||||||
//
|
//
|
||||||
// Copier les données des particules dans les vecteurs. Attention, si on a
|
// Copier les données des particules dans les vecteurs. Attention, si on a
|
||||||
// changé de modèle, il est possible que les vecteurs n'aient pas la bonne
|
// changé de modèle, il est possible que les vecteurs n'aient pas la bonne
|
||||||
// taille. Rappel : la taille de ces vecteurs doit être 2 fois le nombre de
|
// taille. Rappel : la taille de ces vecteurs doit être 2 fois le nombre de
|
||||||
// particules.
|
// particules.
|
||||||
|
int required_size = (int) this->m_particles.size() * 2;
|
||||||
|
if (_pos.size() != required_size) {
|
||||||
|
// Si un des vecteurs n'est pas la bonne grandeur, un changement de modèle a eu lieu et on doit redimensionner tous les vecteurs.
|
||||||
|
_pos.resize(required_size);
|
||||||
|
_vel.resize(required_size);
|
||||||
|
_force.resize(required_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < m_particles.size(); i++) {
|
||||||
|
Particle &p = m_particles[i];
|
||||||
|
int ix = i * 2;
|
||||||
|
int iy = i * 2 + 1;
|
||||||
|
|
||||||
|
_pos(ix) = p.x(0);
|
||||||
|
_pos(iy) = p.x(1);
|
||||||
|
_vel(ix) = p.v(0);
|
||||||
|
_vel(iy) = p.v(1);
|
||||||
|
_force(ix) = p.f(0);
|
||||||
|
_force(iy) = p.f(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copie les données des vecteurs d'états dans le particules du système.
|
* Copie les données des vecteurs d'états dans le particules du système.
|
||||||
*/
|
*/
|
||||||
void ParticleSystem::unpack(const Vector<float, Dynamic>& _pos,
|
void ParticleSystem::unpack(const Vector<float, Dynamic> &_pos,
|
||||||
const Vector<float, Dynamic>& _vel)
|
const Vector<float, Dynamic> &_vel) {
|
||||||
{
|
|
||||||
// TODO
|
// TODO
|
||||||
//
|
//
|
||||||
// Mise à jour des propriétés de chacune des particules à partir des valeurs
|
// Mise à jour des propriétés de chacune des particules à partir des valeurs
|
||||||
// contenues dans le vecteur d'état.
|
// contenues dans le vecteur d'état.
|
||||||
|
|
||||||
}
|
for (int i = 0; i < _pos.size(); i += 2) {
|
||||||
|
int ix = i;
|
||||||
|
int iy = i + 1;
|
||||||
|
Particle &p = m_particles[i / 2];
|
||||||
|
|
||||||
|
p.x(0) = _pos(ix);
|
||||||
|
p.x(1) = _pos(iy);
|
||||||
|
p.v(0) = _vel(ix);
|
||||||
|
p.v(1) = _vel(iy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construction de la matirce de masses.
|
* Construction de la matirce de masses.
|
||||||
*/
|
*/
|
||||||
void ParticleSystem::buildMassMatrix(Matrix<float, Dynamic, Dynamic>& M)
|
void ParticleSystem::buildMassMatrix(Matrix<float, Dynamic, Dynamic> &M) {
|
||||||
{
|
|
||||||
const int numParticles = m_particles.size();
|
const int numParticles = m_particles.size();
|
||||||
const int dim = 2 * numParticles;
|
const int dim = 2 * numParticles;
|
||||||
M.resize(dim, dim);
|
M.resize(dim, dim);
|
||||||
|
@ -75,8 +104,16 @@ void ParticleSystem::buildMassMatrix(Matrix<float, Dynamic, Dynamic>& M)
|
||||||
//
|
//
|
||||||
// Inscrire la masse de chacune des particules dans la matrice de masses M
|
// Inscrire la masse de chacune des particules dans la matrice de masses M
|
||||||
//
|
//
|
||||||
for (int i = 0; i < numParticles; ++i)
|
for (int i = 0; i < numParticles; ++i) {
|
||||||
{
|
int j = i * 2;
|
||||||
|
int k = j + 1;
|
||||||
|
float m = m_particles[i].m;
|
||||||
|
if (m_particles[i].fixed) {
|
||||||
|
m = 10000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
M(j, j) = m;
|
||||||
|
M(k, k) = m;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,8 +121,7 @@ void ParticleSystem::buildMassMatrix(Matrix<float, Dynamic, Dynamic>& M)
|
||||||
/**
|
/**
|
||||||
* Construction de la matrice de rigidité.
|
* Construction de la matrice de rigidité.
|
||||||
*/
|
*/
|
||||||
void ParticleSystem::buildDfDx(Matrix<float, Dynamic, Dynamic>& dfdx)
|
void ParticleSystem::buildDfDx(Matrix<float, Dynamic, Dynamic> &dfdx) {
|
||||||
{
|
|
||||||
const int numParticles = m_particles.size();
|
const int numParticles = m_particles.size();
|
||||||
const int numSprings = m_springs.size();
|
const int numSprings = m_springs.size();
|
||||||
const int dim = 2 * numParticles;
|
const int dim = 2 * numParticles;
|
||||||
|
@ -93,8 +129,7 @@ void ParticleSystem::buildDfDx(Matrix<float, Dynamic, Dynamic>& dfdx)
|
||||||
dfdx.setZero();
|
dfdx.setZero();
|
||||||
|
|
||||||
// Pour chaque ressort...
|
// Pour chaque ressort...
|
||||||
for (const Spring& spring : m_springs)
|
for (const Spring &spring: m_springs) {
|
||||||
{
|
|
||||||
// TODO
|
// TODO
|
||||||
//
|
//
|
||||||
// Calculer le coefficients alpha et le produit dyadique tel que décrit au cours.
|
// Calculer le coefficients alpha et le produit dyadique tel que décrit au cours.
|
||||||
|
|
Loading…
Reference in New Issue