草庐IT

c# - 圆形轨道中重力的矢量方向

coder 2024-05-27 原文

我目前正在使用 C# 开发一个项目,我在其中研究行星引力,我知道这是一个需要充分掌握的核心主题,但我喜欢挑战。我一直在阅读牛顿定律和开普勒定律,但我无法弄清楚的一件事是如何获得正确的引力方向。

在我的示例中,我只有 2 个主体。卫星和行星。这是为了简化它,所以我可以理解它 - 但我的计划是让多个对象动态地相互影响,并希望最终得到一个有点逼真的多体系统。

当你有一个轨道时,卫星就会有一个引力,这当然是在行星的方向上,但这个方向不是一个常数。为了更好地解释我的问题,我将尝试使用示例:

假设我们有一颗卫星以 50 m/s 的速度移动,并以 10 m/s/s 的速度向地球加速,半径为 100 m。 (所有理论数字)如果我们然后说帧速率为 1,那么一秒后对象将向前 50 个单位,向下 10 个单位。

由于卫星在一帧内移动了多个单位,移动了大约 50% 的半径,在此帧期间,重力方向发生了很大变化,但所施加的力只是“向下”。这会产生很大的误差范围,尤其是当物体移动半径的很大一部分时。

在我们的示例中,我们可能需要我们的引力方向基于我们当前位置与该帧末尾位置之间的平均值。

如何计算这个?

我对三角学有一定的了解,但主要侧重于三角形。假设我很愚蠢,因为与你们中的任何一个人相比,我可能是。

(我提出了一个先前的问题,但最终删除了它,因为它引起了一些敌意,而且基本上措辞不佳,而且都是笼统的 - 这并不是一个真正的具体问题。我希望这会更好。如果不是,那请通知我,我是来学习的:) )

仅供引用,这是我现在的移动功能:

foreach (ExtTerBody OtherObject in UniverseController.CurrentUniverse.ExterTerBodies.Where(x => x != this))
{
    double massOther = OtherObject.Mass;

    double R = Vector2Math.Distance(Position, OtherObject.Position);

    double V = (massOther) / Math.Pow(R,2) * UniverseController.DeltaTime;

    Vector2 NonNormTwo = (OtherObject.Position - Position).Normalized() * V;

    Vector2 NonNormDir = Velocity + NonNormTwo;
    Velocity = NonNormDir;

    Position += Velocity * Time.DeltaTime;
}

如果我措辞不当,请让我重新措辞部分 - 英语不是我的母语,当您不知道正确的技术术语时,特定主题可能很难措辞。 :)

我有一种预感,这包含在开普勒第二定律中,但如果是,那么我不确定如何使用它,因为我没有完全理解他的定律。

感谢您的宝贵时间 - 这意义重大!

(另外,如果有人在我的函数中看到多个错误,请指出!)

最佳答案

I am currently working on a project in C# where i play around with planetary gravitation

这是一种同时学习模拟技术、编程和物理学的有趣方式。

One thing I cannot figure out is how to get the correct gravitational direction.

我假设您不是在尝试模拟相对论引力。地球不在围绕太阳的轨道上,地球在八分钟前太阳所在的位置周围。纠正引力不是瞬时的事实可能很困难。 (更新:根据评论,这是不正确的。我知道什么;我在二年级牛顿动力学后停止学习物理,对张量微积分只有最模糊的理解。)

在这个早期阶段,您最好假设引力是瞬时的,并且行星是所有质量都位于中心的点。重力矢量是从一点到另一点的直线。

Let's say we have a satellite moving at a speed of 50 m/s ... If we then say that the framerate is one frame per second then after one second the object will be 50 units right and 10 units down.

让我们更清楚地说明这一点。力等于质量乘以加速度。你计算出 body 之间的力。你知道它们的质量,所以你现在知道每个物体的加速度。每个物体都有一个位置和一个速度。加速度改变速度。速度改变位置。因此,如果粒子开始时向左的速度为 50 m/s,向下的速度为 0 m/s,然后施加一个力使其向下加速 10 m/s/s,那么我们可以计算出以下变化:速度,然后是位置的变化。正如您所注意到的,在那一秒结束时,位置和速度与它们现有的幅度相比都会发生巨大的变化。

As the satellite moves multiple units in a frame and about 50% of the radius, the gravitational direcion have shifted alot, during this frame, but the applied force have only been "downwards". this creates a big margin of error, especially if the object is moving a big percentage of the radius.

