C言語関係掲示板

過去ログ

No811 SIN COSのグラフ

[戻る] [ホームページ]
No.10242

SIN COSのグラフについて
投稿者---タニ(2003/11/02 20:09:14)


はじめまして、タニといいます。

C言語は初心者の段階です。

ある本でグラフを表示するサンプルのプログラムが
あり実行してみたのですが、見事にグラフが描かれました。
しかし、プログラム中でわからない部分が、あるので
ご指導いただきたいと思い書き込みました。

#include <stdio.h>
#include <string.h>
#include <math.h>

void main(void)
{
char p[30];
int ts,tc;
double rd,n;
rd=3.14159/180;
printf(" -1 0 1\n");
printf(" I....+....I....+....I\n");
for(n=0;n<=360;n=n+15){
strcpy(p," I ");
ts=(int)(10+10*sin(n*rd));
tc=(int)(10+10*cos(n*rd));
if(ts==tc)
p[ts]='+';
else{
p[ts]='*';p[tc]='o';
}
printf("%5.0f %s\n",n,p);
}
}

ts=(int)(10+10*sin(n*rd));
tc=(int)(10+10*cos(n*rd));

上記の部分の10+・・・と10*・・・はなぜ
入っているのですか?

No.10243

Re:SIN COSのグラフについて
投稿者---tajima(2003/11/02 21:08:57)


すんません。私もまだC言語はじめて長くないので不適切な点
ありましたらご了承を。

それで、まずインデントをちゃんとした方がいいんじゃないで
しょうか。利用上の注意にもかいてますし。

本題ですが、まずその本に書いてあったプログラムって
下のような感じじゃなかったでしょうか?
pの配列数は必要最低限にしていますがとくに、ちがうのは空白
の数です。これを直さないと表示がほとんどされません。

#include <stdio.h>
#include <string.h>
#include <math.h> 

void main(void)
{
	char p[21];
	int ts,tc;
	double rd,n;
	rd=3.14159/180;
	printf(" -1 0 1\n");
	printf("      I....+....I....+....I\n");
	for(n=0;n<=360;n=n+15){
		strcpy(p,"          I          ");
		ts=(int)(10+10*sin(n*rd));
		tc=(int)(10+10*cos(n*rd));
		if(ts==tc)
			p[ts]='+';
		else{
			p[ts]='*';p[tc]='o';
		}
		printf("%5.0f %s\n",n,p);
	}
}

で、なぜ10+10*sin()かというとまさしくサインカーブを
振幅、周期をそのまま紙に描くように連続にコンピュータ
で描くことは出来ません。いくらかは離散的に行わざるを
得ないはずです。そして、今回は振幅を+-10(整数値)で周
期を15度ずつの刻みに取ったということでしょう。


No.10244

Re:SIN COSのグラフについて
投稿者---tajima(2003/11/02 21:31:07)


先ほど書いたプログラムの配列のサイズは22以上としといてください。VCでは動いているのですが、終端文字の分が無いのでよくないです。

No.10247

ありがとうございました
投稿者---タニ(2003/11/03 02:02:16)


tajima様

どうもタニです。

ご丁寧にお答えいただき、ありがとうございました。

ソースの件ですが、あとでtajimaさんが載せてくれたのが
ただしいソースです。
お手間を取らせてすいませんでした。

この件についてはすっきりとわかりました。
どうもありがとうございました。

お互いがんばりましょう!






No.10248

確認・・・
投稿者---タニ(2003/11/03 02:11:25)


tajimaさま

タニです。

10+10*sin()

確認ですが、10+の部分は、0〜360の
数値を表示させるためののりしろ分で
10*の部分は振幅ということですね・・・?

No.10258

Re:確認・・・
投稿者---tajima(2003/11/03 14:30:30)


のりしろという表現を私は使わないのですがきっとあってる
と思います。振幅10のサインカーブにオフセット10を足した
ものを観測しているという意味でしょう。

そして、表示するときは
printf(" -1 0 1\n");
を見る限り範囲は-1から+1で表示していますから本来のサイ
ンカーブをスケール10分の1で表現しています。

それと配列は0から始まるのでマイナスを表現したいなら表
現したい分だけ先に原点を設定する必要があります。
今回はオフセット+10によりずらしています。(p[10]が原点)

ではがんばってください。


No.10278

ありがとうございました
投稿者---タニ(2003/11/04 02:02:49)


tajimaさん

どうもありがとうございました

はっきりとわかりました。