当前位置: 首页 > news >正文

网页设计好看的网站工商网查询营业执照

网页设计好看的网站,工商网查询营业执照,进入网络管理的网站,网络推广方案p用.NET模拟天体运动这将是一篇罕见而偏极客的文章。我上大学时就见过一些模拟太阳系等天体运动的软件和网站#xff0c;觉得非常酷炫#xff0c;比如这个#xff08;http://www.astronoo.com/en/articles/positions-of-the-planets.html#xff09;#xff1a; 其酷炫之处… 用.NET模拟天体运动这将是一篇罕见而偏极客的文章。我上大学时就见过一些模拟太阳系等天体运动的软件和网站觉得非常酷炫比如这个http://www.astronoo.com/en/articles/positions-of-the-planets.html 其酷炫之处不仅在于天体运动轨迹能画出美妙的弧线更重要的是其运动规律完全由万有引力定律产生不需要对其运动轨迹进行编程。所有天体受其它天体的合力然后按照其加速度运行。只需一个起始坐标和起始速度就能坐下来欣赏画面。我从大学毕业后就一直对这个抱有深厚兴趣工作第一年时我就用 C做过一版后来我负责公司前端工作又用 js/ canvas又做了一个重制版由于近期爆发的 .NET“革命”我近期又用 C#/ .NET再次重制了一版。需要的数学知识由于是程序看数学知识此处我将使用代码来表示公式。万有引力该力 F与两个天体的质量 m1, m2成正比如距离 r的平方成反比用代码表示为 Fm1*m2*G/r^2牛顿第二定律加速度 a等于合力 F除以质量 m用代码表示为 aF/m速度 v与加速度 a以及时间 t的关系用代码表示为 va*t距离 s与速度 v以及时间 t的关系用代码表示为 sv*t。这里面的所有知识都已经在高中物理提过了但有两点需要注意所有的力、加速度、速度以及距离都需要分为 x轴和 y轴两个分量所有的时间 t实际上是小段时间 dt程序将循环模拟小段时间累加起来来模拟天体运动。核心代码天体类class Star {public LinkedListVector2 PositionTrack new LinkedListSharpDX.Vector2();public double Px, Py, Vx, Vy;public double Mass;public float Size (float)Math.Log(Mass) * 2;public Color Color Color.Black;public void Move(double step){Px Vx * step;Py Vy * step;PositionTrack.AddFirst(new Vector2((float)Px, (float)Py));if (PositionTrack.Count 1000){PositionTrack.RemoveLast();}} } 注意我没指定大小 Size直接给值为其质量的对数乘 2另外注意我使用了一个 PositionTrack的 链表来存储其运动轨迹。万有引力、加速度、速度计算void Step() {foreach (var s1 in Stars){// star velocity// F G * m1 * m2 / r^2// F has a direction:double Fdx 0;double Fdy 0;const double Gm1 100.0f; // G*s1.mvar ttm StepDt * StepDt; // t*t/s1.mforeach (var s2 in Stars){if (s1 s2) continue;var rx s2.Px - s1.Px;var ry s2.Py - s1.Py;var rr rx * rx ry * ry;var r Math.Sqrt(rr);var f Gm1 * s2.Mass / rr;var fdx f * rx / r;var fdy f * ry / r;Fdx fdx;Fdy fdy;}// Ft ma - a Ft/m// v at - v Ftt/mvar dvx Fdx * ttm;var dvy Fdy * ttm;s1.Vx dvx;s1.Vy dvy;}foreach (var star in Stars){star.Move(StepDt);} } 注意其中有个 foreach循环它将一一计算每个天体对某天体的力然后通过累加的方式求出合力最后依照合力计算加速度和速度。如果使用 gmp等高精度计算库该循环将存在性能热点因此可以将这个 foreach改成 Parallel.For加 lock的方式修改合力 Fdx和 Fdy可以提高性能 C的代码就是这样写的。绘图代码public void Draw(DeviceContext ctx) {ctx.Clear(Color.DarkGray);using var solidBrash new SolidColorBrush(ctx, Color.White);float allHeight ctx.Size.Height;float allWidth ctx.Size.Width;float scale allHeight / 100.0f;foreach (var star in Stars){using var radialBrush new RadialGradientBrush(ctx, new RadialGradientBrushProperties{Center Vector2.Zero,RadiusX 1.0f,RadiusY 1.0f,}, new SharpDX.Direct2D1.GradientStopCollection(ctx, new[]{new GradientStop{ Color Color.White, Position 0f},new GradientStop{ Color star.Color, Position 1.0f},}));ctx.Transform Matrix3x2.Scaling(star.Size) *Matrix3x2.Translation(((float)star.Px 50) * scale (allWidth - allHeight) / 2, ((float)star.Py 50) * scale);ctx.FillEllipse(new Ellipse(Vector2.Zero, 1, 1), radialBrush);ctx.Transform Matrix3x2.Translation(allHeight / 2 (allWidth - allHeight) / 2, allHeight / 2);foreach (var line in star.PositionTrack.Zip(star.PositionTrack.Skip(1))){ctx.DrawLine(line.First * scale, line.Second * scale, solidBrash, 1.0f);}}ctx.Transform Matrix3x2.Identity; } 注意我在绘图代码逻辑中做了一些矩阵变换我把所有逻辑做成了窗体分辨率无关的假定屏幕长和宽的较小值为 100然后左上角坐标为 -50,-50右下角坐标为 50,50。星系模拟太阳、地球和月亮这是最容易想到了地球绕太阳转月亮绕地球转创建代码如下public static StarSystem CreateSolarEarthMoon() {var solar new Star{Px 0, Py 0,Vx 0.6, Vy 0,Mass 1000,Color Color.Red,};// Earthvar earth new Star{Px 0, Py -41,Vx -5, Vy 0,Mass 100,Color Color.Blue,};// Moonvar moon new Star{Px 0, Py -45,Vx -10, Vy 0,Mass 10,};return new StarSystem(new ListStar { solar, earth, moon }); } 注意所有数据都没使用真实数字模拟不然地球绕太阳转一圈需要 365天才能看完????运行效果如下 从轨迹可以看出由于太阳引力的作用地球会转着太阳转但也同样由于地球和月球引力的作用太阳也在以微小的角度在“公转”。扩展如果将太阳质量翻倍( 1000- 2000)会是何种效果呢可见这样一来由于引力太大导致地球速度变快月亮就被地球“甩”出去了然后地球轨道也变成了实实在在的椭圆。双子星宇宙中存在这样一种星系它的两颗恒星互相围绕对方转也可以模拟出来 注意两个天体在接近时速度会变快远离时速度会变慢这是由于万有引力与距离平方成反比决定的。扩展N星系统static IEnumerableStar CreateStars(int N) {for (var i 0; i N; i){double angle 1.0f * i / N * Math.PI * 2;double R 45;double M 10000 * 2 / (N * Math.Sqrt(N) * Math.Log(N));double v 5;double px R * Math.Sin(angle);double py R * -Math.Cos(angle);double vx v * Math.Cos(angle);double vy v * Math.Sin(angle);yield return new Star{Px px,Py py,Vx vx,Vy vy,Mass M,};} } 通过精密的数学计算可以让任意多的天体组织为系统如将 3当作 N传入函数即可组织为“三星系统”运行效果如下 注意超过 2星的系统都不稳定因此“三星系统”也不稳定转过两圈之后所有天体由于 double类型的误差已经累积到不可逆转的程度“三星系统”会慢慢崩溃解体。看看四星系统命运也差不多又比“三星”稍稳定需要等待好几圈才崩溃 展望与总结由于误差是 double类型的精度限制而累积的在 C中我可以使用 gmp、 mpir、 mpfr等高精度计算库来模拟计算性能也非常高。我之前使用 C和 mpir/ boost配合可以让四星系统稳定运行长达 15分钟不崩溃还能在我的 WindowsPhone(????)上流畅运行。之前有人将 mpir移植到了 .NET但不支持 .NETCorehttps://github.com/wezeku/Mpir.NET有人将 mpfr移植到了 .NEThttps://github.com/emphasis87/mpfr.NET/pull/5 .NETCore可以运行但有坑爹的 bug我提了 PR但作者似乎没心思Merge????。大小数计算在天文、地震、天气、海洋等科研领域有不可取代的作用我挺希望 .NET能提供一个高性能、高精度的小数计算库如 BigFloat。有人会问 .NET4.0不是提供了 BigInteger吗难道不够是真不够整数计算和小数计算不完全一样性能这一关就过不去。但在 .NETCore中这个问题官方似乎没有太大动力去做我在 github上找到了几个相关 issue都是 open状态https://github.com/dotnet/corefx/issues/17267https://github.com/dotnet/corefxlab/issues/2635本文中涉及的所有完整、可运行代码都已经上传到我的 github博客各位可以自行下载https://github.com/sdcb/blog-data/tree/master/2019/20191214-simulate-planet-movement-using-dotnet喜欢的朋友 请关注我的微信公众号【DotNet骚操作】
http://www.pierceye.com/news/848766/

