forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			109 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			109 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/* Copyright (C) 2004-2013 MBSim Development Team
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Code was converted for the Bullet Continuous Collision Detection and Physics Library
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								This software is provided 'as-is', without any express or implied warranty.
							 | 
						|||
| 
								 | 
							
								In no event will the authors be held liable for any damages arising from the use of this software.
							 | 
						|||
| 
								 | 
							
								Permission is granted to anyone to use this software for any purpose, 
							 | 
						|||
| 
								 | 
							
								including commercial applications, and to alter it and redistribute it freely, 
							 | 
						|||
| 
								 | 
							
								subject to the following restrictions:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
							 | 
						|||
| 
								 | 
							
								2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
							 | 
						|||
| 
								 | 
							
								3. This notice may not be removed or altered from any source distribution.
							 | 
						|||
| 
								 | 
							
								*/
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								//The original version is here
							 | 
						|||
| 
								 | 
							
								//https://code.google.com/p/mbsim-env/source/browse/trunk/kernel/mbsim/numerics/linear_complementarity_problem/lemke_algorithm.cc
							 | 
						|||
| 
								 | 
							
								//This file is re-distributed under the ZLib license, with permission of the original author (Kilian Grundl)
							 | 
						|||
| 
								 | 
							
								//Math library was replaced from fmatvec to a the file src/LinearMath/btMatrixX.h
							 | 
						|||
| 
								 | 
							
								//STL/std::vector replaced by btAlignedObjectArray
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#ifndef BT_NUMERICS_LEMKE_ALGORITHM_H_
							 | 
						|||
| 
								 | 
							
								#define BT_NUMERICS_LEMKE_ALGORITHM_H_
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#include "LinearMath/btMatrixX.h"
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#include <vector> //todo: replace by btAlignedObjectArray
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								class btLemkeAlgorithm
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								public:
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  btLemkeAlgorithm(const btMatrixXu& M_, const btVectorXu& q_, const int & DEBUGLEVEL_ = 0) :
							 | 
						|||
| 
								 | 
							
									  DEBUGLEVEL(DEBUGLEVEL_)
							 | 
						|||
| 
								 | 
							
								  {
							 | 
						|||
| 
								 | 
							
									setSystem(M_, q_);
							 | 
						|||
| 
								 | 
							
								  }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  /* GETTER / SETTER */
							 | 
						|||
| 
								 | 
							
								  /**
							 | 
						|||
| 
								 | 
							
								   * \brief return info of solution process
							 | 
						|||
| 
								 | 
							
								   */
							 | 
						|||
| 
								 | 
							
								  int getInfo() {
							 | 
						|||
| 
								 | 
							
									return info;
							 | 
						|||
| 
								 | 
							
								  }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  /**
							 | 
						|||
| 
								 | 
							
								   * \brief get the number of steps until the solution was found
							 | 
						|||
| 
								 | 
							
								   */
							 | 
						|||
| 
								 | 
							
								  int getSteps(void) {
							 | 
						|||
| 
								 | 
							
									return steps;
							 | 
						|||
| 
								 | 
							
								  }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  /**
							 | 
						|||
| 
								 | 
							
								   * \brief set system with Matrix M and vector q
							 | 
						|||
| 
								 | 
							
								   */
							 | 
						|||
| 
								 | 
							
								  void setSystem(const btMatrixXu & M_, const btVectorXu & q_)
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										m_M = M_;
							 | 
						|||
| 
								 | 
							
										m_q = q_;
							 | 
						|||
| 
								 | 
							
								  }
							 | 
						|||
| 
								 | 
							
								  /***************************************************/
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  /**
							 | 
						|||
| 
								 | 
							
								   * \brief solve algorithm adapted from : Fast Implementation of Lemke’s Algorithm for Rigid Body Contact Simulation (John E. Lloyd)
							 | 
						|||
| 
								 | 
							
								   */
							 | 
						|||
| 
								 | 
							
								  btVectorXu solve(unsigned int maxloops = 0);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  virtual ~btLemkeAlgorithm() {
							 | 
						|||
| 
								 | 
							
								  }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								protected:
							 | 
						|||
| 
								 | 
							
								  int findLexicographicMinimum(const btMatrixXu &A, const int & pivotColIndex);
							 | 
						|||
| 
								 | 
							
								  bool LexicographicPositive(const btVectorXu & v);
							 | 
						|||
| 
								 | 
							
								  void GaussJordanEliminationStep(btMatrixXu &A, int pivotRowIndex, int pivotColumnIndex, const btAlignedObjectArray<int>& basis);
							 | 
						|||
| 
								 | 
							
								  bool greaterZero(const btVectorXu & vector);
							 | 
						|||
| 
								 | 
							
								  bool validBasis(const btAlignedObjectArray<int>& basis);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  btMatrixXu m_M;
							 | 
						|||
| 
								 | 
							
								  btVectorXu m_q;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  /**
							 | 
						|||
| 
								 | 
							
								   * \brief number of steps until the Lemke algorithm found a solution
							 | 
						|||
| 
								 | 
							
								   */
							 | 
						|||
| 
								 | 
							
								  unsigned int steps;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  /**
							 | 
						|||
| 
								 | 
							
								   * \brief define level of debug output
							 | 
						|||
| 
								 | 
							
								   */
							 | 
						|||
| 
								 | 
							
								  int DEBUGLEVEL;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  /**
							 | 
						|||
| 
								 | 
							
								   * \brief did the algorithm find a solution
							 | 
						|||
| 
								 | 
							
								   *
							 | 
						|||
| 
								 | 
							
								   * -1 : not successful
							 | 
						|||
| 
								 | 
							
								   *  0 : successful
							 | 
						|||
| 
								 | 
							
								   */
							 | 
						|||
| 
								 | 
							
								  int info;
							 | 
						|||
| 
								 | 
							
								};
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#endif /* BT_NUMERICS_LEMKE_ALGORITHM_H_ */
							 |