ODEã§å¦ã¶C言語2 [Step1:ç‰©ä½“ã®æç”»]
講義ã§C言語を教ãˆã¦ã„ã‚‹ã®ã§ã™ãŒï¼Œæœ€è¿‘ã®ãƒªã‚¢ãƒ«ãªã‚²ãƒ¼ãƒ ã«æ…£ã‚ŒãŸå¦ç”Ÿã«ã¯ãƒ†ã‚ストベースã®ãƒ—ãƒã‚°ãƒ©ãƒ ã§ã¯ã‚ã¾ã‚Šãƒ¢ãƒãƒ™ãƒ¼ã‚·ãƒ§ãƒ³ãŒä¸ŠãŒã‚‰ãªã„よã†ã§ã™ï¼Žãã“ã§ï¼Œæ˜¨å¹´ã«å¼•ãç¶šã,ODEを使ã„C言語をåˆã‚ã¦å¦ã¶ãŸã‚ã®é€£è¼‰ã€ŒODEã§å¦ã¶C言語2ã€ã‚’å§‹ã‚ã¾ã™ï¼Žæ˜¨å¹´ã“ã®æ–¹æ³•ã§å¦ç”Ÿã«æ•™ãˆï¼Œå応ãŒã¾ãšã¾ãšã§ã—ãŸï¼Žä¸€éƒ¨åˆ†ã‹ã‚Šã¥ã‚‰ã„ã¨ã“ã‚ãŒã‚ã£ãŸã®ã§ï¼Œä»Šå¹´ã¯ã•らãªã‚‹ã‚ã‹ã‚Šã‚„ã™ã•を目指ã—ã¦ã„ããŸã„ã¨æ€ã„ã¾ã™ï¼Ž
ãªãŠï¼Œè¬›ç¾©ã§ã¯åˆ¥ã®æ•™ç§‘書ã§ä¸€é€šã‚ŠC言語を教ãˆãŸã®ã§ï¼Œãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°èƒ½åŠ›ã‚’é«˜ã‚ã‚‹ãŸã‚ã®æ¼”習ベースã«ãªã‚Šï¼ŒC言語ã«å¯¾ã™ã‚‹ç´°ã‹ã„説明ã¯ã‚ã¾ã‚Šã—ã¾ã›ã‚“.プãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã®æ¥½ã—ã„æ¼”ç¿’ã ã¨æ€ã£ã¦ãã ã•ã„.
今回ã¯ä½•ã‚‚ãªã‹ã£ãŸä»®æƒ³ç©ºé–“ã«ç‰©ä½“を表示ã•ã›ã¦ã¿ã¾ã—ょã†ï¼Ž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, simLoop); // ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ«ãƒ¼ãƒ—ï¼ˆã‚¦ã‚¤ãƒ³ãƒ‰ã‚¦ã®æ¨ªï¼Œç¸¦ï¼‰
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-100604をダウンãƒãƒ¼ãƒ‰ã—,実行ã—ã¦ãã ã•ã„.
- æ‰‹é †
- ode-0.11.1ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ãªã‹ã£ãŸã‚‰ã“ã®èª¬æ˜Žã«å¾“ã„インストールã™ã‚‹ï¼Ž
- ダウンãƒãƒ¼ãƒ‰ã—ãŸãƒ•ァイルをc:\ode-0.11.1\myprogã®ä¸ã«ä¿å˜ã™ã‚‹ï¼Ž
- ãã“ã§è§£å‡ã™ã‚‹ï¼Žc:\ode-0.11.1\myprog\step1ã¨ã„ã†ãƒ•ォルダãŒä½œã‚‰ã‚Œã¾ã™ï¼Ž
- c:\ode-0.11.1\myprog\step1\step1.cbpをダブルクリックã—ã¦codeblocksã‚’èµ·å‹•ã—ビルド・実行ã™ã‚‹ï¼Žãƒ€ãƒ–ルクリックã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‹¡å¼µåã¯cbpã§ã™ï¼Žé–“é•ã£ã¦cppをダブルクリックã—ãªã„よã†ã«ï¼
- çƒã®ä½ç½®ã¨å¤§ãã•を変更ã—ã¦ã¿ã¾ã—ょã†ï¼Ž
- 直方体を表示ã•ã›ã¦ãã ã•ã„.次ã®é–¢æ•°ã‚’使ã„ã¾ã™ï¼Ž
- 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 );
