ODEã§å­¦ã¶C言語2 [STEP5: 構造体]

2010-07-20
By
domino

Step5サンプルプログラム:ドミノ倒ã—

ODEã§å­¦ã¶C言語2ã®Step5ã§ã™ï¼Žä»Šå›žã¯æ§‹é€ ä½“ã¨ç‰©ä½“ã¸åŠ›ã‚„ãƒˆãƒ«ã‚¯ã‚’åŠ ãˆã‚‹æ–¹æ³•,ã•らã«ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®ãƒªã‚»ãƒƒãƒˆæ³•ãªã©ã‚’å­¦ã³ã¾ã™ï¼Žæ§‹é€ ä½“ã®æ¦‚è¦ã«ã¤ã„ã¦ã¯æ—¢ã«ã‚ã‹ã£ã¦ã„ã‚‹ã‚‚ã®ã¨ã—,サンプルコードを示ã™ã“ã¨ã«ã‚ˆã‚Šå…·ä½“çš„ãªä½¿ã„方を学ã³ã¾ã™ï¼Ž

○ 構造体

é…列ã§ã¯åŒã˜åž‹ã—ã‹ã¾ã¨ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸãŒï¼Œæ§‹é€ ä½“ã§ã¯é•ã†åž‹ã‚’ã¾ã¨ã‚ã¦æ‰±ã†ã“ã¨ãŒã§ãã‚‹ã®ã§ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ç‰©ä½“ã«å¤šãã®å±žæ€§ãŒã‚ã‚‹å ´åˆã«ä¾¿åˆ©ã§ã™ï¼Žã“ã®ã‚µãƒ³ãƒ—ルプログラムã§ã¯ç‰©ä½“ã‚’dmObjectã¨ã„ã†æ§‹é€ ä½“ã§æ¬¡ã®ã‚ˆã†ã«è¡¨ã—ã¦ã„ã¾ã™ï¼Ždm5.hã®ï¼‘6行目ã«å®šç¾©ã—ã¦ã„ã¾ã™ï¼Žä»Šå›žã®ä¾‹ã¯ãƒ‰ãƒŸãƒŽå€’ã—ãªã®ã§ï¼Œã“ã®æ§‹é€ ä½“ã‚’å…ƒã«ãƒ‰ãƒŸãƒŽã‚’21個生æˆã—ã¦ã„ã¾ã™ï¼Ž

typedef struct{
    dBodyID body; // ボディã®ID
    dGeomID geom; // ジオメトリã®ID
    const double *p; // x, y, z [m]
    const double *R;   // 回転行列 è¦ç´ æ•°4x3
    double m; // è³ªé‡ [kg]
    double r,l; // åŠå¾„ [m], é•·ã• [m]
    const double *side; // サイズ x,y,z
    const double *color; // 色 r,g,b
} dmObject;

â—‹ å§¿å‹¢ã®å¤‰æ›´

物体ã®å§¿å‹¢ã‚’変更ã™ã‚‹ãŸã‚ã«ã¯æ¬¡ã®APIを使ã„回転行列Rã®å€¤ã‚’変更ã—ã¾ã™ï¼Žã“ã“ã§ï¼ŒRã¯å›žè»¢è¡Œåˆ—ãŒæ ¼ç´ã•れã¦ã„ã‚‹é…列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ï¼Œax, ay, axã¯å›žè»¢è»¸ãƒ™ã‚¯ãƒˆãƒ«ï¼Žangleã¯å›žè»¢è§’度ã¨ãªã‚Šã¾ã™ï¼ŽãªãŠï¼Œdã ã‘ã§å§‹ã¾ã‚‹APIã¯ODEã®APIã§ã™ï¼Ž

  • dRFromAxisAndAngle(double R[12], double  ax, doulbe  ay, double  az, double angle);

○ 力,トルクã®åŠ ãˆæ–¹

  • void dmAddForce(dmObject *obj, double fx, double fy, double fz)
    • 物体objã®é‡å¿ƒã«åŠ›(fx,fy,fz)を加ãˆã‚‹
  • void dmAddTorque(dmObject *obj, double fx, double fy, double fz)
    • 物体objã®é‡å¿ƒã«ãƒˆãƒ«ã‚¯(fx, fy, fz)を加ãˆã‚‹ï¼Žfx,fy,fzã¯ãれãžã‚Œx, y, z軸ã¾ã‚りã®ãƒˆãƒ«ã‚¯

○ 高速ãªã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³

å‰å›žã®ã‚µãƒ³ãƒ—ルã§ã¯ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®ã‚¹ãƒ†ãƒƒãƒ—関数ã¨ã—ã¦dmSimStep()を使ã„ã¾ã—ãŸãŒï¼Œã“ã“ã§ã¯ã‚ˆã‚Šé«˜é€ŸãªdmSimQuickStep()を使ã„ã¾ã™ï¼ŽãŸã ã—,dmSimStep()ã¨æ¯”較ã—ã¦ç²¾åº¦ãŒæ‚ªããªã‚Šã¾ã™ï¼Ž

○ シミュレーションã®ãƒªã‚»ãƒƒãƒˆ

