init$
This commit is contained in:
commit
6c9c546748
56
TP1/.vscode/settings.json
vendored
Normal file
56
TP1/.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
{
|
||||||
|
"files.exclude":
|
||||||
|
{
|
||||||
|
"**/.DS_Store":true,
|
||||||
|
"**/.git":true,
|
||||||
|
"**/.gitignore":true,
|
||||||
|
"**/.gitmodules":true,
|
||||||
|
"**/*.booproj":true,
|
||||||
|
"**/*.pidb":true,
|
||||||
|
"**/*.suo":true,
|
||||||
|
"**/*.user":true,
|
||||||
|
"**/*.userprefs":true,
|
||||||
|
"**/*.unityproj":true,
|
||||||
|
"**/*.dll":true,
|
||||||
|
"**/*.exe":true,
|
||||||
|
"**/*.pdf":true,
|
||||||
|
"**/*.mid":true,
|
||||||
|
"**/*.midi":true,
|
||||||
|
"**/*.wav":true,
|
||||||
|
"**/*.gif":true,
|
||||||
|
"**/*.ico":true,
|
||||||
|
"**/*.jpg":true,
|
||||||
|
"**/*.jpeg":true,
|
||||||
|
"**/*.png":true,
|
||||||
|
"**/*.psd":true,
|
||||||
|
"**/*.tga":true,
|
||||||
|
"**/*.tif":true,
|
||||||
|
"**/*.tiff":true,
|
||||||
|
"**/*.3ds":true,
|
||||||
|
"**/*.3DS":true,
|
||||||
|
"**/*.fbx":true,
|
||||||
|
"**/*.FBX":true,
|
||||||
|
"**/*.lxo":true,
|
||||||
|
"**/*.LXO":true,
|
||||||
|
"**/*.ma":true,
|
||||||
|
"**/*.MA":true,
|
||||||
|
"**/*.obj":true,
|
||||||
|
"**/*.OBJ":true,
|
||||||
|
"**/*.asset":true,
|
||||||
|
"**/*.cubemap":true,
|
||||||
|
"**/*.flare":true,
|
||||||
|
"**/*.mat":true,
|
||||||
|
"**/*.meta":true,
|
||||||
|
"**/*.prefab":true,
|
||||||
|
"**/*.unity":true,
|
||||||
|
"build/":true,
|
||||||
|
"Build/":true,
|
||||||
|
"Library/":true,
|
||||||
|
"library/":true,
|
||||||
|
"obj/":true,
|
||||||
|
"Obj/":true,
|
||||||
|
"ProjectSettings/":true,
|
||||||
|
"temp/":true,
|
||||||
|
"Temp/":true
|
||||||
|
}
|
||||||
|
}
|
375
TP1/Assets/Scripts/Utils/Interpolateur.cs
Normal file
375
TP1/Assets/Scripts/Utils/Interpolateur.cs
Normal file
|
@ -0,0 +1,375 @@
|
||||||
|
using UnityEngine;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
|
||||||
|
|
||||||
|
public class Interpolateur : MonoBehaviour
|
||||||
|
{
|
||||||
|
// Pas d'échantillonnage
|
||||||
|
public float pas = 1 / 100;
|
||||||
|
// Conteneur des points cliqués
|
||||||
|
public GameObject Donnees;
|
||||||
|
// Les points (X,Y) cliqués
|
||||||
|
private List<float> X = new List<float>();
|
||||||
|
private List<float> Y = new List<float>();
|
||||||
|
public enum EInterpolationType { Lagrange, Neville };
|
||||||
|
public EInterpolationType InterpolationType = EInterpolationType.Lagrange;
|
||||||
|
public enum EParametrisationType { Reguliere, Distance, RacineDistance, Tchebytcheff, None }
|
||||||
|
public EParametrisationType ParametrisationType = EParametrisationType.Reguliere;
|
||||||
|
|
||||||
|
// Pour le dessin des courbes
|
||||||
|
private List<Vector3> P2DRAW = new List<Vector3>();
|
||||||
|
// UI
|
||||||
|
public Text text;
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : buildParametrisationReguliere //
|
||||||
|
// semantique : construit la parametrisation reguliere et les //
|
||||||
|
// échantillons de temps selon cette parametrisation //
|
||||||
|
// params : //
|
||||||
|
// - int nbElem : nombre d'elements de la parametrisation //
|
||||||
|
// - float pas : pas d'échantillonage //
|
||||||
|
// sortie : //
|
||||||
|
// - List<float> T : parametrisation reguliere //
|
||||||
|
// - List<float> tToEval : echantillon sur la parametrisation //
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
(List<float>, List<float>) buildParametrisationReguliere(int nbElem, float pas)
|
||||||
|
{
|
||||||
|
// Vecteur des pas temporels
|
||||||
|
List<float> T = new List<float>();
|
||||||
|
|
||||||
|
// Echantillonage des pas temporels
|
||||||
|
List<float> tToEval = new List<float>();
|
||||||
|
|
||||||
|
// Construction des pas temporels
|
||||||
|
for (int i = 0; i < nbElem; i++)
|
||||||
|
{
|
||||||
|
T.Add(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construction des échantillons
|
||||||
|
for (float i = T.First(); i <= T.Last(); i += pas)
|
||||||
|
{
|
||||||
|
tToEval.Add(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (T, tToEval);
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : buildParametrisationDistance //
|
||||||
|
// semantique : construit la parametrisation sur les distances et les //
|
||||||
|
// échantillons de temps selon cette parametrisation //
|
||||||
|
// params : //
|
||||||
|
// - int nbElem : nombre d'elements de la parametrisation //
|
||||||
|
// - float pas : pas d'échantillonage //
|
||||||
|
// sortie : //
|
||||||
|
// - List<float> T : parametrisation distances //
|
||||||
|
// - List<float> tToEval : echantillon sur la parametrisation //
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
(List<float>, List<float>) buildParametrisationDistance(int nbElem, float pas)
|
||||||
|
{
|
||||||
|
// Vecteur des pas temporels
|
||||||
|
List<float> T = new List<float>();
|
||||||
|
// Echantillonage des pas temporels
|
||||||
|
List<float> tToEval = new List<float>();
|
||||||
|
|
||||||
|
// Construction des pas temporels
|
||||||
|
T.Add(0);
|
||||||
|
for (int i = 0; i < X.Count - 1; i++)
|
||||||
|
{
|
||||||
|
float distance = (float)Math.Sqrt((Math.Pow(X[i + 1] - X[i], 2) + Math.Pow(Y[i + 1] - Y[i], 2)));
|
||||||
|
T.Add(T.Last() + distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construction des échantillons
|
||||||
|
for (float i = T.First(); i < T.Last(); i += pas)
|
||||||
|
{
|
||||||
|
tToEval.Add(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (T, tToEval);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : buildParametrisationRacineDistance //
|
||||||
|
// semantique : construit la parametrisation sur les racines des distances//
|
||||||
|
// et les échantillons de temps selon cette parametrisation //
|
||||||
|
// params : //
|
||||||
|
// - int nbElem : nombre d'elements de la parametrisation //
|
||||||
|
// - float pas : pas d'échantillonage //
|
||||||
|
// sortie : //
|
||||||
|
// - List<float> T : parametrisation racines distances //
|
||||||
|
// - List<float> tToEval : echantillon sur la parametrisation //
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
(List<float>, List<float>) buildParametrisationRacineDistance(int nbElem, float pas)
|
||||||
|
{
|
||||||
|
// Vecteur des pas temporels
|
||||||
|
List<float> T = new List<float>();
|
||||||
|
// Echantillonage des pas temporels
|
||||||
|
List<float> tToEval = new List<float>();
|
||||||
|
|
||||||
|
// Construction des pas temporels
|
||||||
|
T.Add(0);
|
||||||
|
for (int i = 0; i < X.Count - 1; i++)
|
||||||
|
{
|
||||||
|
float distance = (float)Math.Sqrt(Math.Sqrt((Math.Pow(X[i + 1] - X[i], 2) + Math.Pow(Y[i + 1] - Y[i], 2))));
|
||||||
|
T.Add(T.Last() + distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construction des échantillons
|
||||||
|
for (float i = T.First(); i < T.Last(); i += pas)
|
||||||
|
{
|
||||||
|
tToEval.Add(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (T, tToEval);
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : buildParametrisationTchebycheff //
|
||||||
|
// semantique : construit la parametrisation basée sur Tchebycheff //
|
||||||
|
// et les échantillons de temps selon cette parametrisation//
|
||||||
|
// params : //
|
||||||
|
// - int nbElem : nombre d'elements de la parametrisation //
|
||||||
|
// - float pas : pas d'échantillonage //
|
||||||
|
// sortie : //
|
||||||
|
// - List<float> T : parametrisation Tchebycheff //
|
||||||
|
// - List<float> tToEval : echantillon sur la parametrisation //
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
(List<float>, List<float>) buildParametrisationTchebycheff(int nbElem, float pas)
|
||||||
|
{
|
||||||
|
// Vecteur des pas temporels
|
||||||
|
List<float> T = new List<float>();
|
||||||
|
// Echantillonage des pas temporels
|
||||||
|
List<float> tToEval = new List<float>();
|
||||||
|
|
||||||
|
// Construction des pas temporels
|
||||||
|
for (int i = 0; i < X.Count; i++)
|
||||||
|
{
|
||||||
|
float value = (float)Math.Cos((2 * i + 1) * Math.PI / (2 * (X.Count - 1) + 2));
|
||||||
|
T.Add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construction des échantillons
|
||||||
|
for (float i = T.First(); i > T.Last(); i -= pas)
|
||||||
|
{
|
||||||
|
tToEval.Add(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (T, tToEval);
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : applyLagrangeParametrisation //
|
||||||
|
// semantique : applique la subdivion de Lagrange aux points (x,y) //
|
||||||
|
// placés en paramètres en suivant les temps indiqués //
|
||||||
|
// params : //
|
||||||
|
// - List<float> X : liste des abscisses des points //
|
||||||
|
// - List<float> Y : liste des ordonnées des points //
|
||||||
|
// - List<float> T : temps de la parametrisation //
|
||||||
|
// - List<float> tToEval : échantillon des temps sur T //
|
||||||
|
// sortie : rien //
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
void applyLagrangeParametrisation(List<float> X, List<float> Y, List<float> T, List<float> tToEval)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tToEval.Count; ++i)
|
||||||
|
{
|
||||||
|
// Calcul de xpoint et ypoint
|
||||||
|
float t = tToEval[i];
|
||||||
|
float xpoint = lagrange(t, T, X);
|
||||||
|
float ypoint = lagrange(t, T, Y);
|
||||||
|
Vector3 pos = new Vector3(xpoint, 0.0f, ypoint);
|
||||||
|
P2DRAW.Add(pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : applyNevilleParametrisation //
|
||||||
|
// semantique : applique la subdivion de Neville aux points (x,y) //
|
||||||
|
// placés en paramètres en suivant les temps indiqués //
|
||||||
|
// params : //
|
||||||
|
// - List<float> X : liste des abscisses des points //
|
||||||
|
// - List<float> Y : liste des ordonnées des points //
|
||||||
|
// - List<float> T : temps de la parametrisation //
|
||||||
|
// - List<float> tToEval : échantillon des temps sur T //
|
||||||
|
// sortie : rien //
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
void applyNevilleParametrisation(List<float> X, List<float> Y, List<float> T, List<float> tToEval)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tToEval.Count; ++i)
|
||||||
|
{
|
||||||
|
// Appliquer neville a l'echantillon i
|
||||||
|
float t = tToEval[i];
|
||||||
|
Vector2 v = neville(X, Y, T, t);
|
||||||
|
Vector3 pos = new Vector3(v[0], 0.0f, v[1]);
|
||||||
|
P2DRAW.Add(pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : lagrange //
|
||||||
|
// semantique : calcule la valeur en x du polynome de Lagrange passant //
|
||||||
|
// par les points de coordonnées (X,Y) //
|
||||||
|
// params : //
|
||||||
|
// - float x : point dont on cherche l'ordonnée //
|
||||||
|
// - List<float> X : liste des abscisses des points //
|
||||||
|
// - List<float> Y : liste des ordonnées des points //
|
||||||
|
// sortie : valeur en x du polynome de Lagrange passant //
|
||||||
|
// par les points de coordonnées (X,Y) //
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
private float lagrange(float x, List<float> X, List<float> Y)
|
||||||
|
{
|
||||||
|
float sum = 0.0f;
|
||||||
|
int n = X.Count;
|
||||||
|
|
||||||
|
for (int j = 0; j < n; j++)
|
||||||
|
{
|
||||||
|
float prod = 1.0f;
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
if (i != j)
|
||||||
|
{
|
||||||
|
prod *= (x - X[i]) / (X[j] - X[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sum += Y[j] * prod;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : neville //
|
||||||
|
// semantique : calcule le point atteint par la courbe en t sachant //
|
||||||
|
// qu'elle passe par les (X,Y) en T //
|
||||||
|
// params : //
|
||||||
|
// - List<float> X : liste des abscisses des points //
|
||||||
|
// - List<float> Y : liste des ordonnées des points //
|
||||||
|
// - List<float> T : liste des temps de la parametrisation //
|
||||||
|
// - t : temps ou on cherche le point de la courbe //
|
||||||
|
// sortie : point atteint en t de la courbe //
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
private Vector2 neville(List<float> X, List<float> Y, List<float> T, float t)
|
||||||
|
{
|
||||||
|
int n = X.Count;
|
||||||
|
List<float> nevX = new List<float>(X);
|
||||||
|
List<float> nevY = new List<float>(Y);
|
||||||
|
|
||||||
|
for (int i = n - 1; i > 0; i--)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < i; j++)
|
||||||
|
{
|
||||||
|
nevX[j] = (T[j + n - i] - t) / (T[j + n - i] - T[j]) * nevX[j] + (t - T[j]) / (T[j + n - i] - T[j]) * nevX[j + 1];
|
||||||
|
nevY[j] = (T[j + n - i] - t) / (T[j + n - i] - T[j]) * nevY[j] + (t - T[j]) / (T[j + n - i] - T[j]) * nevY[j + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Vector2(nevX.First(), nevY.First());
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////// NE PAS TOUCHER !!! //////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
if (Input.GetKeyDown(KeyCode.Return))
|
||||||
|
{
|
||||||
|
var ListePointsCliques = GameObject.Find("Donnees").GetComponent<Points>();
|
||||||
|
List<float> T = new List<float>();
|
||||||
|
List<float> tToEval = new List<float>();
|
||||||
|
|
||||||
|
if (ListePointsCliques.X.Count > 0)
|
||||||
|
{
|
||||||
|
X = ListePointsCliques.X;
|
||||||
|
Y = ListePointsCliques.Y;
|
||||||
|
|
||||||
|
if (InterpolationType == EInterpolationType.Lagrange)
|
||||||
|
{
|
||||||
|
switch (ParametrisationType)
|
||||||
|
{
|
||||||
|
case EParametrisationType.None:
|
||||||
|
List<float> x = new List<float>();
|
||||||
|
List<float> y = new List<float>();
|
||||||
|
var xmax = 10.0f;
|
||||||
|
var xcur = -10.0f;
|
||||||
|
while (xcur < xmax)
|
||||||
|
{
|
||||||
|
xcur += pas;
|
||||||
|
x.Add(xcur);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < x.Count; i++)
|
||||||
|
{
|
||||||
|
y.Add(lagrange(x[i], X, Y));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < x.Count; ++i)
|
||||||
|
{
|
||||||
|
Vector3 pos = new Vector3(x[i], 0.0f, y[i]);
|
||||||
|
P2DRAW.Add(pos);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EParametrisationType.Reguliere:
|
||||||
|
(T, tToEval) = buildParametrisationReguliere(X.Count, pas);
|
||||||
|
applyLagrangeParametrisation(X, Y, T, tToEval);
|
||||||
|
break;
|
||||||
|
case EParametrisationType.Distance:
|
||||||
|
(T, tToEval) = buildParametrisationDistance(X.Count, pas);
|
||||||
|
applyLagrangeParametrisation(X, Y, T, tToEval);
|
||||||
|
break;
|
||||||
|
case EParametrisationType.RacineDistance:
|
||||||
|
(T, tToEval) = buildParametrisationRacineDistance(X.Count, pas);
|
||||||
|
applyLagrangeParametrisation(X, Y, T, tToEval);
|
||||||
|
break;
|
||||||
|
case EParametrisationType.Tchebytcheff:
|
||||||
|
(T, tToEval) = buildParametrisationTchebycheff(X.Count, pas);
|
||||||
|
applyLagrangeParametrisation(X, Y, T, tToEval);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (InterpolationType == EInterpolationType.Neville)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (ParametrisationType)
|
||||||
|
{
|
||||||
|
case EParametrisationType.Reguliere:
|
||||||
|
(T, tToEval) = buildParametrisationReguliere(X.Count, pas);
|
||||||
|
applyNevilleParametrisation(X, Y, T, tToEval);
|
||||||
|
break;
|
||||||
|
case EParametrisationType.Distance:
|
||||||
|
(T, tToEval) = buildParametrisationDistance(X.Count, pas);
|
||||||
|
applyNevilleParametrisation(X, Y, T, tToEval);
|
||||||
|
break;
|
||||||
|
case EParametrisationType.RacineDistance:
|
||||||
|
(T, tToEval) = buildParametrisationRacineDistance(X.Count, pas);
|
||||||
|
applyNevilleParametrisation(X, Y, T, tToEval);
|
||||||
|
break;
|
||||||
|
case EParametrisationType.Tchebytcheff:
|
||||||
|
(T, tToEval) = buildParametrisationTchebycheff(X.Count, pas);
|
||||||
|
applyNevilleParametrisation(X, Y, T, tToEval);
|
||||||
|
break;
|
||||||
|
case EParametrisationType.None:
|
||||||
|
text.text = "Vous devez choisir un type de parametrisation pour utiliser Neville";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////// NE PAS TOUCHER !!! //////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Gizmos.color = Color.blue;
|
||||||
|
for (int i = 0; i < P2DRAW.Count - 1; ++i)
|
||||||
|
{
|
||||||
|
Gizmos.DrawLine(P2DRAW[i], P2DRAW[i + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
199
TP1/Assets/Scripts/Utils/InterpolateurDeSurface.cs
Normal file
199
TP1/Assets/Scripts/Utils/InterpolateurDeSurface.cs
Normal file
|
@ -0,0 +1,199 @@
|
||||||
|
using UnityEngine;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
|
||||||
|
public class InterpolateurDeSurface : MonoBehaviour
|
||||||
|
{
|
||||||
|
public GameObject particle;
|
||||||
|
public float[] X;
|
||||||
|
public float[,] Y;
|
||||||
|
public float[] Z;
|
||||||
|
public bool autoGenerateGrid;
|
||||||
|
public float pas;
|
||||||
|
private List<List<Vector3>> ListePoints = new List<List<Vector3>>();
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
if (true)
|
||||||
|
{
|
||||||
|
int n = 5;
|
||||||
|
|
||||||
|
X = new float[n];
|
||||||
|
Y = new float[n, n];
|
||||||
|
Z = new float[n];
|
||||||
|
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
X[i] = (float)i / (float)(n - 1);
|
||||||
|
Z[i] = (float)i / (float)(n - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
float XC2 = (X[i] - (1.0f / 2.0f)) * (X[i] - (1.0f / 2.0f));
|
||||||
|
|
||||||
|
for (int j = 0; j < n; j++)
|
||||||
|
{
|
||||||
|
float ZC2 = (Z[j] - (1.0f / 2.0f)) * (Z[j] - (1.0f / 2.0f));
|
||||||
|
|
||||||
|
Y[i, j] = (float)Math.Exp(-(XC2 + ZC2));
|
||||||
|
Instantiate(particle, new Vector3(X[i], Y[i, j], Z[j]), Quaternion.identity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
if (Input.GetKeyDown(KeyCode.Return))
|
||||||
|
{
|
||||||
|
List<float> T = new List<float>();
|
||||||
|
List<float> tToEval = new List<float>();
|
||||||
|
|
||||||
|
(T, tToEval) = buildParametrisationReguliere(X.Count(), pas);
|
||||||
|
applyLagrangeParametrisation(X, Y, Z, T, tToEval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(List<float>, List<float>) buildParametrisationReguliere(int nbElem, float pas)
|
||||||
|
{
|
||||||
|
// Vecteur des pas temporels
|
||||||
|
List<float> T = new List<float>();
|
||||||
|
// Echantillonage des pas temporels
|
||||||
|
List<float> tToEval = new List<float>();
|
||||||
|
|
||||||
|
// Construction des pas temporels
|
||||||
|
for (int i = 0; i < nbElem; i++)
|
||||||
|
{
|
||||||
|
T.Add(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construction des échantillons
|
||||||
|
for (float t = 0; t < T.Last(); t += pas)
|
||||||
|
{
|
||||||
|
tToEval.Add(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (T, tToEval);
|
||||||
|
}
|
||||||
|
|
||||||
|
void applyLagrangeParametrisation(float[] X, float[,] Y, float[] Z, List<float> T, List<float> tToEval)
|
||||||
|
{
|
||||||
|
ListePoints.Clear();
|
||||||
|
|
||||||
|
float[] newX = new float[tToEval.Count()];
|
||||||
|
float[,] newY_interm = new float[tToEval.Count(), Z.Count()];
|
||||||
|
float[,] newY = new float[tToEval.Count(), tToEval.Count()];
|
||||||
|
float[] newZ = new float[tToEval.Count()];
|
||||||
|
|
||||||
|
for (int i = 0; i < tToEval.Count(); i++)
|
||||||
|
{
|
||||||
|
float t = tToEval[i];
|
||||||
|
|
||||||
|
newX[i] = lagrange(t, T, X);
|
||||||
|
newZ[i] = lagrange(t, T, Z);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (int k = 0; k < Z.Count(); k++)
|
||||||
|
{
|
||||||
|
float[] Yk = GetColumn(Y, k);
|
||||||
|
|
||||||
|
for (int i = 0; i < tToEval.Count(); i++)
|
||||||
|
{
|
||||||
|
float t = tToEval[i];
|
||||||
|
|
||||||
|
float val = lagrange(t, T, Yk);
|
||||||
|
newY[i, k * (int)(1 / pas)] = val;
|
||||||
|
newY_interm[i, k] = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// for (int k = 0; k < tToEval.Count(); k++)
|
||||||
|
// {
|
||||||
|
// float[] Yk = GetRow(newY_interm, k);
|
||||||
|
|
||||||
|
// for (int i = 0; i < tToEval.Count(); i++)
|
||||||
|
// {
|
||||||
|
// float t = tToEval[i];
|
||||||
|
|
||||||
|
// newY[k, i] = lagrange(t, T, Yk);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
for (int i = 0; i < tToEval.Count(); i++)
|
||||||
|
{
|
||||||
|
List<Vector3> ListePoints_i = new List<Vector3>();
|
||||||
|
|
||||||
|
for (int j = 0; j < tToEval.Count(); j++)
|
||||||
|
{
|
||||||
|
ListePoints_i.Add(new Vector3(newX[i], newY[i, j], newZ[j]));
|
||||||
|
}
|
||||||
|
|
||||||
|
ListePoints.Add(ListePoints_i);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private float lagrange(float x, List<float> X, float[] Y)
|
||||||
|
{
|
||||||
|
float sum = 0;
|
||||||
|
for (int i = 0; i < X.Count; i++)
|
||||||
|
{
|
||||||
|
float xi = X[i];
|
||||||
|
|
||||||
|
float prod = 1;
|
||||||
|
for (int j = 0; j < X.Count; j++)
|
||||||
|
{
|
||||||
|
float xj = X[j];
|
||||||
|
|
||||||
|
if (xi != xj)
|
||||||
|
{
|
||||||
|
prod *= (x - xj) / (xi - xj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sum += prod * Y[i];
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Gizmos.color = Color.blue;
|
||||||
|
if (autoGenerateGrid)
|
||||||
|
{
|
||||||
|
|
||||||
|
for (int j = 0; j < ListePoints.Count; ++j)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < ListePoints[j].Count - 1; ++i)
|
||||||
|
{
|
||||||
|
Gizmos.DrawLine(ListePoints[j][i], ListePoints[j][i + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public float[] GetColumn(float[,] matrix, int columnNumber)
|
||||||
|
{
|
||||||
|
return Enumerable.Range(0, matrix.GetLength(0))
|
||||||
|
.Select(x => matrix[x, columnNumber])
|
||||||
|
.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public float[] GetRow(float[,] matrix, int rowNumber)
|
||||||
|
{
|
||||||
|
return Enumerable.Range(0, matrix.GetLength(1))
|
||||||
|
.Select(x => matrix[rowNumber, x])
|
||||||
|
.ToArray();
|
||||||
|
}
|
||||||
|
}
|
40
TP1/Assets/Scripts/Utils/Points.cs
Normal file
40
TP1/Assets/Scripts/Utils/Points.cs
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// Permet de stocker les coordonnees des points selectionnes a l'écran en vue d'un traitement
|
||||||
|
public class Points : MonoBehaviour
|
||||||
|
{
|
||||||
|
// Objet qui sera instancie sur un clic
|
||||||
|
public GameObject particle;
|
||||||
|
// Listes memoires des coordonnees
|
||||||
|
public List<float> X = new List<float>();
|
||||||
|
public List<float> Y = new List<float>();
|
||||||
|
|
||||||
|
// Methode appellee a chaque pas de simulation
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
// Position de la souris
|
||||||
|
Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0f);
|
||||||
|
|
||||||
|
// Si on clique
|
||||||
|
if (Input.GetButtonDown("Fire1"))
|
||||||
|
{
|
||||||
|
Vector3 wordPos;
|
||||||
|
Ray ray = Camera.main.ScreenPointToRay(mousePos);
|
||||||
|
RaycastHit hit;
|
||||||
|
if (Physics.Raycast(ray, out hit, 1000f))
|
||||||
|
{
|
||||||
|
wordPos = hit.point;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wordPos = Camera.main.ScreenToWorldPoint(mousePos);
|
||||||
|
}
|
||||||
|
// On instancie un point sur le plan
|
||||||
|
Instantiate(particle, wordPos, Quaternion.identity);
|
||||||
|
X.Add(wordPos.x);
|
||||||
|
Y.Add(wordPos.z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
17
TP1/Assets/Scripts/Utils/Zoom.cs
Normal file
17
TP1/Assets/Scripts/Utils/Zoom.cs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// Script qui permet de zoomer avec la molette de la souris
|
||||||
|
public class Zoom : MonoBehaviour
|
||||||
|
{
|
||||||
|
|
||||||
|
private float scrollSpeed = 4.0f;
|
||||||
|
private float cameraDistance = 0f;
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
cameraDistance = Input.GetAxis("Mouse ScrollWheel") * scrollSpeed;
|
||||||
|
transform.Translate(new Vector3(0,0, cameraDistance));
|
||||||
|
}
|
||||||
|
}
|
56
TP2/.vscode/settings.json
vendored
Normal file
56
TP2/.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
{
|
||||||
|
"files.exclude":
|
||||||
|
{
|
||||||
|
"**/.DS_Store":true,
|
||||||
|
"**/.git":true,
|
||||||
|
"**/.gitignore":true,
|
||||||
|
"**/.gitmodules":true,
|
||||||
|
"**/*.booproj":true,
|
||||||
|
"**/*.pidb":true,
|
||||||
|
"**/*.suo":true,
|
||||||
|
"**/*.user":true,
|
||||||
|
"**/*.userprefs":true,
|
||||||
|
"**/*.unityproj":true,
|
||||||
|
"**/*.dll":true,
|
||||||
|
"**/*.exe":true,
|
||||||
|
"**/*.pdf":true,
|
||||||
|
"**/*.mid":true,
|
||||||
|
"**/*.midi":true,
|
||||||
|
"**/*.wav":true,
|
||||||
|
"**/*.gif":true,
|
||||||
|
"**/*.ico":true,
|
||||||
|
"**/*.jpg":true,
|
||||||
|
"**/*.jpeg":true,
|
||||||
|
"**/*.png":true,
|
||||||
|
"**/*.psd":true,
|
||||||
|
"**/*.tga":true,
|
||||||
|
"**/*.tif":true,
|
||||||
|
"**/*.tiff":true,
|
||||||
|
"**/*.3ds":true,
|
||||||
|
"**/*.3DS":true,
|
||||||
|
"**/*.fbx":true,
|
||||||
|
"**/*.FBX":true,
|
||||||
|
"**/*.lxo":true,
|
||||||
|
"**/*.LXO":true,
|
||||||
|
"**/*.ma":true,
|
||||||
|
"**/*.MA":true,
|
||||||
|
"**/*.obj":true,
|
||||||
|
"**/*.OBJ":true,
|
||||||
|
"**/*.asset":true,
|
||||||
|
"**/*.cubemap":true,
|
||||||
|
"**/*.flare":true,
|
||||||
|
"**/*.mat":true,
|
||||||
|
"**/*.meta":true,
|
||||||
|
"**/*.prefab":true,
|
||||||
|
"**/*.unity":true,
|
||||||
|
"build/":true,
|
||||||
|
"Build/":true,
|
||||||
|
"Library/":true,
|
||||||
|
"library/":true,
|
||||||
|
"obj/":true,
|
||||||
|
"Obj/":true,
|
||||||
|
"ProjectSettings/":true,
|
||||||
|
"temp/":true,
|
||||||
|
"Temp/":true
|
||||||
|
}
|
||||||
|
}
|
108
TP2/Assets/Scripts/Bernstein.cs
Normal file
108
TP2/Assets/Scripts/Bernstein.cs
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
///////////////// Classe qui gère les polys de Bernstein /////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
public class Bernstein : MonoBehaviour
|
||||||
|
{
|
||||||
|
|
||||||
|
// Nombre de polynmes de Bernstein a dessiner
|
||||||
|
public int nombrePolynomesBernstein = 1;
|
||||||
|
// Slider : permet de choisir le nombre de poly depuis la simulation
|
||||||
|
public Slider slider;
|
||||||
|
// pas d'échantillonage pour affichage
|
||||||
|
private float pas = 0.01f;
|
||||||
|
// Liste des couleurs pour affichage
|
||||||
|
private Color[] listeCouleurs = new Color[] { Color.blue, Color.cyan, Color.green, Color.magenta, Color.red, Color.yellow };
|
||||||
|
// Listes des différents points composants les polynomes de Bernstein
|
||||||
|
// ListePoints[0] : liste des points composant le poly de Bernstein 0 sur n-1
|
||||||
|
private List<List<Vector2>> ListePoints = new List<List<Vector2>>();
|
||||||
|
|
||||||
|
float BernsteinValue(int i, int m, float u)
|
||||||
|
{
|
||||||
|
long iParmisM = KparmiN(i, m);
|
||||||
|
double value = iParmisM * Math.Pow(u, i) * Math.Pow(1 - u, m - i);
|
||||||
|
return (float)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : buildPolysBernstein //
|
||||||
|
// semantique : remplit le vecteur ListePoints avec les listes des points//
|
||||||
|
// composant les polys de Bernstein //
|
||||||
|
// params : aucun //
|
||||||
|
// sortie : aucune //
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
void buildPolysBernstein()
|
||||||
|
{
|
||||||
|
for (int i = 0; i <= nombrePolynomesBernstein; i++)
|
||||||
|
{
|
||||||
|
List<Vector2> courbe = new List<Vector2>();
|
||||||
|
for (float x = 0; x < 1; x += pas)
|
||||||
|
{
|
||||||
|
Vector2 vector = new Vector2(x, BernsteinValue(i, nombrePolynomesBernstein, x));
|
||||||
|
courbe.Add(vector);
|
||||||
|
}
|
||||||
|
ListePoints.Add(courbe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Fonction KparmiN //
|
||||||
|
// Semantique : etant donnés k et n, calcule k parmi n //
|
||||||
|
// Entrees : - int k //
|
||||||
|
// - int n //
|
||||||
|
// Sortie : k parmi n //
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
long KparmiN(int k, int n)
|
||||||
|
{
|
||||||
|
decimal result = 1;
|
||||||
|
for (int i = 1; i <= k; i++)
|
||||||
|
{
|
||||||
|
result *= n - (k - i);
|
||||||
|
result /= i;
|
||||||
|
}
|
||||||
|
return (long)result;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////// NE PAS TOUCHER //////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
buildPolysBernstein();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
if (slider.value != nombrePolynomesBernstein)
|
||||||
|
{
|
||||||
|
nombrePolynomesBernstein = (int)slider.value;
|
||||||
|
ListePoints.Clear();
|
||||||
|
buildPolysBernstein();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
float profondeur = -2.0f;
|
||||||
|
for (int i = 0; i < ListePoints.Count; ++i)
|
||||||
|
{
|
||||||
|
Gizmos.color = listeCouleurs[i % listeCouleurs.Length];
|
||||||
|
List<Vector2> listePointsPolynome = ListePoints[i];
|
||||||
|
for (int j = 0; j < listePointsPolynome.Count - 1; ++j)
|
||||||
|
{
|
||||||
|
Vector3 p1 = new Vector3(listePointsPolynome[j].x, profondeur, listePointsPolynome[j].y);
|
||||||
|
Vector3 p2 = new Vector3(listePointsPolynome[j + 1].x, profondeur, listePointsPolynome[j + 1].y);
|
||||||
|
Gizmos.DrawLine(p1, p2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Gizmos.color = Color.black;
|
||||||
|
Gizmos.DrawLine(new Vector3(1.0f, profondeur, 0.0f), new Vector3(0.0f, profondeur, 0.0f));
|
||||||
|
Gizmos.DrawLine(new Vector3(0.0f, profondeur, 0.0f), new Vector3(0.0f, profondeur, 1.0f));
|
||||||
|
}
|
||||||
|
}
|
159
TP2/Assets/Scripts/CalculHodographe.cs
Executable file
159
TP2/Assets/Scripts/CalculHodographe.cs
Executable file
|
@ -0,0 +1,159 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class CalculHodographe : MonoBehaviour
|
||||||
|
{
|
||||||
|
// Nombre de subdivision dans l'algo de DCJ
|
||||||
|
public int NombreDeSubdivision = 3;
|
||||||
|
// Liste des points composant la courbe de l'hodographe
|
||||||
|
private List<Vector3> ListePoints = new List<Vector3>();
|
||||||
|
// Donnees i.e. points cliqués
|
||||||
|
|
||||||
|
public GameObject Donnees;
|
||||||
|
public GameObject particle;
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : DeCasteljauSub //
|
||||||
|
// semantique : renvoie la liste des points composant la courbe //
|
||||||
|
// approximante selon un nombre de subdivision données //
|
||||||
|
// params : - List<float> X : abscisses des point de controle //
|
||||||
|
// - List<float> Y : odronnees des point de controle //
|
||||||
|
// - int nombreDeSubdivision : nombre de subdivision //
|
||||||
|
// sortie : //
|
||||||
|
// - (List<float>, List<float>) : liste des abscisses et liste //
|
||||||
|
// des ordonnées des points composant la courbe //
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
(List<float>, List<float>) DeCasteljauSub(List<float> X, List<float> Y, int nombreDeSubdivision)
|
||||||
|
{
|
||||||
|
if (nombreDeSubdivision == 0)
|
||||||
|
{ // condition de terminaison
|
||||||
|
return (X, Y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // récurrence
|
||||||
|
List<float> x_gauche = new List<float>();
|
||||||
|
List<float> y_gauche = new List<float>();
|
||||||
|
|
||||||
|
List<float> x_droite = new List<float>();
|
||||||
|
List<float> y_droite = new List<float>();
|
||||||
|
|
||||||
|
// copie de X et Y pour la subdivision
|
||||||
|
int n = X.Count;
|
||||||
|
List<float> nevX = new List<float>(X);
|
||||||
|
List<float> nevY = new List<float>(Y);
|
||||||
|
|
||||||
|
// ajout des premiers points
|
||||||
|
x_gauche.Add(X[0]);
|
||||||
|
y_gauche.Add(Y[0]);
|
||||||
|
|
||||||
|
for (int i = n - 1; i > 0; i--)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < i; j++)
|
||||||
|
{
|
||||||
|
nevX[j] = 0.5f * nevX[j] + 0.5f * nevX[j + 1];
|
||||||
|
nevY[j] = 0.5f * nevY[j] + 0.5f * nevY[j + 1];
|
||||||
|
}
|
||||||
|
// ajouts de la subdiv de gauche
|
||||||
|
x_gauche.Add(nevX[0]);
|
||||||
|
y_gauche.Add(nevY[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ajout de la subdiv de droite
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
x_droite.Add(nevX[i]);
|
||||||
|
y_droite.Add(nevY[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// déclaration des nouvelles listes de points
|
||||||
|
List<float> x_new_gauche = new List<float>();
|
||||||
|
List<float> y_new_gauche = new List<float>();
|
||||||
|
List<float> x_new_droite = new List<float>();
|
||||||
|
List<float> y_new_droite = new List<float>();
|
||||||
|
|
||||||
|
// appels récurrents
|
||||||
|
(x_new_gauche, y_new_gauche) = DeCasteljauSub(x_gauche, y_gauche, nombreDeSubdivision - 1);
|
||||||
|
(x_new_droite, y_new_droite) = DeCasteljauSub(x_droite, y_droite, nombreDeSubdivision - 1);
|
||||||
|
|
||||||
|
// on enlève le point en commun dans une des deux listes
|
||||||
|
x_new_droite.RemoveAt(0);
|
||||||
|
y_new_droite.RemoveAt(0);
|
||||||
|
|
||||||
|
return (x_new_gauche.Concat(x_new_droite).ToList(), y_new_gauche.Concat(y_new_droite).ToList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : Hodographe //
|
||||||
|
// semantique : renvoie la liste des vecteurs vitesses entre les paires //
|
||||||
|
// consécutives de points de controle //
|
||||||
|
// approximante selon un nombre de subdivision données //
|
||||||
|
// params : - List<float> X : abscisses des point de controle //
|
||||||
|
// - List<float> Y : odronnees des point de controle //
|
||||||
|
// - float Cx : offset d'affichage en x //
|
||||||
|
// - float Cy : offset d'affichage en y //
|
||||||
|
// sortie : //
|
||||||
|
// - (List<float>, List<float>) : listes composantes des //
|
||||||
|
// vecteurs vitesses sous la forme (Xs,Ys) //
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
(List<float>, List<float>) Hodographe(List<float> X, List<float> Y, float Cx = 1.5f, float Cy = 0.0f)
|
||||||
|
{
|
||||||
|
List<float> XHodo = new List<float>();
|
||||||
|
List<float> YHodo = new List<float>();
|
||||||
|
|
||||||
|
for (int i = 0; i < X.Count - 1; i++)
|
||||||
|
{
|
||||||
|
XHodo.Add(X[i + 1] - X[i] + Cx);
|
||||||
|
YHodo.Add(Y[i + 1] - Y[i] + Cy);
|
||||||
|
}
|
||||||
|
|
||||||
|
return DeCasteljauSub(XHodo, YHodo, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////// NE PAS TOUCHER //////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
Instantiate(particle, new Vector3(1.5f, -4.0f, 0.0f), Quaternion.identity);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
// if (Input.GetKeyDown(KeyCode.Return))
|
||||||
|
// {
|
||||||
|
|
||||||
|
ListePoints.Clear();
|
||||||
|
|
||||||
|
var ListePointsCliques = GameObject.Find("Donnees").GetComponent<Points>();
|
||||||
|
if (ListePointsCliques.X.Count > 1)
|
||||||
|
{
|
||||||
|
List<float> XSubdivision = new List<float>();
|
||||||
|
List<float> YSubdivision = new List<float>();
|
||||||
|
List<float> dX = new List<float>();
|
||||||
|
List<float> dY = new List<float>();
|
||||||
|
|
||||||
|
(dX, dY) = Hodographe(ListePointsCliques.X, ListePointsCliques.Y);
|
||||||
|
|
||||||
|
(XSubdivision, YSubdivision) = DeCasteljauSub(dX, dY, NombreDeSubdivision);
|
||||||
|
for (int i = 0; i < XSubdivision.Count; ++i)
|
||||||
|
{
|
||||||
|
ListePoints.Add(new Vector3(XSubdivision[i], -4.0f, YSubdivision[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Gizmos.color = Color.blue;
|
||||||
|
for (int i = 0; i < ListePoints.Count - 1; ++i)
|
||||||
|
{
|
||||||
|
Gizmos.DrawLine(ListePoints[i], ListePoints[i + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
119
TP2/Assets/Scripts/DeCasteljauEvaluation.cs
Normal file
119
TP2/Assets/Scripts/DeCasteljauEvaluation.cs
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
///////////////// Classe qui gère l'évaluation via DCJ ///////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
public class DeCasteljauEvaluation : MonoBehaviour
|
||||||
|
{
|
||||||
|
// Pas d'échantillonage construire la parametrisation
|
||||||
|
public float pas = 1 / 100;
|
||||||
|
// Liste des points composant la courbe
|
||||||
|
private List<Vector3> ListePoints = new List<Vector3>();
|
||||||
|
// Donnees i.e. points cliqués
|
||||||
|
public GameObject Donnees;
|
||||||
|
// Coordonnees des points composant le polygone de controle
|
||||||
|
private List<float> PolygoneControleX = new List<float>();
|
||||||
|
private List<float> PolygoneControleY = new List<float>();
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : buildEchantillonnage //
|
||||||
|
// semantique : construit un échantillonnage regulier //
|
||||||
|
// params : aucun //
|
||||||
|
// sortie : //
|
||||||
|
// - List<float> tToEval : échantillonnage regulier //
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
List<float> buildEchantillonnage()
|
||||||
|
{
|
||||||
|
List<float> tToEval = new List<float>();
|
||||||
|
|
||||||
|
for (float t = 0; t < 1; t += pas)
|
||||||
|
{
|
||||||
|
tToEval.Add(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
return tToEval;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : DeCasteljau //
|
||||||
|
// semantique : renvoie le point approxime via l'aglgorithme de DCJ //
|
||||||
|
// pour une courbe définie par les points de controle //
|
||||||
|
// (X,Y) à l'instant t //
|
||||||
|
// params : - List<float> X : abscisses des point de controle //
|
||||||
|
// - List<float> Y : odronnees des point de controle //
|
||||||
|
// - float t : temps d'approximation //
|
||||||
|
// sortie : //
|
||||||
|
// - Vector2 : point atteint au temps t //
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
Vector2 DeCasteljau(List<float> X, List<float> Y, float t)
|
||||||
|
{
|
||||||
|
int n = X.Count;
|
||||||
|
List<float> nevX = new List<float>(X);
|
||||||
|
List<float> nevY = new List<float>(Y);
|
||||||
|
|
||||||
|
for (int i = n - 1; i > 0; i--)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < i; j++)
|
||||||
|
{
|
||||||
|
nevX[j] = (1 - t) * nevX[j] + t * nevX[j + 1];
|
||||||
|
nevY[j] = (1 - t) * nevY[j] + t * nevY[j + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Vector2(nevX[0], nevY[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////// NE PAS TOUCHER //////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
// if (Input.GetKeyDown(KeyCode.Return))
|
||||||
|
// {
|
||||||
|
PolygoneControleX.Clear();
|
||||||
|
PolygoneControleY.Clear();
|
||||||
|
ListePoints.Clear();
|
||||||
|
|
||||||
|
var ListePointsCliques = GameObject.Find("Donnees").GetComponent<Points>();
|
||||||
|
if (ListePointsCliques.X.Count > 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < ListePointsCliques.X.Count; ++i)
|
||||||
|
{
|
||||||
|
PolygoneControleX.Add(ListePointsCliques.X[i]);
|
||||||
|
PolygoneControleY.Add(ListePointsCliques.Y[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<float> T = buildEchantillonnage();
|
||||||
|
Vector2 point = new Vector2();
|
||||||
|
foreach (float t in T)
|
||||||
|
{
|
||||||
|
point = DeCasteljau(ListePointsCliques.X, ListePointsCliques.Y, t);
|
||||||
|
ListePoints.Add(new Vector3(point.x, -4.0f, point.y));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Gizmos.color = Color.red;
|
||||||
|
for (int i = 0; i < PolygoneControleX.Count - 1; ++i)
|
||||||
|
{
|
||||||
|
Gizmos.DrawLine(new Vector3(PolygoneControleX[i], -4.0f, PolygoneControleY[i]), new Vector3(PolygoneControleX[i + 1], -4.0f, PolygoneControleY[i + 1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
Gizmos.color = Color.blue;
|
||||||
|
for (int i = 0; i < ListePoints.Count - 1; ++i)
|
||||||
|
{
|
||||||
|
Gizmos.DrawLine(ListePoints[i], ListePoints[i + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
146
TP2/Assets/Scripts/DeCasteljauSubdivision.cs
Executable file
146
TP2/Assets/Scripts/DeCasteljauSubdivision.cs
Executable file
|
@ -0,0 +1,146 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
///////////////// Classe qui gère la subdivision via DCJ /////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
public class DeCasteljauSubdivision : MonoBehaviour
|
||||||
|
{
|
||||||
|
// Pas d'échantillonage pour affichage
|
||||||
|
public float pas = 1 / 100;
|
||||||
|
// Nombre de subdivision dans l'algo de DCJ
|
||||||
|
public int NombreDeSubdivision = 10;
|
||||||
|
// Liste des points composant la courbe
|
||||||
|
private List<Vector3> ListePoints = new List<Vector3>();
|
||||||
|
// Donnees i.e. points cliqués
|
||||||
|
public GameObject Donnees;
|
||||||
|
// Coordonnees des points composant le polygone de controle
|
||||||
|
private List<float> PolygoneControleX = new List<float>();
|
||||||
|
private List<float> PolygoneControleY = new List<float>();
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : DeCasteljauSub //
|
||||||
|
// semantique : renvoie la liste des points composant la courbe //
|
||||||
|
// approximante selon un nombre de subdivision données //
|
||||||
|
// params : - List<float> X : abscisses des point de controle //
|
||||||
|
// - List<float> Y : odronnees des point de controle //
|
||||||
|
// - int nombreDeSubdivision : nombre de subdivision //
|
||||||
|
// sortie : //
|
||||||
|
// - (List<float>, List<float>) : liste des abscisses et liste //
|
||||||
|
// des ordonnées des points composant la courbe //
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
(List<float>, List<float>) DeCasteljauSub(List<float> X, List<float> Y, int nombreDeSubdivision)
|
||||||
|
{
|
||||||
|
if (nombreDeSubdivision == 0)
|
||||||
|
{ // condition de terminaison
|
||||||
|
return (X, Y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // récurrence
|
||||||
|
List<float> x_gauche = new List<float>();
|
||||||
|
List<float> y_gauche = new List<float>();
|
||||||
|
|
||||||
|
List<float> x_droite = new List<float>();
|
||||||
|
List<float> y_droite = new List<float>();
|
||||||
|
|
||||||
|
// copie de X et Y pour la subdivision
|
||||||
|
int n = X.Count;
|
||||||
|
List<float> nevX = new List<float>(X);
|
||||||
|
List<float> nevY = new List<float>(Y);
|
||||||
|
|
||||||
|
// ajout des premiers points
|
||||||
|
x_gauche.Add(X[0]);
|
||||||
|
y_gauche.Add(Y[0]);
|
||||||
|
|
||||||
|
for (int i = n - 1; i > 0; i--)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < i; j++)
|
||||||
|
{
|
||||||
|
nevX[j] = 0.5f * nevX[j] + 0.5f * nevX[j + 1];
|
||||||
|
nevY[j] = 0.5f * nevY[j] + 0.5f * nevY[j + 1];
|
||||||
|
}
|
||||||
|
// ajouts de la subdiv de gauche
|
||||||
|
x_gauche.Add(nevX[0]);
|
||||||
|
y_gauche.Add(nevY[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ajout de la subdiv de droite
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
x_droite.Add(nevX[i]);
|
||||||
|
y_droite.Add(nevY[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// déclaration des nouvelles listes de points
|
||||||
|
List<float> x_new_gauche = new List<float>();
|
||||||
|
List<float> y_new_gauche = new List<float>();
|
||||||
|
List<float> x_new_droite = new List<float>();
|
||||||
|
List<float> y_new_droite = new List<float>();
|
||||||
|
|
||||||
|
// appels récurrents
|
||||||
|
(x_new_gauche, y_new_gauche) = DeCasteljauSub(x_gauche, y_gauche, nombreDeSubdivision - 1);
|
||||||
|
(x_new_droite, y_new_droite) = DeCasteljauSub(x_droite, y_droite, nombreDeSubdivision - 1);
|
||||||
|
|
||||||
|
// on enlève le point en commun dans une des deux listes
|
||||||
|
x_new_droite.RemoveAt(0);
|
||||||
|
y_new_droite.RemoveAt(0);
|
||||||
|
|
||||||
|
return (x_new_gauche.Concat(x_new_droite).ToList(), y_new_gauche.Concat(y_new_droite).ToList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////// NE PAS TOUCHER //////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
// if (Input.GetKeyDown(KeyCode.Return))
|
||||||
|
// {
|
||||||
|
|
||||||
|
PolygoneControleX.Clear();
|
||||||
|
PolygoneControleY.Clear();
|
||||||
|
ListePoints.Clear();
|
||||||
|
|
||||||
|
var ListePointsCliques = GameObject.Find("Donnees").GetComponent<Points>();
|
||||||
|
if (ListePointsCliques.X.Count > 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < ListePointsCliques.X.Count; ++i)
|
||||||
|
{
|
||||||
|
PolygoneControleX.Add(ListePointsCliques.X[i]);
|
||||||
|
PolygoneControleY.Add(ListePointsCliques.Y[i]);
|
||||||
|
}
|
||||||
|
List<float> XSubdivision = new List<float>();
|
||||||
|
List<float> YSubdivision = new List<float>();
|
||||||
|
|
||||||
|
(XSubdivision, YSubdivision) = DeCasteljauSub(ListePointsCliques.X, ListePointsCliques.Y, NombreDeSubdivision);
|
||||||
|
for (int i = 0; i < XSubdivision.Count; ++i)
|
||||||
|
{
|
||||||
|
ListePoints.Add(new Vector3(XSubdivision[i], -4.0f, YSubdivision[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Gizmos.color = Color.red;
|
||||||
|
for (int i = 0; i < PolygoneControleX.Count - 1; ++i)
|
||||||
|
{
|
||||||
|
Gizmos.DrawLine(new Vector3(PolygoneControleX[i], -4.0f, PolygoneControleY[i]), new Vector3(PolygoneControleX[i + 1], -4.0f, PolygoneControleY[i + 1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
Gizmos.color = Color.blue;
|
||||||
|
for (int i = 0; i < ListePoints.Count - 1; ++i)
|
||||||
|
{
|
||||||
|
Gizmos.DrawLine(ListePoints[i], ListePoints[i + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
43
TP2/Assets/Scripts/Points.cs
Executable file
43
TP2/Assets/Scripts/Points.cs
Executable file
|
@ -0,0 +1,43 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// Permet de stocker les coordonnees des points selectionnes a l'écran en vue d'un traitement
|
||||||
|
public class Points : MonoBehaviour
|
||||||
|
{
|
||||||
|
// Objet qui sera instancie sur un clic
|
||||||
|
public GameObject particle;
|
||||||
|
// Listes memoires des coordonnees
|
||||||
|
public List<float> X = new List<float>();
|
||||||
|
public List<float> Y = new List<float>();
|
||||||
|
|
||||||
|
// Methode appellee au debut du programme
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Methode appellee a chaque pas de simulation
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0f);
|
||||||
|
|
||||||
|
if (Input.GetButtonDown("Fire1"))
|
||||||
|
{
|
||||||
|
Vector3 wordPos;
|
||||||
|
Ray ray = Camera.main.ScreenPointToRay(mousePos);
|
||||||
|
RaycastHit hit;
|
||||||
|
if (Physics.Raycast(ray, out hit, 1000f))
|
||||||
|
{
|
||||||
|
wordPos = hit.point;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wordPos = Camera.main.ScreenToWorldPoint(mousePos);
|
||||||
|
}
|
||||||
|
Instantiate(particle, wordPos, Quaternion.identity);
|
||||||
|
X.Add(wordPos.x);
|
||||||
|
Y.Add(wordPos.z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
23
TP2/Assets/Scripts/SurfaceBezierTriangulaire.cs
Normal file
23
TP2/Assets/Scripts/SurfaceBezierTriangulaire.cs
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
public class SurfaceBezierTriangulaire : MonoBehaviour
|
||||||
|
{
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Gizmos.color = Color.blue;
|
||||||
|
}
|
||||||
|
}
|
17
TP2/Assets/Scripts/Zoom.cs
Normal file
17
TP2/Assets/Scripts/Zoom.cs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// Script qui permet de zoomer avec la molette de la souris
|
||||||
|
public class Zoom : MonoBehaviour
|
||||||
|
{
|
||||||
|
|
||||||
|
private float scrollSpeed = 4.0f;
|
||||||
|
private float cameraDistance = 0f;
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
cameraDistance = Input.GetAxis("Mouse ScrollWheel") * scrollSpeed;
|
||||||
|
transform.Translate(new Vector3(0,0, cameraDistance));
|
||||||
|
}
|
||||||
|
}
|
56
TP3/.vscode/settings.json
vendored
Normal file
56
TP3/.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
{
|
||||||
|
"files.exclude":
|
||||||
|
{
|
||||||
|
"**/.DS_Store":true,
|
||||||
|
"**/.git":true,
|
||||||
|
"**/.gitignore":true,
|
||||||
|
"**/.gitmodules":true,
|
||||||
|
"**/*.booproj":true,
|
||||||
|
"**/*.pidb":true,
|
||||||
|
"**/*.suo":true,
|
||||||
|
"**/*.user":true,
|
||||||
|
"**/*.userprefs":true,
|
||||||
|
"**/*.unityproj":true,
|
||||||
|
"**/*.dll":true,
|
||||||
|
"**/*.exe":true,
|
||||||
|
"**/*.pdf":true,
|
||||||
|
"**/*.mid":true,
|
||||||
|
"**/*.midi":true,
|
||||||
|
"**/*.wav":true,
|
||||||
|
"**/*.gif":true,
|
||||||
|
"**/*.ico":true,
|
||||||
|
"**/*.jpg":true,
|
||||||
|
"**/*.jpeg":true,
|
||||||
|
"**/*.png":true,
|
||||||
|
"**/*.psd":true,
|
||||||
|
"**/*.tga":true,
|
||||||
|
"**/*.tif":true,
|
||||||
|
"**/*.tiff":true,
|
||||||
|
"**/*.3ds":true,
|
||||||
|
"**/*.3DS":true,
|
||||||
|
"**/*.fbx":true,
|
||||||
|
"**/*.FBX":true,
|
||||||
|
"**/*.lxo":true,
|
||||||
|
"**/*.LXO":true,
|
||||||
|
"**/*.ma":true,
|
||||||
|
"**/*.MA":true,
|
||||||
|
"**/*.obj":true,
|
||||||
|
"**/*.OBJ":true,
|
||||||
|
"**/*.asset":true,
|
||||||
|
"**/*.cubemap":true,
|
||||||
|
"**/*.flare":true,
|
||||||
|
"**/*.mat":true,
|
||||||
|
"**/*.meta":true,
|
||||||
|
"**/*.prefab":true,
|
||||||
|
"**/*.unity":true,
|
||||||
|
"build/":true,
|
||||||
|
"Build/":true,
|
||||||
|
"Library/":true,
|
||||||
|
"library/":true,
|
||||||
|
"obj/":true,
|
||||||
|
"Obj/":true,
|
||||||
|
"ProjectSettings/":true,
|
||||||
|
"temp/":true,
|
||||||
|
"Temp/":true
|
||||||
|
}
|
||||||
|
}
|
112
TP3/Assets/Scripts/CourbesFermees.cs
Normal file
112
TP3/Assets/Scripts/CourbesFermees.cs
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class CourbesFermees : MonoBehaviour
|
||||||
|
{
|
||||||
|
// Liste des points composant la courbe
|
||||||
|
private List<Vector3> ListePoints = new List<Vector3>();
|
||||||
|
// Donnees i.e. points cliqués
|
||||||
|
public GameObject Donnees;
|
||||||
|
// Coordonnees des points composant le polygone de controle
|
||||||
|
private List<float> PolygoneControleX = new List<float>();
|
||||||
|
private List<float> PolygoneControleY = new List<float>();
|
||||||
|
|
||||||
|
// degres des polynomes par morceaux
|
||||||
|
public int degres = 5;
|
||||||
|
// nombre d'itération de subdivision
|
||||||
|
public int nombreIteration = 5;
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// fonction : subdivise //
|
||||||
|
// semantique : réalise nombreIteration subdivision pour des polys de //
|
||||||
|
// degres degres //
|
||||||
|
// params : - List<float> X : abscisses des point de controle //
|
||||||
|
// - List<float> Y : odronnees des point de controle //
|
||||||
|
// sortie : //
|
||||||
|
// - (List<float>, List<float>) : points de la courbe //
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
(List<float>, List<float>) subdivise(List<float> X, List<float> Y)
|
||||||
|
{
|
||||||
|
List<float> Xold = new List<float>(X);
|
||||||
|
List<float> Yold = new List<float>(Y);
|
||||||
|
|
||||||
|
List<float> XResult = new List<float>();
|
||||||
|
List<float> YResult = new List<float>();
|
||||||
|
|
||||||
|
for (int d = 1; d <= degres; d++)
|
||||||
|
{
|
||||||
|
XResult = new List<float>();
|
||||||
|
YResult = new List<float>();
|
||||||
|
|
||||||
|
for (int i = 0; i < Xold.Count; i++)
|
||||||
|
{
|
||||||
|
if (d != degres)
|
||||||
|
{
|
||||||
|
XResult.Add(Xold[i]);
|
||||||
|
YResult.Add(Yold[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
XResult.Add((Xold[(i + 1) % Xold.Count] + Xold[i]) / 2);
|
||||||
|
YResult.Add((Yold[(i + 1) % Yold.Count] + Yold[i]) / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
Xold = new List<float>(XResult);
|
||||||
|
Yold = new List<float>(YResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Xold, Yold);
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////// NE PAS TOUCHER //////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
if (Input.GetKeyDown(KeyCode.Return))
|
||||||
|
{
|
||||||
|
var ListePointsCliques = GameObject.Find("Donnees").GetComponent<Points>();
|
||||||
|
if (ListePointsCliques.X.Count > 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < ListePointsCliques.X.Count; ++i)
|
||||||
|
{
|
||||||
|
PolygoneControleX.Add(ListePointsCliques.X[i]);
|
||||||
|
PolygoneControleY.Add(ListePointsCliques.Y[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<float> Xres = new List<float>();
|
||||||
|
List<float> Yres = new List<float>();
|
||||||
|
|
||||||
|
(Xres, Yres) = subdivise(ListePointsCliques.X, ListePointsCliques.Y);
|
||||||
|
for (int i = 0; i < Xres.Count; ++i)
|
||||||
|
{
|
||||||
|
ListePoints.Add(new Vector3(Xres[i], -4.0f, Yres[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
Gizmos.color = Color.red;
|
||||||
|
for (int i = 0; i < PolygoneControleX.Count - 1; ++i)
|
||||||
|
{
|
||||||
|
Gizmos.DrawLine(new Vector3(PolygoneControleX[i], -4.0f, PolygoneControleY[i]), new Vector3(PolygoneControleX[i + 1], -4.0f, PolygoneControleY[i + 1]));
|
||||||
|
}
|
||||||
|
if (PolygoneControleX.Count > 0)
|
||||||
|
{
|
||||||
|
Gizmos.DrawLine(new Vector3(PolygoneControleX[PolygoneControleX.Count - 1], -4.0f, PolygoneControleY[PolygoneControleY.Count - 1]), new Vector3(PolygoneControleX[0], -4.0f, PolygoneControleY[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
Gizmos.color = Color.blue;
|
||||||
|
for (int i = 0; i < ListePoints.Count - 1; ++i)
|
||||||
|
{
|
||||||
|
Gizmos.DrawLine(ListePoints[i], ListePoints[i + 1]);
|
||||||
|
}
|
||||||
|
if (ListePoints.Count > 0)
|
||||||
|
{
|
||||||
|
Gizmos.DrawLine(ListePoints[ListePoints.Count - 1], ListePoints[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
43
TP3/Assets/Scripts/Points.cs
Executable file
43
TP3/Assets/Scripts/Points.cs
Executable file
|
@ -0,0 +1,43 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// Permet de stocker les coordonnees des points selectionnes a l'écran en vue d'un traitement
|
||||||
|
public class Points : MonoBehaviour
|
||||||
|
{
|
||||||
|
// Objet qui sera instancie sur un clic
|
||||||
|
public GameObject particle;
|
||||||
|
// Listes memoires des coordonnees
|
||||||
|
public List<float> X = new List<float>();
|
||||||
|
public List<float> Y = new List<float>();
|
||||||
|
|
||||||
|
// Methode appellee au debut du programme
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Methode appellee a chaque pas de simulation
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0f);
|
||||||
|
|
||||||
|
if (Input.GetButtonDown("Fire1"))
|
||||||
|
{
|
||||||
|
Vector3 wordPos;
|
||||||
|
Ray ray = Camera.main.ScreenPointToRay(mousePos);
|
||||||
|
RaycastHit hit;
|
||||||
|
if (Physics.Raycast(ray, out hit, 1000f))
|
||||||
|
{
|
||||||
|
wordPos = hit.point;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wordPos = Camera.main.ScreenToWorldPoint(mousePos);
|
||||||
|
}
|
||||||
|
Instantiate(particle, wordPos, Quaternion.identity);
|
||||||
|
X.Add(wordPos.x);
|
||||||
|
Y.Add(wordPos.z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
17
TP3/Assets/Scripts/Zoom.cs
Normal file
17
TP3/Assets/Scripts/Zoom.cs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// Script qui permet de zoomer avec la molette de la souris
|
||||||
|
public class Zoom : MonoBehaviour
|
||||||
|
{
|
||||||
|
|
||||||
|
private float scrollSpeed = 4.0f;
|
||||||
|
private float cameraDistance = 0f;
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
cameraDistance = Input.GetAxis("Mouse ScrollWheel") * scrollSpeed;
|
||||||
|
transform.Translate(new Vector3(0,0, cameraDistance));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue