Alvaro Cassinelli
/
skinGames_forktest
just a test
Fork of scoreLight_Advanced by
Diff: classPointMass.h
- Revision:
- 35:35af5086ab4f
- Parent:
- 30:d8af03f01cd4
--- a/classPointMass.h Wed Nov 07 14:41:55 2012 +0000 +++ b/classPointMass.h Tue Nov 13 04:40:08 2012 +0000 @@ -1,103 +1,103 @@ -/* - * pointMass.h - * laserBlob - * - * Created by CASSINELLI ALVARO on 5/19/11. - * Copyright 2011 TOKYO UNIVERSITY. All rights reserved. - * - */ - -#ifndef POINTMASS_H -#define POINTMASS_H - -#include "myVectorClass.h" - -#define VERLET_METHOD // comment this to have EULER method - -#define MAX_PERMISSIBLE_SPEED 70 - -class pointMass -{ -public: - - // ==================================== Static variables and methods ============== - static vector2Df maxWall, minWall; //equal for ALL THE MASS OBJECTS (declare static). But it could be per-mass. The problem with that approach would be too much wasted memory. - // NOTE: - a static member variable has the same value in any instance of the class and doesn't even require an instance of the class to exist. - // - a static class member cannot be initialized inside of the class declaration. In fact, if you decide to put your code in a header file, you cannot even initialize the static variable - // inside of the header file; do it in a .cpp file instead. Moreover, you are required to initialize the static class member or it will not be in scope. - // The syntax is a bit weird: "type class_name::static_variable = value", or in this case vector2Df pointMass::maxWall(4095, 4095) - - // methods: - static void setWallLimits(float mminx, float mminy, float mmaxx, float mmaxy); - - // ==================================== METHODS ==================================== - pointMass(); - virtual ~pointMass(){}; - - // Adding forces to total force: - void resetForce(); - void addForce(float x, float y); - void addForce(vector2Df force); - void addDampingForce(); - void addInvSquareForce(float x, float y, float radiusMax, float radiusMin, float scale); - void addInterInvSquareForce(pointMass &p, float radiusMin, float radiusMax, float scale); - - // (a blob object could be defined by a "cord" of chained particles, plus a center) - void addSpringForce(float x, float y, float radius, float scale); - void addInterSpringForce(pointMass &p, float radius, float scale); - //void addClockwiseForce(particle &p, float radius, float scale); - //void addCounterClockwiseForce(particle &p, float radius, float scale); - - //void addDampingForce(); // this work in the case of the euler integration; in case of Verlet, we need to do pseudo-damping while calculating - // the acceleration... - - // Set parameters: - void setInitialCondition(float px, float py, float vx, float vy); - void setInitialCondition(vector2Df _pos, vector2Df _speed); - void setIntegrationStep(float _dt); - - void setPos(float px, float py); // assuming the speed is unchanged (must do some tweaking in case of Verlet integration) - - // dynamic update: - void update(); - - // kinematic constraints (could be based on a force too...) - //void setWallLimits(float mminx, float mminy, float mmaxx, float mmaxy); // DECLARED STATIC - void bounceOffWalls(); - - vector2Df getSpeed(); // get an estimation of the speed (also update speed variable - this variable is not needed in case of VERLET) - void setSpeed(const vector2Df& vel); - void setSpeed(float vx, float vy); - - // ==================================== VARIABLES ==================================== - - int identifier; // this may be needed in particular in case we don't use vector<> (case of poor C Arduino compiler) - - // kinematic variables: - vector2Df pos, posOld; // I will use verlet integration (perhaps we could have a switch to choose the integration method?) - //vector2D speed; // speed at time t (this is not explicitly calculated in case of verlet method, HENCE PRIVATE) - vector2Df acc; // Acceleration at time t (equal to the total force divided by the mass). No real need to have it here, but convenient to check. - vector2Df totalForce; // this is just for convenience and speeding up calculation when adding forces, before computing acc. - - // integration step: - float dt; - - // physical parameters: - float dampMotion; - float dampBorder; - float mass; - bool bFixed; // these could act as control points that could be loaded (letters...). In fact, we could use mass to set this (like mass=-1) - - // other things: - bool bWallCollision; // this is generic (detect any collision with a side) - vector2Df innerCollitionDirection; // this is smarter than a boolean, because I can detect which side was touched and do different things (but may be memory consuming) - -protected: - -private: - vector2Df speed; // speed at time t (this is not explicitly calculated in case of verlet method, HENCE MAY BE PRIVATE) - -}; - - +/* + * pointMass.h + * laserBlob + * + * Created by CASSINELLI ALVARO on 5/19/11. + * Copyright 2011 TOKYO UNIVERSITY. All rights reserved. + * + */ + +#ifndef POINTMASS_H +#define POINTMASS_H + +#include "myVectorClass.h" + +#define VERLET_METHOD // comment this to have EULER method + +#define MAX_PERMISSIBLE_SPEED 35 + +class pointMass +{ +public: + + // ==================================== Static variables and methods ============== + static vector2Df maxWall, minWall; //equal for ALL THE MASS OBJECTS (declare static). But it could be per-mass. The problem with that approach would be too much wasted memory. + // NOTE: - a static member variable has the same value in any instance of the class and doesn't even require an instance of the class to exist. + // - a static class member cannot be initialized inside of the class declaration. In fact, if you decide to put your code in a header file, you cannot even initialize the static variable + // inside of the header file; do it in a .cpp file instead. Moreover, you are required to initialize the static class member or it will not be in scope. + // The syntax is a bit weird: "type class_name::static_variable = value", or in this case vector2Df pointMass::maxWall(4095, 4095) + + // methods: + static void setWallLimits(float mminx, float mminy, float mmaxx, float mmaxy); + + // ==================================== METHODS ==================================== + pointMass(); + virtual ~pointMass(){}; + + // Adding forces to total force: + void resetForce(); + void addForce(float x, float y); + void addForce(vector2Df force); + void addDampingForce(); + void addInvSquareForce(float x, float y, float radiusMax, float radiusMin, float scale); + void addInterInvSquareForce(pointMass &p, float radiusMin, float radiusMax, float scale); + + // (a blob object could be defined by a "cord" of chained particles, plus a center) + void addSpringForce(float x, float y, float radius, float scale); + void addInterSpringForce(pointMass &p, float radius, float scale); + //void addClockwiseForce(particle &p, float radius, float scale); + //void addCounterClockwiseForce(particle &p, float radius, float scale); + + //void addDampingForce(); // this work in the case of the euler integration; in case of Verlet, we need to do pseudo-damping while calculating + // the acceleration... + + // Set parameters: + void setInitialCondition(float px, float py, float vx, float vy); + void setInitialCondition(vector2Df _pos, vector2Df _speed); + void setIntegrationStep(float _dt); + + void setPos(float px, float py); // assuming the speed is unchanged (must do some tweaking in case of Verlet integration) + + // dynamic update: + void update(); + + // kinematic constraints (could be based on a force too...) + //void setWallLimits(float mminx, float mminy, float mmaxx, float mmaxy); // DECLARED STATIC + void bounceOffWalls(); + + vector2Df getSpeed(); // get an estimation of the speed (also update speed variable - this variable is not needed in case of VERLET) + void setSpeed(const vector2Df& vel); + void setSpeed(float vx, float vy); + + // ==================================== VARIABLES ==================================== + + int identifier; // this may be needed in particular in case we don't use vector<> (case of poor C Arduino compiler) + + // kinematic variables: + vector2Df pos, posOld; // I will use verlet integration (perhaps we could have a switch to choose the integration method?) + //vector2D speed; // speed at time t (this is not explicitly calculated in case of verlet method, HENCE PRIVATE) + vector2Df acc; // Acceleration at time t (equal to the total force divided by the mass). No real need to have it here, but convenient to check. + vector2Df totalForce; // this is just for convenience and speeding up calculation when adding forces, before computing acc. + + // integration step: + float dt; + + // physical parameters: + float dampMotion; + float dampBorder; + float mass; + bool bFixed; // these could act as control points that could be loaded (letters...). In fact, we could use mass to set this (like mass=-1) + + // other things: + bool bWallCollision; // this is generic (detect any collision with a side) + vector2Df innerCollitionDirection; // this is smarter than a boolean, because I can detect which side was touched and do different things (but may be memory consuming) + +protected: + +private: + vector2Df speed; // speed at time t (this is not explicitly calculated in case of verlet method, HENCE MAY BE PRIVATE) + +}; + + #endif //POINTMASS_H \ No newline at end of file