rã¾ãŸã¯Rキーを押ã™ã¨ï¼ŒresetSim関数ãŒå‘¼ã°ã‚Œã¦ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒãƒªã‚»ãƒƒãƒˆã•れã¾ã™ï¼ŽresetSimã®ä¸­èº«ã¯ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ«ãƒ¼ãƒ—ãŒï¼‘回以上呼ã³å‡ºã•れãŸã¨ãã«dmInit関数を呼ã³å‡ºã—ã¦åˆæœŸåŒ–ã—,ドミノをå†åº¦ç”Ÿæˆã—ã¦ã„ã¾ã™ï¼Ž

○ ソースコード

/* step5 ドミノ倒㗠 */
#include "dm5.h"
#define DOMINO_NUM  21

static int STEPS = 0;   // シミュレーションã®ã‚¹ãƒ†ãƒƒãƒ—æ•°
double red[3] = {1.3, 0.0, 0.0}; // 赤色
dmObject domino[DOMINO_NUM]; // ドミノ

void simLoop(int pause)           /***  シミュレーションループ ***/
{

    int i;
    double x = 5.0, y = 0, z = 1; // カメラã®ä½ç½®[m]
    double yaw = -180, pitch = 0, roll = 0; // カメラã®å§¿å‹¢ã€€ãƒ¨ãƒ¼ï¼Œãƒ”ッãƒï¼Œãƒ­ãƒ¼ãƒ«è§’[°]

    if (STEPS == 0) dmSetCamera(x,y,z,yaw,pitch,roll); // カメラã®è¨­å®š

    dmSimQuickStep(); // シミュレーションを1ステップ進ã‚ã‚‹(高速版)

    for (i = 0; i < DOMINO_NUM; i++)
    {
        dmDraw(&domino[i]); // å£ã®æç”»
    }
    STEPS++;
}

void resetSim(int n)
{
    double m = 0.1; // 質é‡
    double side[3] = {0.2, 0.05, 0.5}; // サイズ
    double R[12] = {1,0,0,0, 0,1,0,0, 0,0,1,0}; // å§¿å‹¢
    double p[DOMINO_NUM][3];  // ä½ç½®

    int i;

    // シミュレーションã®çµ‚了
    if (STEPS != 0)
    {
        dmClose();
    }

    dmInit(); // åˆæœŸåŒ–

    // ドミノã®ç”Ÿæˆ
    for (i = 0; i < DOMINO_NUM; i++)
    {
        p[i][2] = 0.25; // ドミノé‡å¿ƒã®z座標
        switch (n)
        {
        case 0:
            p[i][0] = 0;             // ドミノé‡å¿ƒã®x座標
            p[i][1] = 0.3 * i -3.0;  // ドミノé‡å¿ƒã®y座標
            break;
        case 1:
            p[i][0] = 0.3 * i -3.0;
            p[i][1] = p[i][0];
            // z軸周りã«Ï€/4回転ã•ã›ãŸå§¿å‹¢
            dRFromAxisAndAngle(R, 0, 0, 1, - M_PI/4);
            break;
        default:
            printf("Bad number \n");
            break;
        }
        dmCreateBox(&domino[i], p[i], R, m, side, red);
    }
}

void command(int cmd)
{
    switch (cmd)
    {
    case '1':
        resetSim(1);
        break;
    case 'r':
    case 'R':
        resetSim(0);
        break;
    case 'f':
    case 'F':
    {
        double fx = -1.0, fy = 0.0, fz = 0.0;
        dmAddTorque(&domino[0], fx, fy, fz); // x,y,z軸ã¾ã‚りã«fx,fy,fzã®ãƒˆãƒ«ã‚¯ã‚’付加
        break;
    }
    default:
        printf("Input r, R, f, F key \n");
        break;
    }
}

/*** main関数 ***/
int main()
{
    resetSim(0); // シミュレーションã®ãƒªã‚»ãƒƒãƒˆ
    dmLoop(800, 600, simLoop, command);  // ウインドウã®å¹…,高, ループ関数,コマンド関数
    dmClose(); // 終了

    return 0;
}

ホームワーク

  1. サンプルコードstep5-100720.zipã‚’ã“ã“ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦å®Ÿè¡Œã—よã†ï¼Ž
  2. ドミノを X状ã«é…ç½®ã—ã¦ï¼Œãƒ‰ãƒŸãƒŽå€’ã—ã‚’ã—ãªã•ã„.  解答例step5b-100726.zip
  3. ドミノをåŠå¾„ï¼’ï½ã®å††ä¸Šã«é…ç½®ã—ã¦ï¼Œãƒ‰ãƒŸãƒŽå€’ã—ã‚’ã—ãªã•ã„
  4. 上ã®é…ç½®ã§ãƒ‰ãƒŸãƒŽå€’ã—ãŒç„¡é™ã«ç¶šãよã†ã«ï¼Œãƒ‰ãƒŸãƒŽãŒã²ã¨ã‚Šã§ã«èµ·ã上ãŒã‚‹ã‚ˆã†ã«ã—ãªã•ã„.

コメントをã©ã†ãž

メールアドレスãŒå…¬é–‹ã•れるã“ã¨ã¯ã‚りã¾ã›ã‚“。

637 views  (Since 2010-08-11)