正确。问题是帧速率非常太低,无法正确模拟您所描述的交互。您需要运行模拟,以便在对象快速改变方向时查看十分之一、百分之一或千分之一秒。时间步长的大小通常称为模拟的“delta t”,而你的太大了。

对于行星体,您现在所做的就像试图通过每隔几个月模拟地球的位置并假设它同时沿直线运动来模拟地球。您需要每隔几分钟而不是几个月模拟一次它的位置。

In our example we'd probably needed our graviational direction to be based upon the average between our current position and the position at the end of this frame.

你可以这样做,但简单地减少计算的“delta t”会更容易。那么帧开始和结束的方向之间的差异就小得多。

一旦你解决了这个问题,你就可以使用更多的技术。例如,您可以检测帧之间位置变化太大的时间,然后返回并以较小的时间步重新进行计算。如果位置几乎没有变化,则增加时间步长。

一旦你对 进行了排序,就可以在物理模拟中使用许多更高级的技术,但我首先要真正掌握基本的时间步长。更高级的技术本质上是您“对时间步长的变化进行更智能的插值”想法的变体——您在这里走在正确的轨道上,但您应该先走再跑。

关于c# - 圆形轨道中重力的矢量方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25713067/

有关c# - 圆形轨道中重力的矢量方向的更多相关文章

  1. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  2. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. ruby - 没有轨道的 ActiveRecord 时区 - 2

    我在非Rails项目中使用ActiveRecord。在Rails中,我可以这样做:config.time_zone='EasternTime(US&Canada)'config.active_record.default_timezone='EasternTime(US&Canada)'但如果我不使用rails,我该如何设置时区? 最佳答案 ActiveRecord::Base.default_timezone='EasternTime(US&Canada)' 关于ruby-没有轨道的A

  5. c# - C# 中的 Flatten Ruby 方法 - 2

    我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume

  6. ruby - 可以像在 C# 中使用#region 一样在 Ruby 中使用 begin/end 吗? - 2

    我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用

  7. c# - Ruby 等效于 C# Linq 聚合方法 - 2

    什么是Linq聚合方法的ruby​​等价物。它的工作原理是这样的varfactorial=new[]{1,2,3,4,5}.Aggregate((acc,i)=>acc*i);每次将数组序列中的值传递给lambda时,变量acc都会累积。 最佳答案 这在数学以及几乎所有编程语言中通常称为折叠。它是更普遍的变形概念的一个实例。Ruby从Smalltalk中继承了这个特性的名称,它被称为inject:into:(像aCollectioninject:aStartValueinto:aBlock一样使用。)所以,在Ruby中,它称为inj

  8. c# - 先学什么? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭8年前。Improvethisquestion几年前我去学校学习编程,毕业后我找到了一份系统管理方面的工作,这就是我职业生涯的方向。我想重新开始某种开发,并且一直在“玩”C#和ASP.NET,但我已经听到很多关于其他"new"语言的讨论(新的意思是它们是新的)我)喜欢Ruby和F#。我想我想知道我是否在浪费时间学习主要的MS语言,而不是成为一名通才。很长一段时间没有离开开发社区(如果我曾经离开过的话)让我在潮流中挣扎,我不想落在时代的

  9. c# - 在 C# 中重现 Ruby OpenSSL private_encrypt 输出 - 2

    我有一个简单的Ruby脚本,我用它在某些HTTPheader上执行private_encrypt以签署要发送到ruby​​RESTAPI的Web请求,该API会根据Base64编码字符串测试Base64编码字符串生成而不是解码Base64和解密数据然后测试原始字符串。我使用的脚本是require"openssl"require"base64"path_to_cert=ARGV[0].dupplain_text=Base64.decode64(ARGV[1].dup)private_key=OpenSSL::PKey::RSA.new(File.read(path_to_cert))pu

  10. C# 的 LINQ 用于在 ruby​​ 中等效的集合操作 - 2

    我是ruby​​开发的新手,我目前正在使用rails2.3.11在ruby​​1.8.7中开发一个项目,我想知道这种语言是否有与C#的linq等效的集合操作,例如where子句。谢谢。 最佳答案 Ruby中Linq的where等价于find_all检查documentationfortheEnumerableModule用于其他功能。 关于C#的LINQ用于在ruby​​中等效的集合操作,我们在StackOverflow上找到一个类似的问题: https://

随机推荐