我正在尝试制作的物理项目有一些问题。它基本上是一个自由落体模拟器。我设置了重力加速度和高度,程序应该模拟下落。问题是它弄错了时间,不知道为什么。我正在使用 Stopwatch 类来测量时间。
这是代码:
FrmMain.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
namespace Physics
{
public partial class FrmMain : Form
{
public Settings config = new Settings();
public float displacement = 0f;
public Stopwatch timer = new Stopwatch();
public float timeElapsed; //in Seconds
public Thread thread;
public FrmMain()
{
InitializeComponent();
//New thread (Drawing)
thread = new Thread(new ThreadStart(Drawing));
thread.IsBackground = true;
thread.Start();
this.KeyDown +=new KeyEventHandler(FrmMain_KeyDown);
}
private void Drawing()
{
try
{
while (true)
{
if (config.objectPos.Y < config.sizeBitmap.Height)
timer.Start();
else
timer.Stop();
Bitmap screen = new Bitmap(this.pboxScreen.Width,
this.pboxScreen.Height);
SendScreen(screen);
}
}
catch (ThreadAbortException tae)
{
Console.WriteLine(tae.Message);
}
}
private void SendScreen(Bitmap Screen)
{
if (pboxScreen.InvokeRequired)
{
pboxScreen.Invoke(new MethodInvoker(delegate()
{
this.SendScreen(Screen);
}));
}
else
{ //Converting Milliseconds to Seconds
timeElapsed = timer.ElapsedMilliseconds / 1000f;
//Check if object isn't in the ground
if (config.objectPos.Y < config.sizeBitmap.Height)
{
displacement -= config.objectPos.Y;
config.objectPos.Y = config.objectPos.Y + 0.5f *
config.acceleration *
timeElapsed * timeElapsed;
displacement += config.objectPos.Y;
}
Graphics g = Graphics.FromImage(Screen);
g.Clear(Color.White);
//New rectangle
Rectangle rec = new Rectangle((int)config.objectPos.X,
(int)config.objectPos.Y, 5, 5);
g.FillRectangle((new Pen(Color.DarkRed)).Brush, rec);
g.DrawRectangle(new Pen(Color.Red, 2.0f), rec);
g.Dispose();
//Update txtbox (textbox)
txtboxX.Text = config.objectPos.X.ToString();
txtboxY.Text = config.objectPos.Y.ToString();
txtboxTempo.Text = timeElapsed.ToString();
txtboxD.Text = displacement.ToString();
pboxScreen.Image = Screen;
}
}
void FrmMain_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Space:
if (config.objectPos.Y >= config.sizeBitmap.Height)
{
config.objectPos.Y -= 100;
timer.Reset();
}
break;
}
}
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
{
if (thread.IsAlive) thread.Abort();
}
}
}
设置.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace Physics
{
public class Settings
{
public Size sizeBitmap; //bitmap resolution
public PointF objectPos; //Initial Position
public float acceleration;
public Settings()
{
sizeBitmap.Width = 560;
sizeBitmap.Height = 420;
objectPos.X = 560f / 2f;
objectPos.Y = 420f / 2f;
acceleration = 9.8f;
}
}
}
还有另一个问题,根据高度,物体不会不间断地下降,它会在同一位置停留几毫秒,但很明显。我认为这是一个线程问题,因为我已经有一段时间没有使用它了,所以我可能会遗漏一些东西。
我以米为单位测量高度,因此 objectPos.Y = 420f / 2f 代表 210 米的高度。对于这个高度,物体应该需要大约 6.5 秒才能撞到地面,在我的程序中它需要不到 1 秒,所以我假设存在时间测量问题。
我正在计算没有空气阻力表达式的均匀引力场的高度:
h(t)=h0+0.5*g*t²
其中:h(t)是相对于时间的高度,h0是初始高度,g是重力加速度,t是经过的时间
任何帮助深表感谢。谢谢。