Edited at

[C言語] 斜方投射をグラフに描く

More than 3 years have passed since last update.

GitHubにも公開中。GitHubにはもう1つサンプルコードを上げています。


データをExcelで表示する場合は、data.datではなくdata.xlsでやった方が便利。

SublimetextとMacの環境だと、データが同じセルに入ってしまう。WindowsのVisual Studioだと問題無く出来ていた。

例:

A
B

x-data y-data

理想:

A
B

x-data
y-data

なので、今回はcsvファイルに出力してグラフにする。

コードは以前に書いた斜方投射のコードを修正して使った。


原点から初速度$v_0(m/s)$、角度(°)で投げた質点の軌跡をグラフで描く。ここで、空気抵抗は無視する。

#include <stdio.h>

#include <math.h>
#define g 9.80665

int main() {

double DetermineX(double v0, double rad, int i);
double DetermineY(double v0, double rad, int i);

double x, y, v0, deg, rad;
int t, i;

printf("初速度v0 (m/s)、角度θ(°)、経過時間t(s)を入力して下さい。\n");
printf("v0 = ");
scanf("%lf", &v0);

printf("deg = ");
scanf("%lf", &deg);
rad = deg*(M_PI/180.);

printf("t = ");
scanf("%d", &t);

FILE *data;

data = fopen("problem_data.csv", "w");

for (i=0; i<=t; i++) {
x = DetermineX(v0, rad, i);
y = DetermineY(v0, rad, i);

fprintf(data,"%f, %f\n", x, y);
}

fclose(data);

return 0;
}

double DetermineX(double v0, double rad, int i) {
double x;

x = v0*cos(rad)*i;

return x;
}

double DetermineY(double v0, double rad, int i) {
double y;

y = v0*sin(rad)*i - (1./2.)*g*i*i;

return y;
}


ハマったところ


1. 同じセルにデータが入る

data = fopen("problem_data.xls", "w");

fprintf(data,"%f %f\n", x, y);

を以下のようにcsvにして対応

data = fopen("problem_data.csv", "w");

fprintf(data,"%f, %f\n", x, y);


2. double sin( double rad )

sin( )とかcos( )の引数(角度)はラジアン


3. 分数の掛け算

y = v0*sin(rad)*i - (1/2)*g*i*i;

では上手くいかなく、0.5を使った。

y = v0*sin(rad)*i - 0.5*g*i*i;

[追記]

コメントで指摘して頂いた通りに(1./2.)にしたら計算出来た。