25409


こんにちは

openframeworkの勉強をしていて気になったので質問です。  
yoppaさんのサンプルを見ているのですが、バネとパーティクルという自作クラスの読み込み方が見慣れないものだったのです。

構図としては、まずparticleというクラスがあって、それをincludeして使っているspringクラスがあり、testApp内で出力というものなのですが、springクラス内ではparticleそのものではなくて、そのアドレスをメンバにし、その後testAppでparticleをわざわざincludeして、springのメンバのparticleアドレスに代入しています。

個人的にみれば、普通にspringクラス内でparticleを宣言して、そのままparticleを格納すればいいように思えるのですが........。この方が処理が早くなる、もしくは何らかのメリットがあるのでしょうか？

説明がわかりにくくて申し訳ないですが、よろしくお願いいたします。（一応下に問題の箇所のコードを記述しておきました）  
[サンプルのあるページ](http://yoppa.org/ma2_11/3234.html)

[code]

    class particle
    {
    public:
        ofVec2f pos;
        ofVec2f vel;
        ofVec2f frc;
    
        particle();
        virtual ~particle(){};
    
        void resetForce();
        void addForce(float x, float y);
    
        void addDampingForce();
    
        void setInitialCondition(float px, float py, float vx, float vy);
        void update();
        void draw();
    
        void bounceOffWalls();
    
        bool  bFixed;
    
        float damping;
    
    protected:
    private:
    };
    
[/code]

[code]

    class spring {
    
    public:
    
        spring();
    
        //ここで何故かアドレスを格納している
        particle * particleA;
        particle * particleB;
    
        float distance;
        float springiness;   // this is the k, springiness constant
    
        void update();
        void draw();    
    };
    
[/code]

[code]

    class testApp : public ofSimpleApp{
    
    public:
    
        void setup();
        void update();
        void draw();
    
        void keyPressed  (int key);
        void keyReleased (int key);
    
        void mouseMoved(int x, int y );
        void mouseDragged(int x, int y, int button);
        void mousePressed(int x, int y, int button);
        void mouseReleased();
    
        spring mySpring;
        particle particle_a, particle_b;
    };
    
    void testApp::setup(){  
        //ここでアドレスに代入
        mySpring.particleA = &particle_a;
        mySpring.particleB = &particle_b;
    }
    
[/code]


CC BY-SA 3.0
2016-06-01T02:23:18.600
25348
2016-06-03T05:49:50.850
2016-06-03T05:49:50.850
3068
15418
question
openframeworks
openframeworksのclassで、アドレスを使うことのメリット
  
  
「アドレスを使う」ではなく、spring（バネ）のオブジェクトは、バネの両端につながっている物(particle(粒）のオブジェクト））への参照を持っているというふうに解釈すると判り易いと思います。  
バネと粒を使って作られる平面上の力学模型を思い浮かべると、イメージがわくかと思います。

springオブジェクトの中に粒のオブジェクトを２つ設けるのではなく、粒への参照を２つ設けるのは、表現力が上がるからです。

粒A == バネX == 粒B
であれば、springオブジェクトに内在するのがparticleのオブジェクトでも、particleオブジェクトへの参照でも問題有りません。

しかし、springオブジェクトにparticleのオブジェクトが内在する形式だと、 粒A == バネX == 粒B == バネY == 粒C
というようなモデル（粒Bに２つのバネ(X,Y)がつながっている）を表現することが出来ません。
（particleへの参照であれば、バネXの終端と、バネYの始端を同じ粒Bとすることができます）


CC BY-SA 3.0
2016-06-03T05:21:53.090
25409
2016-06-03T05:21:53.090
217
25348
answer