bonhomeExamJanvier/Bonhomme01/Jambe.cs

208 lines
9.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Numerics;
namespace Bonhomme01
{
class Jambe : Rectangle
{
private int etapeMarche = 0;
Rectangle jambeBas, pied;
public Color Fond
{
get
{
return base.fond;
}
set
{
base.fond = jambeBas.fond = pied.fond = value;
}
}
public struct AngleJambe
{
public float AngleBassin;
public float AngleGenou;
public float AngleCheville;
public AngleJambe(float angleBassin, float angleGenou, float angleCheville)
{
this.AngleBassin = angleBassin;
this.AngleGenou = angleGenou;
this.AngleCheville = angleCheville;
}
}
public AngleJambe angleJambe;
public Jambe(PictureBox hebergeur, Point origine, int Lhorizontal, int Lvertical) : base(hebergeur, origine, Lhorizontal, Lvertical / 2)
{
Rectangle me = this;
angleJambe = new AngleJambe(0, 0, 0);
base.angleRotation = angleJambe.AngleBassin;
jambeBas = new Rectangle(hebergeur, Lhorizontal, Lvertical / 2, ref me, angleJambe.AngleGenou);
pied = new Rectangle(hebergeur, Lhorizontal * 2, Lvertical / 10, ref jambeBas, angleJambe.AngleCheville);
}
public Jambe(PictureBox hebergeur, Point origine, int Lhorizontal, int Lvertical, AngleJambe angle) : base(hebergeur, origine, Lhorizontal, Lvertical / 2, angle.AngleBassin)
{
Rectangle me = this;
angleJambe = angle;
jambeBas = new Rectangle(hebergeur, Lhorizontal, Lvertical / 2, ref me, angleJambe.AngleGenou);
pied = new Rectangle(hebergeur, Lhorizontal * 2, Lvertical / 10, ref jambeBas, angleJambe.AngleCheville);
}
public Jambe(PictureBox hebergeur, Point origine, int Lhorizontal, int Lvertical, AngleJambe angle, Point origineRotation) : base(hebergeur, origine, Lhorizontal, Lvertical / 2, angle.AngleBassin, origineRotation)
{
Rectangle me = this;
angleJambe = angle;
jambeBas = new Rectangle(hebergeur, origine, Lhorizontal, Lvertical / 2, angleJambe.AngleGenou, origineRotation);
pied = new Rectangle(hebergeur, jambeBas.CIG, Lhorizontal * 2, Lvertical / 10, angleJambe.AngleCheville, origineRotation);
}
public new void Afficher(IntPtr handle)
{
base.angleRotation = angleJambe.AngleBassin;
jambeBas.angleRotation = angleJambe.AngleGenou;
pied.angleRotation = angleJambe.AngleCheville;
base.CentrerPointOrigine();
base.Afficher(handle);
jambeBas.CentrerPointOrigine();
jambeBas.Afficher(handle);
//pied.CentrerPointOrigine();
pied.Afficher(handle);
}
public new void Cacher(IntPtr handle)
{
base.angleRotation = angleJambe.AngleBassin;
jambeBas.angleRotation = angleJambe.AngleGenou;
pied.angleRotation = angleJambe.AngleCheville;
base.Cacher(handle);
jambeBas.Cacher(handle);
pied.Cacher(handle);
}
public float Genou
{
get { return jambeBas.angleRotation; }
set { jambeBas.angleRotation = angleJambe.AngleGenou = value % 360; }
}
public float Cheville
{
get { return pied.angleRotation; }
set { pied.angleRotation = angleJambe.AngleCheville = value % 360; }
}
public void Bouger(int x, int y)
{
//Origine = new Point(Origine.X + x, Origine.Y + y);
// jambeBas.Origine = new Point(jambeBas.Origine.X + x, jambeBas.Origine.Y + y);
// pied.Origine = new Point(pied.Origine.X + x, pied.Origine.Y + y);
}
public void Monter(int x)
{
MajAngle();
Vecteur l = new Vecteur(new Vecteur(base.CSG, base.CSD).Millieux(), new Vecteur(jambeBas.CIG, jambeBas.CID).Millieux());//Vecteur entre le haut et le bas du pied
Vecteur m = new Vecteur(new Vecteur(base.CSG, base.CSD).Millieux(), new Vecteur(base.CIG, base.CID).Millieux());//Vecteur entre le haut et le genou
// var a = ((l.ABS - x) * (l.ABS - x));
int lvertical = (int)m.ABS; //var b = (2 * (l.ABS - x) * Lvertical);
Console.WriteLine("L:{0} vert:{1} x:{2}", l.ABS, lvertical, x);
double bla = (Math.Pow((l.ABS - x), 2)) / (2 * (l.ABS) * (lvertical));
Console.WriteLine("bla:{0}", bla);
double angle = Math.Acos(bla);
angle *= 180;
angle /= Math.PI;
Console.WriteLine(angle);
angleJambe.AngleBassin = (float)-angle;
angleJambe.AngleGenou = (float)angle;
}
public void Avancer(int x)
{
x = 10;
MajAngle();
Vecteur l = new Vecteur(new Vecteur(base.CSG, base.CSD).Millieux(), new Vecteur(jambeBas.CIG, jambeBas.CID).Millieux());//Vecteur entre le haut et le bas de la jambe
Vecteur m = new Vecteur(new Vecteur(base.CSG, base.CSD).Millieux(), new Vecteur(base.CIG, base.CID).Millieux());//Vecteur entre le haut et le genou
/* Vecteur m = new Vecteur(new Vecteur(base.CSG, base.CSD), new Vecteur(pied.CIG, pied.CID));//Vecteur entre le haut et le bas du pied
// var a = ((l.ABS - x) * (l.ABS - x));
double lvertical = (new Vecteur(base.CSG, base.CIG)).ABS/* m.ABS*/
//try
//{
Vecteur vecteurPied = new Vecteur(jambeBas.CIG.X+x, jambeBas.CIG.Y, base.CSG.X, base.CSG.Y);//Vecteur entre le haut et le bas de la jambe
vecteurPied.DeplacerSurOrigine();
double rayon = m.ABS;
Console.WriteLine("Rayon : " + rayon);
double paramA = Math.Pow(vecteurPied.X, 2) + Math.Pow(vecteurPied.Y, 2);
paramA /= vecteurPied.Y * 2;
Console.WriteLine("pied X : " + vecteurPied.X + " ;; pied Y : " + vecteurPied.Y + " ;; a : " + paramA);
double paramRacineDelta = Math.Pow(paramA, 2) * Math.Pow(vecteurPied.Y, 2);
paramRacineDelta = (Math.Pow(rayon, 2) * (Math.Pow(vecteurPied.X, 2) + Math.Pow(vecteurPied.Y, 2))) - paramRacineDelta;
paramRacineDelta = 2 * Math.Sqrt(paramRacineDelta);
paramRacineDelta /= Math.Abs(vecteurPied.Y);
double pxSurPy = vecteurPied.X / vecteurPied.Y;
double cooGenouX = -2 * paramA * pxSurPy + paramRacineDelta;
cooGenouX /= 2 + 2 * Math.Pow(pxSurPy, 2);
double cooGenouY = paramA - pxSurPy * cooGenouX;
Complex genouComplex = new Complex(cooGenouX, cooGenouY);
angleJambe.AngleBassin = -(float)(genouComplex.Phase * 57.2958)%90;
Vecteur vecteurGenouPied = new Vecteur(vecteurPied.X, vecteurPied.Y, (int)cooGenouX, (int)cooGenouY);
vecteurGenouPied.DeplacerSurOrigine();
angleJambe.AngleGenou = (float)(vecteurGenouPied.point.Phase * 57.2958)%90;
//}
//catch
// {
// }
/*
int lvertical = (int)m.ABS;
Console.WriteLine("DBG1 : m.abs :" + lvertical + " ; angle genou : " + angleJambe.AngleGenou);
Complex haut = new Complex(base.CSG.X, base.CSG.Y);
Complex Pointgenou;
Complex Pointpied = new Complex(this.pied.CSG.X + x, this.pied.CSG.Y);
Pointpied = Pointpied - haut;
double genouxX, genouY;
double a = Math.Pow(Pointpied.Real, 2) + Math.Pow(Pointpied.Imaginary, 2);
Console.WriteLine("a=" + a + "+++++" + Pointpied.ToString());
a /= (2 * Pointpied.Imaginary);
//ax²+bx+c=0
double eqa = 1;
double eqb = -Pointpied.Real / (Math.Pow(Pointpied.Imaginary, 2));
double eqc = (a * Pointpied.Imaginary); eqc /= Math.Pow(Pointpied.Imaginary, 2); eqc -= Math.Pow(lvertical, 2);
double delta = Math.Pow(eqb, 2) - 4 * eqa * eqc;
genouxX = (-eqb) - Math.Sqrt(delta); genouxX /= 2 * eqa;
genouY = a - genouxX * (-Pointpied.Real / Pointpied.Imaginary);
Console.WriteLine("Genou X : {0} ;; Genou Y : {1} ;; COUPUTE ;; Genou X : {2} ;; Genou Y : {3}",Pointpied.ToString(), genouxX, genouxX, genouY);
Pointgenou = new Complex(genouxX, genouY);
angleJambe.AngleBassin = (float)(Pointgenou.Phase);
angleJambe.AngleBassin *= (float)(180 / Math.PI);
//Pointpied = Pointpied - Pointgenou;
angleJambe.AngleGenou = (float)(Pointpied.Phase * 57.2958);
angleJambe.AngleGenou *= (float)(180 / Math.PI);
Console.WriteLine("DBG2 : m.abs :" + lvertical + " ; angle genou : " + angleJambe.AngleGenou);*/
MajAngle();
}
private void MajAngle()
{
base.angleRotation = angleJambe.AngleBassin;
jambeBas.angleRotation = angleJambe.AngleGenou;
pied.angleRotation = angleJambe.AngleCheville;
}
}
}