ODEã§å¦ã¶C言語 [Step1:ç‰©ä½“ã®æç”»]
今回ã¯ä½•ã‚‚ãªã‹ã£ãŸä»®æƒ³ç©ºé–“ã«ç‰©ä½“を表示ã•ã›ã¦ã¿ã¾ã—ょã†ï¼ŽODEã§ã¯ã„ã‚ã„ã‚ãªå½¢çжãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™ï¼Žã“ã“ã§ã¯ãã®ä¸ã§ã‚‚ä½¿ã„æ–¹ãŒæœ€ã‚‚ç°¡å˜ãªçƒã‚’表示ã•ã›ã¾ã™ï¼Ž
/* step1 çƒã®è¡¨ç¤ºã€€*/
#include "dm1.h"
double R[12]; // 回転行列(å§¿å‹¢)ã®å€¤ã‚’入れるé…列
double p[3] = {0.0, 0.0, 1.0}; // ä½ç½®(x,y,z)[m]
double r = 0.2; // åŠå¾„ [m]
void simLoop(int pause) /*** シミュレーションループ ***/
{
dsDrawSphere(p,R,r); // çƒã®æç”»
}
int main() /*** main関数 ***/
{
dmLoop(800, 600); // ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ«ãƒ¼ãƒ—ï¼ˆã‚¦ã‚¤ãƒ³ãƒ‰ã‚¦ã®æ¨ªï¼Œç¸¦ï¼‰
return 0;
}
物体を3次元空間上ã«è¡¨ç¤ºã•ã›ã‚‹ãŸã‚ã«ã¯ï¼Œç‰©ä½“ã®ä½ç½®ã¨å§¿å‹¢ã‚’決ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼ŽODEã§ã¯å§¿å‹¢ã‚’回転行列ã¨ã‚ˆã°ã‚Œã‚‹è¡Œåˆ—ã§è¡¨ã—ã¦ã„ã¾ã™ï¼Žãã®è¡Œåˆ—ã®è¦ç´ ã‚’æ ¼ç´ã™ã‚‹ã®ãŒé…列R[12]ã§ã™ï¼ŽãªãŠï¼Œä½ç½®ã¯è¦ç´ 数3個ã®doubleåž‹ã®é…列p[3]ã«æ ¼ç´ã—ã¦ã„ã¾ã™ï¼ŽãªãŠï¼ŒR[12]ã«ã¯è¬Žã®ãƒ˜ãƒƒãƒ€ãƒ•ァイルdm1.hã®ä¸ã§å˜ä½è¡Œåˆ—ãŒè¨å®šã•れã¦ã„ã¾ã™ï¼Ž
ä½ç½®ã®x座標(æ‰‹å‰æ–¹å‘)を表ã™å¤‰æ•°pã®1番目ã®è¦ç´ p[0]ã«ã¯0.0[m],yåº§æ¨™ï¼ˆå³æ–¹å‘), zåº§æ¨™ï¼ˆé«˜ã•æ–¹å‘)を表ã™p[1], p[2]ã«ã¯0.0[m], 1.0[m]ãŒè¨å®šã•れã¦ã„ã¾ã™ï¼Žåº§æ¨™ç³»ã¯å³æ‰‹ç³»ã§ã™ã€‚ODEã§ã¯å˜ä½ç³»ã¯SIå˜ä½ç³»ã‚’考ãˆã¾ã™ï¼Žé•·ã•ã¯m,質é‡ã¯kg,力ã¯Nã¨ãªã‚Šã¾ã™ï¼Ž
ソースコードã®ãªã‹ã»ã©ã«ã‚ã‚‹simLoop関数ã«ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã§ã‚„りãŸã„ã“ã¨ã‚’書ãã¾ã™ï¼Žã“ã“ã§ã¯ï¼Œçƒã‚’表示ã—ãŸã„ã®ã§dsDrawSphere関数を使ã£ã¦ï¼Œä½ç½®p,姿勢R, åŠå¾„rã®çƒã‚’æç”»ã—ã¦ã„ã¾ã™ï¼ŽãªãŠã€ã“ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã ã‘ã§ã¯ã‚ã‹ã‚Šã¾ã›ã‚“ãŒã€simLoop関数ã¯dmLoop関数ã®ä¸ã§æ¯Žå›žå‘¼ã³å‡ºã•れã¦ã„ã¾ã™ã€‚
今回ã¯ã“れã§çµ‚ã‚りã§ã™ï¼Žã¾ãŸï¼Œã¾ãŸç°¡å˜ã§ã—ãŸã.
- ホームワーク1
- step1-090612b.zipをダウンãƒãƒ¼ãƒ‰ã—,実行ã—ã¦ãã ã•ã„.
- çƒã®ä½ç½®ã¨å¤§ãã•を変更ã—ã¦ã¿ã¾ã—ょã†ï¼Ž
- 直方体を表示ã•ã›ã¦ãã ã•ã„.次ã®é–¢æ•°ã‚’使ã„ã¾ã™ï¼Ž
- void dsDrawBox(const double p[3], const double R[12], const double sides[3])
- 上ã¯é–¢æ•°ã®ãƒ—ãƒãƒˆã‚¿ã‚¤ãƒ—宣言ã®å½¢å¼ãªã®ã§ï¼Œå‘¼ã³å‡ºã™ã¨ãã¯const doubleãªã©ã®åž‹åを入れã¦ã¯ã„ã‘ã¾ã›ã‚“.引数ãŒé…列ã®å ´åˆã¯ï¼Œã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ ã®ã‚ˆã†ã«é…列åã ã‘を入れã¦ãã ã•ã„.
- 1, 2番目ã®å¼•æ•°ã¯dsDrawSphereã®ã¨ãã¨åŒã˜ã§ã™ï¼Ž3番目ã®å¼•æ•°ã¯ç›´æ–¹ä½“ã®x,y,zæ–¹å‘ã®ã‚µã‚¤ã‚º[m]ãŒå…¥ã£ã¦ã„ã‚‹è¦ç´ æ•°3個ã®é…列ã§ã™ï¼Žä½ç½®ã‚’表ã™é…列pã¨åŒã˜ã‚ˆã†ã«åˆæœŸåŒ–ã™ã‚Œã°å¤§ä¸ˆå¤«ã§ã™ï¼ŽãªãŠ, doubleã®å‰ã«ã‚ã‚‹constã¯å€¤ã‚’変ãˆã¦ã¯ã„ã‘ãªã„ã¨ã„ã†æ„味ã§ã™ã€‚
- 円柱を表示ã•ã›ã¦ãã ã•ã„
- void dsDrawCylinder(const double p[3], const double R[12],  float l, float r );
- ã“ã“ã§ï¼Œlã¯é•·ã•,rã¯åŠå¾„ã§ã™ï¼Ž
- カプセルを表示ã•ã›ã¦ãã ã•ã„.
- void dsDrawCapsule(const double p[3], const double R[12], float l,  float r );
