一応それらしいものは出来たのですが、どうしても物体の中心の軌跡がいちいち途切れてしまいます。
この中心の軌跡をずっと残すためにはどうすればいいのでしょうか。
初めて間もない新参者ですが、よろしくお願いします。
#pragma once
#include "windows.h"
#include "math.h"
#include "stdio.h"
#pragma warning(disable : 4244)
namespace test1 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Form1 の概要
///
/// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた
/// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを
/// 変更する必要があります。この変更を行わないと、
/// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、
/// 正しく相互に利用できなくなります。
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: ここにコンストラクタ コードを追加します
//
}
protected:
/// <summary>
/// 使用中のリソースをすべてクリーンアップします。
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::PictureBox^ pictureBox1;
private: System::Windows::Forms::TextBox^ textBox1;
protected:
private:
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
void InitializeComponent(void)
{
this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox());
this->textBox1 = (gcnew System::Windows::Forms::TextBox());
(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->BeginInit();
this->SuspendLayout();
//
// pictureBox1
//
this->pictureBox1->Location = System::Drawing::Point(74, -2);
this->pictureBox1->Name = L"pictureBox1";
this->pictureBox1->Size = System::Drawing::Size(1192, 616);
this->pictureBox1->TabIndex = 0;
this->pictureBox1->TabStop = false;
this->pictureBox1->Click += gcnew System::EventHandler(this, &Form1::pictureBox1_Click);
//
// textBox1
//
this->textBox1->Location = System::Drawing::Point(2, 61);
this->textBox1->Name = L"textBox1";
this->textBox1->Size = System::Drawing::Size(66, 19);
this->textBox1->TabIndex = 1;
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(1028, 578);
this->Controls->Add(this->textBox1);
this->Controls->Add(this->pictureBox1);
this->Name = L"Form1";
this->Text = L"Form1";
(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->EndInit();
this->ResumeLayout(false);
this->PerformLayout();
}
#pragma endregion
double E;
private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) {
E=double::Parse(textBox1->Text);
//ピクチャボックスと同じ大きさのBitmapを作成
Bitmap^ bmp = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height);
pictureBox1->Image = bmp;
//ピクチャボックスからGraphicsの作成
Graphics^ G = Graphics::FromImage(pictureBox1->Image);
//自由落下//
double t0; //自由落下してからの時間(物体)//
double u0; //自由落下してからの時間(物体の中心)//
double g=9.81; //重力加速度//
double H=500; //最初に自由落下をする高さ//
double T0=sqrt(2*H/g); //物体が自由落下してから地面に当たるまでの時間//
double A=0.1; //時間の刻み//
for (t0 = 0; t0 <= T0 ; t0=t0+A ){;
double y0=0.5*g*t0*t0; //物体が地面に着くまでの変位//
double X0=10*t0;
double y1=0.5*g*(t0-A)*(t0-A);
double X1=10*(t0-A);
//物体の描画//
G->FillEllipse(Brushes::Red, 35+X0, 45+y0, 30, 30 );
pictureBox1->Refresh();
//ピクチャボックスの背景色でクリアする。
G->Clear(pictureBox1->BackColor);
//物体の中心・軌跡//
for(u0=0;u0<=t0;u0=u0+A){
double y0=0.5*g*u0*u0; //物体が地面に着くまでの変位//
double X0=10*u0;
double y1=0.5*g*(u0-A)*(u0-A);
double X1=10*(u0-A);
//物体の中心の軌跡の描画
G->DrawEllipse(Pens::Black, 50+X0, 60+y0, 1, 1 );
Sleep(0.001);
//線を引く//
G->DrawLine(Pens::Black, 50, 60,1200,60 ); //H//
G->DrawLine(Pens::Black, 50, 185,1200,185 ); //3/4H//
G->DrawLine(Pens::Black, 50, 310,1200,310 ); //1/2H//
G->DrawLine(Pens::Black, 50, 435,1200,435 ); //1/4H//
G->DrawLine(Pens::Red, 50, 555,1200,555 ); //1/100H//
G->DrawLine(Pens::Black, 50, 560,1200,560 ); //H=0//
G->DrawLine(Pens::Black, 50, 575,1200,575 ); //地面//
G->DrawLine(Pens::Black, 50, 30,50,575 ); //縦線//
}
} //for (t0 = 0; t0 <= T0 ; t0=t0+0.1 ){;//
//跳ね返り//
double t; //跳ね返った後の時間(物体)//
double u; //跳ね返った後の時間(物体の中心)//
int n=0; //跳ね返りの回数//
double v0=sqrt(2*H*g); //最初の自由落下で地面に当たる時の速度//
while (1) {; //無限に繰返しをする//
if (pow(E,n*2) <= 0.01){; //Eの2乗が1/100以下なら繰返しをやめる//
break;
}
n=n+1; //跳ね返る回数の加算//
double vn=pow(E,n)*v0; //n回目に跳ね返った時の速度//
double T=2*vn/g; //n回目に跳ね返り、地面に当たる時までの時間//
double Tn=v0/g*(1+(2-pow(E,n)*2)/(1-E)); //物体がn回はねて着地するまでの時間//
for (t = 0; t <= T;t=t+A){;
double X=10*t; //跳ね返りの間のx座標の方向の変位//
double Xn=10*Tn; //物体がn回はねて着地するまでの時間の変位//
double X2=2*v0/g*10;////
double y=0.5*g*t*t-vn*t; //n回目に跳ね返り、地面に当たる時までの変位//
double X3=10*(t-A);
double y2=0.5*g*(t-A)*(t-A)-vn*(t-A);
//物体の描画//
G->FillEllipse(Brushes::Red, 35+X+Xn-X2, 545+y, 30, 30 );
Sleep(0.001);
pictureBox1->Refresh();
//ピクチャボックスの背景色でクリアする。
G->Clear(pictureBox1->BackColor);
//物体の中心・軌跡//
for (u = 0; u <= t;u=u+A){;
double X=10*u; //跳ね返りの間のx座標の方向の変位//
double Xn=10*Tn; //物体がn回はねて着地するまでの時間の変位//
double X2=2*v0/g*10;////
double y=0.5*g*u*u-vn*u; //n回目に跳ね返り、地面に当たる時までの変位//
double X3=10*(u-A);
double y2=0.5*g*(u-A)*(u-A)-vn*(u-A);
//物体の中心の軌跡の描画
G->DrawEllipse(Pens::Black, 50+X+Xn-X2, 560+y, 1, 1 );
Sleep(0.001);
//線を引く//
G->DrawLine(Pens::Black, 50, 60,1200,60 ); //H//
G->DrawLine(Pens::Black, 50, 185,1200,185 ); //3/4H//
G->DrawLine(Pens::Black, 50, 310,1200,310 ); //1/2H//
G->DrawLine(Pens::Black, 50, 435,1200,435 ); //1/4H//
G->DrawLine(Pens::Red, 50, 555,1200,555 ); //1/100H//
G->DrawLine(Pens::Black, 50, 560,1200,560 ); //H=0//
G->DrawLine(Pens::Black, 50, 575,1200,575 ); //地面//
G->DrawLine(Pens::Black, 50, 30,50,575 ); //縦線//
}
} //for (t = 0; t <= T;t=t+0.1){;//
} //for (n = 1; n <= 7 ; n++){;//
}
};
}