相关文章:

  • 360网站推广官网软件安徽海外网络推广
  • c# asp.net网站开发书考试网站怎么做的
  • 网站开发 技术路线融资融券配资网站建设
  • 建设网站如国家高新技术企业证书
  • 网站服务是什么网站建设投标书报价表
  • 商业网站开发与设计宝塔面板wordpress安装
  • 学交互设计网站企业网站建设要多久
  • 免费情感网站哪个好有没有帮忙做标书的网站
  • 申请域名需要多久大连seo顾问
  • 舟山外贸建站公司做文案选图片素材的网站
  • 网站开发从何学起公司网站在哪里做
  • 无锡网站制作哪家有名金华安全网站建设怎么收费
  • dw做响应式网站重庆黄埔建设集团网站
  • 做系统那个网站好wordpress添加返回顶部
  • 站网站推广汕头网站建设和运营
  • 免费注册网页的网站中原彼得堡航空学院网站的建设
  • 青岛高端网站制作公司可做笔记的阅读网站
  • 区网站建设有域名后怎样做网站
  • 加强网站基础建设推广app的平台
  • 全球访问量最大的网站排名中国贸易公司100强
  • 衡水市网站制作有没有专门做儿童房的网站
  • 网站建设如何做报价网络工程师考试时间
  • wordpress建公司网站ftp转换wordpress
  • 网站开发 公司简介网站开发工具有哪些
  • 阿里云备案 网站备案域名购买河南洛阳网络公司
  • 工会网站建设请示怎么做属于自己的售卡网站
  • 怎么用ftp工具上传网站源码极速网站建设定制多少钱
  • 文山网站建设哪家好网站开发需要会的东西
  • ie9网站后台编辑器网络公司办公室图片
  • 山西格泰网站建设空间商网站