classes/liaisons/CLASS-PivotMale.js

//Pivot animée, en attendant d'être placée
/*
var PivotMale = function()
{
	//==========================
	//Constructeur issu de l'heritage
	//==========================

		DemiLiaison.call(this);


	//==========================
	//Variables Membres
	//==========================
	
		//Définition
		this._genre = "male";	//Permet de discriminer la liaison "male" et la liaison "femelle"
		
		//Caractéristiques géométriques de la liaison
		this._rayon=10;
		this._longueurTige=20;
		


	//==========================
	//getter/setter
	//==========================

		// Rayon du cercle
		this.rayon=function(r)
		{
			if(typeof(r)!='undefined')
				{
					this._rayon=r;
					//Met à jour les couleur directement sur les graphismes
					// ... à faire
				}
			return this._rayon;
		}
		
		//Longueur tige
		this.longueurTige=function(l)
		{
			if(typeof(l)!='undefined')
				{
					this._longueurTige=l;
					//Met à jour les couleur directement sur les graphismes
					// ... à faire
				}
			return this._longueurTige;
		}

	//==========================
	//Autres fonctions membres
	//==========================

		//ECRASE L'ANCIENNE
		//Fonction qui met à jour la couleur des graphismes de la liaison (appelée avec this.couleur() en setter)
		this.updateCouleurGraphismes = function(_coul)
		{
			this._cercle.graphics._stroke.style=_coul;
			this._tige.graphics._stroke.style=_coul;
		}

		//ECRASE L'ANCIENNE
		//Fonction qui met à jour l'épaisseur des graphismes de la liaison (appelée avec this.epaisseur() en setter)
		this.updateEpaisseurGraphismes = function(_ep)
		{
			// À FAIRE
		}

		
		//ECRASE L'ANCIENNE
		//Ajoute (dans la grosse matrice K et F globale) la sous partie liée à la liaison
		this.remplisSysteme_liaison = function(K,F)
		{
			var O1L1 = this.O1L1();
			var O2L2 = this.demiSoeur().O1L1();
			var L1L2 = this.L1L2();
			var k = this._k
			var n1 = this.classe().numero(); //Numéro de la CE
			var n2 = this.demiSoeur().classe().numero() // Numéro de la CE de la demi-Soeur
		
		
			//NOTE : il faudra peut être condenser les lignes suivantes
					
			var KK = [	[-k,		0,		k*O1L1.y,								k,		0,		-k*O2L2.y],
					[0,		-k,		-k*O1L1.x,								0,		k,		k*O2L2.x],
					[O1L1.y*k,	-O1L1.x*k,	-k*(O1L1.y*O1L1.y+O1L1.x*O1L1.x+O1L1.y*L1L2.y-O1L1.x*L1L2.x),	-O1L1.y*k,	O1L1.x*k,	k*(O1L1.y*O2L2.y+O1L1.x*O2L2.x)]	
					]
					//[O1L1.y*k,	-O1L1.x*k,	-k*(O1L1.y*O1L1.y+O1L1.x*O1L1.x),	-O1L1.y*k,	O1L1.x*k,	k*(O1L1.y*O2L2.y+O1L1.x*O2L2.x)]	] //Ancien
					
			//var FF = [k*L1L2.x,k*L1L2.y,k*(O1L1.x*L1L2.y-O1L1.y*L1L2.x)]
			var FF = [-k*L1L2.x,	-k*L1L2.y,	k*(O1L1.y*L1L2.x-O1L1.x*L1L2.y)]
			

			
			//On recopie dans les bonnes lignes de K et F
			for(var i=0; i<3 ; i++) // Pour chacune des 3 lignes
			{
				// Recopiage
				//K.set([3*n1+i,3*n1], K.get([3*n1+i,3*n1])+KK[i][0])
				K.ajouteVal( 3*n1+i , 3*n1,	KK[i][0])
				K.ajouteVal( 3*n1+i , 3*n1+1, KK[i][1])
				K.ajouteVal( 3*n1+i , 3*n1+2, KK[i][2])
				
				K.ajouteVal( 3*n1+i , 3*n2, 	KK[i][3])
				K.ajouteVal( 3*n1+i , 3*n2+1,	KK[i][4])
				K.ajouteVal( 3*n1+i , 3*n2+2,  KK[i][5])
				
				F.ajouteVal( 3*n1+i, FF[i])
				

			}
			
			
			// AJOUTE DE LA MOTORISATION
			if(this._pilotee && ACTION == "simule")
			{
			
				var k = this._kRot //Raideur en rotation
				var signe = 1-2*(this._genre=="male")
				var deltaTheta0 = this.classe().lastPosition().theta-this.demiSoeur().classe().lastPosition().theta;	//Ecart initial
				var deltaTheta = this.classe().rotation-this.demiSoeur().classe().rotation;	//Ecart actuel
				K.ajouteVal(3*n1+2, 3*n1+2, -k)
				K.ajouteVal(3*n2+2, 3*n2+2, k)

				F.ajouteVal(3*n1+2, k*(deltaTheta-deltaTheta0+signe*this.consigneAngulaire()));//+k*)
			}
			
			return {K:KK,F:FF}
		}

		//Fonction qui sert de consigne angulaire, dans le cas où c'est une piloté
		this.consigneAngulaire=function()
		{
			var t=schema.tSimulation();
			//return -t*20;
			
			var omega = 2*math.pi*0.1 //vitesse angulaire
			return math.sin(omega*t)*30-30
		}

		
	//==========================
	//Graphismes
	//==========================
	
		this._cercle=new createjs.Shape();
		this._cercle.graphics.setStrokeStyle(this._epaisseur).beginStroke(this._couleur).beginFill("white").drawCircle(0, 0, this._rayon);
		this.addChild(this._cercle);
		
		this._tige=new createjs.Shape();
		this._tige.graphics.setStrokeStyle(this._epaisseur).beginStroke(this._couleur).moveTo(this._rayon,0).lineTo(this._rayon+this._longueurTige,0);
		this.addChild(this._tige);


		//Les shapes n'ont pas de bornes. Alors on va en créer
		
		this.setBounds(-this._rayon-this._longueurTige,-this._rayon-this._longueurTige,2*(this._rayon+this._longueurTige),2*(this._rayon+this._longueurTige))


}
PivotMale.prototype = Object.create(DemiLiaison.prototype);//On recopie le prototype de DemiLiaison
PivotMale.prototype.constructor = PivotMale;//On recopie le constructeur de Noeud dans son prototype

*/




