ODEã§å¦ã¶C言語 [Step3:switchæ–‡ã¨ã‚ー処ç†é–¢æ•°]
Step2ã§for文を使ã£ãŸç¹°ã‚Šè¿”ã—ã‚’ç·´ç¿’ã—ãŸã®ã§ï¼Œã“ã“ã§ã¯switch文を使ã£ãŸã‚ー処ç†ã®æ–¹æ³•ã‚’å¦ã³ã¾ã™ï¼Ž
ゲームãªã©ã§ã¯ã‚ーボードã§ãƒ¬ãƒ¼ã‚¶ãƒ¼ãƒ“ームを発射ã—ãŸã‚Šï¼Œè»Šã‚’æ“縦ã—ã¾ã™ã.ã“ã“ã§ã‚‚,ã‚ーボードã‹ã‚‰ã®ã‚ー入力を処ç†ã™ã‚‹æ–¹æ³•ã‚’å¦ã³ã¾ã™ï¼Ž
switchæ–‡ã¨ã‚ー処ç†
æ–°ã—ãç™»å ´ã—ãŸã®ãŒ11行目ã®command関数ã§ã™ï¼Žã“れã¯ï¼Œã‚ーボードã‹ã‚‰ã®ã‚ー入力を引数cmdã¨ã—ã¦å—ã‘å–りã¾ã™ï¼Žä¸‹ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã§ã¯ã‚ー入力ã®å€¤ã«å¿œã˜ã¦switch文を使ã„分å²ã•ã›é•ã†å‡¦ç†ã‚’ã•ã›ã¦ã„ã¾ã™ï¼ŽzãŒå…¥åŠ›ã•れるã¨åˆæœŸä½ç½®ã®zæˆåˆ†ã‚’0.1må¢—åŠ ã•ã›ã¾ã™ï¼Žã¤ã¾ã‚Šï¼Œzã‚ーを押ã™ãŸã³ã«ç›´æ–¹ä½“全体ãŒä¸Šç©ºã¸ä¸ŠãŒã£ã¦ã„ãã¾ã™ï¼Žãã®ä¸‹ã®breakæ–‡ã¯å¿˜ã‚Œãªã„ã§ãã ã•ã„.ãã®ä»–ã®ã‚ー入力ã§ã¯defaultã«ã‚ã‚‹”Input z key”ã¨ã„ã†æ–‡å—列ãŒã‚³ãƒ³ã‚½ãƒ¼ãƒ«ç”»é¢ã«è¡¨ç¤ºã•れã¾ã™ï¼Ž
乱 数
ODEã¨ã¯é–¢ä¿‚ã‚りã¾ã›ã‚“ãŒä¹±æ•°ã‚‚ç™»å ´ã—ã¾ã™ï¼Žä¹±æ•°ã‚’使ã†å ´åˆã¯”stdlib.h”をインクルードã—ã¾ã™ï¼Žã“ã“ã§ã¯time()関数も使ã£ã¦ã„ã‚‹ã®ã§”time.h”もインクルードã—ã¦ã„ã¾ã™ï¼Žæ¬¡ã«ï¼Œmain関数ã®42行目ã§ä¹±æ•°ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™ï¼Žvoid srand(unsigned seed)ã®å¼•æ•°seedã¯ä¹±æ•°ã‚’発生ã•ã›ã‚‹ç¨®ã‚’入れã¾ã™ï¼ŽãれãŒåŒã˜å€¤ã®å ´åˆã¯ï¼Œå¸¸ã«åŒã˜ä¹±æ•°ç³»åˆ—を発生ã•ã›ã¾ã™ï¼Žsrand(time(NULL))ã¯å®Ÿè¡Œæ™‚ã«ä¹±æ•°ã®ç¨®ã‚’変更ã™ã‚‹ä¸€èˆ¬çš„ãªæ–¹æ³•ã§ã™ï¼Ž
実際ã«ä¹±æ•°ã‚’発生ã•ã›ã¦ã„ã‚‹ã®ãŒsimLoop関数ã®30行目ã®rand関数ã§ã™ï¼Žrand関数ã®ãƒ—ãƒãƒˆã‚¿ã‚¤ãƒ—宣言ã¯int rand(void)ãªã®ã§å¼•æ•°ã¯å–らãšï¼Œintåž‹ã®å€¤ã‚’è¿”ã—ã¾ã™ï¼ŽRAND_MAXã¯ä¹±æ•°ã®æœ€å¤§å€¤ãªã®ã§ï¼Œ30行目ã¯0以上1以下ã®ä¹±æ•°ã‚’発生ã•ã›ï¼Œãれを赤æˆåˆ†ã®å€¤ã«ä»£å…¥ã—ã¾ã™ï¼Žå¾“ã£ã¦ï¼Œè¡¨ç¤ºã•れã¦ã„る直方体(以下ボックスã¨è¡¨è¨˜ï¼‰ã®èµ¤æˆåˆ†ã®è‰²ã ã‘ãŒå¤‰ã‚ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ï¼Ž
今回ã¯ï¼’ã¤ã®ã“ã¨ã‚’å¦ã³ã¾ã—ãŸï¼Žç‰¹ã«ä¹±æ•°ã¯ã‚²ãƒ¼ãƒ ã§ä½¿ã†ã¨éžå¸¸ã«é¢ç™½ã„ゲームã«ãªã‚‹ã®ã§ã—ã£ã‹ã‚Šè¦šãˆã¦ãŠãã¾ã—ょã†ï¼Ž
ã§ã‚€
/* step3 ã‚ー入力 switch文 */
#include "dm3.h"
#include <time.h>
#include <stdlib.h>
double R[12]; // 回転行列ã®è¦ç´ ãŒæ ¼ç´ã•れるé…列
double p[3] = {0.0, 0.0, 0.05}; // ä½ç½®(x,y,z)[m]
double sides[3] = {0.1, 0.1, 0.1}; // 直方体ã®ã‚µã‚¤ã‚º(x, y, z)[m]
double start_x = 0.0, start_y = 0.0, start_z = 0.0; // åˆæœŸä½ç½®
void command(int cmd)
{
float xyz[3], hpr[3];
switch (cmd) {
case 'z':
start_z += 0.1;
break;
default:
printf("Input z key \n");
}
}
void simLoop(int pause) /*** シミュレーションループ ***/
{
int i, j, num = 11; // ç›´æ–¹ä½“ã®æ•°
static float red = 0.0, green = 0.0, blue = 0.0; // èµ¤ï¼Œç·‘ï¼Œé’æˆåˆ†
for (i = 0; i < num; i++) {
for (j = 0; j < num; j++) {
red = (float) rand()/RAND_MAX; // 赤æˆåˆ†ã‚’ä¹±æ•°ã§æ±ºå®š
dsSetColor(red, green, blue); // 色ã®è¨å®š
p[0] = start_x; // ä½ç½®ã®xæˆåˆ†
p[1] = i * 0.2 - 1.0 + start_y; // ä½ç½®ã®yæˆåˆ†
p[2] = j * 0.2 + 0.05 + start_z; // ä½ç½®ã®zæˆåˆ†
dsDrawBox(p,R,sides); // 直方体ã®è¡¨ç¤º
}
}
}
int main() /*** main関数 ***/
{
srand(time(NULL)); // 乱数ã®åˆæœŸåŒ–
dmLoop(800, 600); // シミュレーションループ ウインドウã®å¹…,高
return 0;
}
ホームワーク3
- step3-090619.zipをダウンãƒãƒ¼ãƒ‰ã—ã¦å®Ÿè¡Œã—よã†ï¼
- jã‚ーを押ã™ã¨å³ï¼Œfã‚ーを押ã™ã¨å·¦ã«ãƒœãƒƒã‚¯ã‚¹å…¨ä½“ãŒç§»å‹•ã™ã‚‹ã‚ˆã†ã«ã—よã†ï¼Ž
- forループã®iãŒï¼’, jãŒï¼“ã®å ´åˆã«è¡¨ç¤ºã•れるボックスã ã‘ã‚’ã‚ーæ“作ã§ç§»å‹•ã§ãるよã†ã«ã—よã†ï¼ŽsimLoop関数ã®ä¸ã§if文を使ã†å¿…è¦ãŒã‚りã¾ã™ï¼ˆã‚„ã‚ã†ã¨æ€ãˆã°switchæ–‡ã§ã‚‚ã§ãã¾ã™ãŒï¼Žï¼‰
- ボックスを白色ã«å¤‰æ›´ã—,乱数を使ã„1ã¤ã®ãƒœãƒƒã‚¯ã‚¹ã ã‘èµ¤è‰²ã«æç”»ã™ã‚‹ãƒ—ãƒã‚°ãƒ©ãƒ を書ã“ã†ï¼Ž
