save loops

Dependencies:   mbed

elasticLoop.h

Committer:
mbedalvaro
Date:
2014-12-02
Revision:
1:3be7b7d050f4
Parent:
0:df6fdd9b99f0

File content as of revision 1:3be7b7d050f4:

/*
 *  elasticLoop.h
 *  laserBlobPure
 *
 *  Created by CASSINELLI ALVARO on 5/20/11.
 *  Copyright 2011 TOKYO UNIVERSITY. All rights reserved.
 *
 */
 
#ifndef ELASTIC_LOOP
#define ELASTIC_LOOP

// Include the basic objects to create the loop
#include "soundSpot.h"
#include "classPointMass.h"
#include "classSpring.h"

 #include <vector>
 using namespace std;

//#define MAX_NUM_MASSES  50
//#define PI 3.1415926

enum ElasticLoopMode {RELAX, CONTRACT, CONTRACT_CENTRAL, CONTRACT_CENTRAL_FAST, CONTOUR_FOLLOWING, CONTOUR_FOLLOWING_FAST, BOUNCING};

class elasticLoop : public soundSpot  {
    
public:
    
    // Constructor and destructor:
    elasticLoop();
    virtual ~elasticLoop();
    
    // instantiation of the virtual methods of the base class (we don't need to append "virtual", but for clarity I do):
    void createBlob(int _id, ElasticLoopMode _elasticBlobMode, vector2Df _initPos, vector2Df _initSpeed);
    virtual void setRegionMotion(float mmix, float mmiy, float mmax, float mmay); // attention: initial position posX and posY should be inside this bounding box...
    virtual void update(vector2Df referencePos);  // update dynamics of the mass loop   
    virtual void draw(void);  // draw the blob (renders on the laser trajectory object lsdTrajectory from the base class, using the openGL laser renderer - not yet done).
    virtual void computeBoundingBox();
    virtual void sendDataSpecific(void);
    // Some behaviour parameters:
    virtual void setSpeed(float speed) {};// do nothing in the case of elastic loop for the time being...
    virtual void setSize(float size) {}; // do nothing in the case of elastic loop for the time being...
    virtual void speedFactor(float speedfactor);
    virtual void sizeFactor(float sizeFactor) {}; // do nothing in the case of elastic loop for the time being...
       
    virtual void explosion() {}; // nothing for the time being 
    virtual vector2Df getCenter() {}; // nothing for the time being
    virtual void resetPositionSpeed() {};// nothing for the time being 
    virtual void setPositionSpeed(vector2Df _pos, vector2Df _spe) {};// nothing for the time being 
 
    virtual void showChildParameters();
 
    // methods that are new to this class (not in base class): 
    void initSizeBlob(int _numMasses);
    void createLoopFromScafold(void);
    void processLoopData(); // process elastic loop data
    
       // ====================== VARIABLES ======================

    //ElasticLoopMode loopMode;

    // The loop of masses with springs:
    int numMasses; // Number of particles in the elastic loop (this may or may not be equal to the number of points in the lsdTrajectory)
    float integrationStepLoop;
    vector<pointMass> massesLoop;
    vector<spring> loopSpringArray;
    // NOTE: to save memory, we can drop hairVector (use lightForce instead, and then normalize it when required)
    vector<vector2Df> hairVector; // the perpendiculars to the loop 
    vector<vector2Df> lightForce;
    //vector2D totalLightForce; // this belongs to the base class now
   
    // For the central anchor point:
    pointMass anchorMass;
    float  integrationStepAnchor;
    vector<spring> centralSpringArray;
    
    // Detail modes (could be in a struct)
    // Behaviour mode:
    bool pseudopodesMode;
    bool slidingDirection; // for contour following
    bool springForcesOnLoop;
    bool lightForcesOnLoop;
    bool forceBorderOnLoop;
    bool recenteringForceOnLoop;
    bool nuclearForceOnLoop;
    bool interParticleForceOnLoop;
    bool forceInternalPressureOnLoop;
    bool recenteringForceOnNucleus;
        
    // Recentering vector (obtained by rotating the total light force by an arbitrary angle) for the anchor mass, and for each point in the loop 
    // ex: if it is 180deg, then the blob just "bounces" on the zone transition; if it is 90, it does contour following... 
  
    // The following are common to all blobs:
   //  float angleCorrectionForceLoop;
   // vector2D recenteringVectorLoop;
   // float angleRecenteringVector; // auxiliary variables for sending data (for the recenteringVectorLoop)
   // float normRecenteringVector;
   
    float angleCorrectionForceNucleus;
    vector2Df recenteringVectorNucleus;
     
    // Numeric parameters: 
    float massLoopParticle; 
    float dampMotionMassesLoop;
    float massAnchor;
    float dampMotionAnchorMass;
    
    // initial size, position and center-mass speed of the elastic loop:
    float startRadius;
    //vector2D startCenter; // this belongs to the base class
    // vector2D startSpeed; // this belongs to base class
    
    float interSpringK, interSpringRelax;
    float centralSpringK, centralSpringRelax;
    float factorLightForce;
    float factorRecenteringAnchorMass;
    float factorRecenteringLoopMass;
    float factorPressureLoopMass;
    float factorForceBorder;
    float interParticleRange, factorInterParticleForce; // zach like blob force
    
  // SOUND SENDING MODES (specific to this kind of blob object): 
  /*
  // (a) anchor mass data: 
  bool sendingAnchorPosition;
  bool sendingAnchorForce; // this is the total force on the anchor mass, not just the recentering force
  bool sendingAnchorTouchWall;
  // (b) data from blob points:
  bool sendingLoopPositions;
  bool sendingLoopForces;// this is not just the forces from light, but all the forces in each particle
  bool sendingLoopForcesLight;
  bool sendingLoopRegions; // from this we can detect "hits"
  bool sendingLoopTouchWall;
  // (c) Blob geometry:
  bool sendingBlobArea;
  bool sendingBlobNormals;
  bool sendingBlobAngles; // redundant with sendingBlobNormals, but simplified (only angle of normal)
    */
    
};

#endif