/**
 * Demi-liaison "Pivot" désignée comme mâle
 * @extends DemiLiaison
 */
class PivotMale extends DemiLiaison
{


	// **********************************************************
	/*
	 * Constructeur
	 */
	constructor()
	{
		super()	// Rappelle le constructeur parent
		
		
		// Constantes ************
		this._genre = "male";	//Permet de discriminer la liaison "male" et la liaison "femelle"
		
		
		// Graphismes **********
		this._cercle=new createjs.Shape();
		this._cercle.graphics.setStrokeStyle(this._epaisseur).beginStroke(this._couleur).beginFill("white").drawCircle(0, 0, this._rayon);
		this.addChild(this._cercle);
		
		this._tige=new createjs.Shape();
		this._tige.graphics.setStrokeStyle(this._epaisseur).beginStroke(this._couleur).moveTo(this._rayon,0).lineTo(this._rayon+this._longueurTige,0);
		this.addChild(this._tige);


		//Les shapes n'ont pas de bornes. Alors on va en créer
		
		this.setBounds(-this._rayon-this._longueurTige,-this._rayon-this._longueurTige,2*(this._rayon+this._longueurTige),2*(this._rayon+this._longueurTige))
		
	}
	
	
	
	// MEMBRES **********************************************************
	
			/** Rayon du cercle qui dessine la liaison pivot, en px.
			@type {Number}  */
		_rayon = 10 ;
		
			/** Longueur de la tige (à partir du cercle), en px.
			@type {Number}  */
		_longueurTige = 20;
		
			/** Dessin le cercle
			@type {createjs.Shape}  */
		_cercle = new createjs.Shape();
		
			/** Dessin la tige
			@type {createjs.Shape}  */
		_tige = new createjs.Shape();
		
	// getter/setter ****************************************************

			/** GETTER / SETTER du rayon.
			@param {Number} r - [OPTIONNEL] Nouvelle valeur du rayon.
			@return {Number} Le rayon courant
			*/
		rayon(r)
		{
			if(typeof(r)!='undefined')
				{
					this._rayon=r;
					//Met à jour les dimensions directement sur les graphismes
					// ... à faire
				}
			return this._rayon;
		}
		
			/** GETTER / SETTER de la longueur de tige.
			@param {Number} l - [OPTIONNEL] Nouvelle valeur de la longueure.
			@return {Number} La longueur courante
			*/
		longueurTige(l)
		{
			if(typeof(l)!='undefined')
				{
					this._longueurTige=l;
					//Met à jour les dimensions directement sur les graphismes
					// ... à faire
				}
			return this._longueurTige;
		}
		
	//==========================
	//Autres fonctions membres
	//==========================

			/** Fonction qui met à jour la couleur des graphismes de la liaison (appelée avec this.couleur() en setter). Écrase la méthode abstraite mère.
			@param {String} _coul - Couleur
			*/
		updateCouleurGraphismes(_coul)
		{		
			this._cercle.graphics._stroke.style=_coul;
			this._tige.graphics._stroke.style=_coul;
		}
		
			/** Fonction qui met à jour l'épaisseur des graphismes de la liaison (appelée avec this.epaisseur() en setter). Écrase la méthode abstraite mère.
			@param {Number} _ep - Épaisseur
			*/
		updateEpaisseurGraphismes(_ep)
		{
			// À FAIRE
		}

