水平投射されるボールのアニメーション

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
コメパンパスタ

水平投射されるボールのアニメーション

#1

投稿記事 by コメパンパスタ » 2年前

C言語超初心者です

水平投射されて床に落ちるボールのアニメーションを書きたいのですが、上手くいきません。
なるべく早い回答が欲しいです。

重力加速度:9.8[m/sec^2]
ボールと床との反発係数:0.8
初速度:10.0[m/sec]
高さ:20[m]
床面との反発前後で連続性が確認できるように、計算式自体を同一に。

鉛直投げ上げ運動の頂点からのスタートだと考えれば、上手くいくかなあと思い、
床に落ちた回数をcと置き、ボールのy座標がy=0(床に落ちた)になったら、0から1つずつ増えていくようにしました。

添付写真が実行結果です。
画像

大学の課題です。
授業自体が200ページ程度の教科書を渡されただけの自習型、かつ物理を高校で習っておらず、どこが間違っているのか発見できませんでした。
ご指導お願いします。

表示にはコマンドプロンプトとDOSBOXを使用しています。

コード:

#include "Graph.h"
#include <stdio.h>
#include <conio.h>

main()
{
	double x,y;
	double vx,vy;
	double ay;
	double t,g;
	int c,a;
	
	SetGraphicsMode();
		
	ClearScreen(0);

	g=9.8;		//重力加速度
	t=0.0;		//時間
	c=0;		//床についた回数
	a=1;
	
	x=0.0;		//x座標
	y=20.0;		//y座標
	
	vx=10.0;		//x方向の速さ
	vy=0.0;		//y方向の速さ
	
	ay=-g;		//y方向の加速度=-重力加速度
	
	for(t=0; t<=10; t++)
	{
		if(y=0)		//もしボールが床に着いたらcが増えていく
		{
			c=c+1;
			
			while(c!=0)
			{
				a=a*0.8;		//a=0.8^c
				--c;
			}
		}
		
		x=vx*t;			//x方向:等速直線運動
		vy=g*t*a;			//y方向の加速度:vy=gt*0.8^c
		y=vy*t-0.5*g*t*t;		//投げ出して初めて床につくまでは鉛直投げ上げ運動の頂点からのスタートと考える
		
		FillCircle(x,y,5,4);		//(x,y)を中心とする半径4の赤色の球
	}
		
	SetCursorPos(10,10);
	printf("Push Anykey!");
	getch();
		
	RestoreMode();
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 水平投射されるボールのアニメーション

#2

投稿記事 by みけCAT » 2年前

コメパンパスタ さんが書きました:
2年前
添付写真が実行結果です。
画像
指定のURLにアクセスするとログイン画面が表示され、ログインしてみると404が表示されました。
ユーザー登録してログインしていただくと、ファイルを添付できるようになります。

コードはまだきちんとチェックしていませんが、とりあえず

コード:

		if(y=0)		//もしボールが床に着いたらcが増えていく
		{
			c=c+1;
			
			while(c!=0)
			{
				a=a*0.8;		//a=0.8^c
				--c;
			}
		}

という部分は、
・if文の中で比較ではなく代入を行っており、0を代入しているので絶対偽になって実行されない
・中身のコードは、cの値を増やしてもその次の部分ですぐに減らしてしまい、実質 a=a*0.8; をしているだけ
なので、不自然だと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

コメパンパスタ
記事: 3
登録日時: 2年前

Re: 水平投射されるボールのアニメーション

#3

投稿記事 by コメパンパスタ » 2年前

失礼しました!
DOSBOX
DOSBOの結果の画像です

よろしくお願いします
添付ファイル
last18.png
last18.png (27.15 KiB) 閲覧数: 3891 回

コメパンパスタ
記事: 3
登録日時: 2年前

Re: 水平投射されるボールのアニメーション

#4

投稿記事 by コメパンパスタ » 2年前

みけCAT さんが書きました:
2年前
・if文の中で比較ではなく代入を行っており、0を代入しているので絶対偽になって実行されない
・中身のコードは、cの値を増やしてもその次の部分ですぐに減らしてしまい、実質 a=a*0.8; をしているだけ
なので、不自然だと思います。
if(y == 0)とするということですね
代入と等号の区別をしていませんでした
ありがとうございます

ご指摘いただいた部分を修正し、実行したところ、以下のように表示されました。
画面下半分の赤の塗りつぶしは何ですか?

DOSBOXの使い方が間違っているんでしょうか…
添付ファイル
スクリーンショット (14).png
スクリーンショット (14).png (28.76 KiB) 閲覧数: 3888 回

返信

“C言語何でも質問掲示板” へ戻る