			/** (ECRASE L A FONCTION ABSTRAITE) Ajoute (= modifie en place dans les grosses matrices K et F globales) la sous partie liée à la liaison. Écrase la méthode abstraite mère. Voir la démonstration à cette adresse : {@link http://cillon.allais.eu/ressources/demo_pivot.pdf}.
			@param {Array} K - Référence vers la matrice K générale du système global.
			@param {Array} F - Référence vers le vecteur F second membre du système global (vecteur en ligne, à une dimension)
			@return {Object} {K:   , F :} Objet représentant les PETITES matrices du système, liées à la liaison (Attention, ce ne sont pas les matrices globales)
			*/
		remplisSysteme_liaison(K,F)
		{
			var O1L1 = this.O1L1();
			var O2L2 = this.demiSoeur().O1L1();
			var L1L2 = this.L1L2();
			var k = this._k
			var n1 = this.classe().numero(); //Numéro de la CE
			var n2 = this.demiSoeur().classe().numero() // Numéro de la CE de la demi-Soeur
		
		
			//NOTE : il faudra peut être condenser les lignes suivantes
					
			var KK = [	[-k,		0,		k*O1L1.y,								k,		0,		-k*O2L2.y],
					[0,		-k,		-k*O1L1.x,								0,		k,		k*O2L2.x],
					[O1L1.y*k,	-O1L1.x*k,	-k*(O1L1.y*O1L1.y+O1L1.x*O1L1.x+O1L1.y*L1L2.y-O1L1.x*L1L2.x),	-O1L1.y*k,	O1L1.x*k,	k*(O1L1.y*O2L2.y+O1L1.x*O2L2.x)]	
					]
					//[O1L1.y*k,	-O1L1.x*k,	-k*(O1L1.y*O1L1.y+O1L1.x*O1L1.x),	-O1L1.y*k,	O1L1.x*k,	k*(O1L1.y*O2L2.y+O1L1.x*O2L2.x)]	] //Ancien
					
			//var FF = [k*L1L2.x,k*L1L2.y,k*(O1L1.x*L1L2.y-O1L1.y*L1L2.x)]
			var FF = [-k*L1L2.x,	-k*L1L2.y,	k*(O1L1.y*L1L2.x-O1L1.x*L1L2.y)]
			

			
			//On recopie dans les bonnes lignes de K et F
			for(var i=0; i<3 ; i++) // Pour chacune des 3 lignes
			{
				// Recopiage
				//K.set([3*n1+i,3*n1], K.get([3*n1+i,3*n1])+KK[i][0])
				K.ajouteVal( 3*n1+i , 3*n1,	KK[i][0])
				K.ajouteVal( 3*n1+i , 3*n1+1, KK[i][1])
				K.ajouteVal( 3*n1+i , 3*n1+2, KK[i][2])
				
				K.ajouteVal( 3*n1+i , 3*n2, 	KK[i][3])
				K.ajouteVal( 3*n1+i , 3*n2+1,	KK[i][4])
				K.ajouteVal( 3*n1+i , 3*n2+2,  KK[i][5])
				
				F.ajouteVal( 3*n1+i, FF[i])
				

			}
			
			
			// AJOUTE DE LA MOTORISATION
			if(this._pilotee && ACTION == "simule")
			{
			
				var k = this._kRot //Raideur en rotation
				var signe = 1-2*(this._genre=="male")
				var deltaTheta0 = this.classe().lastPosition().theta-this.demiSoeur().classe().lastPosition().theta;	//Ecart initial
				var deltaTheta = this.classe().rotation-this.demiSoeur().classe().rotation;	//Ecart actuel
				K.ajouteVal(3*n1+2, 3*n1+2, -k)
				K.ajouteVal(3*n2+2, 3*n2+2, k)

				F.ajouteVal(3*n1+2, k*(deltaTheta-deltaTheta0+signe*this.evalueConsigne()*57.29577951308232  ));//+k*) // 57,29... = conversion rad / deg
			}
			
			return {K:KK,F:FF}
		}
		
			/* Fonction qui sert de consigne angulaire, dans le cas où c'est une piloté.
			@retrun {Number} Valeur de la consigne, instantanée (à la date schema.tSimulation).
			*/
		/*consigneAngulaire()
		{
			var t=schema.tSimulation();
			//return -t*20;
			
			var omega = 2*math.pi*0.1 //vitesse angulaire
			return math.sin(omega*t)*30-30
		}*/

	

			/** Fonction qui calcule le score (= la distance) entre chaque demi liaison pivot (écrase la fonction abstraite)
			@ return {Number} Score
			*/
		getScore()
		{
			var V= this.L1L2();
			var ecart_distance = Math.sqrt(V.x*V.x+V.y*V.y); // en px
			var ecart_consigne = 0 // en °
			
			if(this._pilotee && ACTION == "simule")
			{
				var deltaTheta0 = this.classe().lastPosition().theta-this.demiSoeur().classe().lastPosition().theta;	//Ecart initial
				var deltaTheta = this.classe().rotation-this.demiSoeur().classe().rotation;	//Ecart actuel
				var signe = 1-2*(this._genre=="male")
				ecart_consigne = Math.abs(deltaTheta-deltaTheta0+signe*this.evalueConsigne()*57.29577951308232);
			}
			return  ecart_distance + ecart_consigne;
		}
}