恒星时间计算器(译文)
By S.F.
本文链接 https://www.kyfws.com/news/sidreal-time-calculator/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 12 分钟阅读 - 5751 个词 阅读量 0恒星时间计算器(译文)
原文地址:https://www.codeproject.com/Articles/459441/Sidreal-Time-Calculator
原文作者:Joel Ivory Johnson
译文由本站翻译
前言
Windows Phone的实时实时计算器
介绍
各种移动设备上提供了许多应用程序,可让您将设备对准天空并识别各种天体.我发现基于用户的位置和设备的方向来识别身体的能力令人着迷.当我看到物理硬件对这些信息起作用时,我会更加着迷.我使用的望远镜使用GPS(以获取我的位置和当前时间),并使用此信息将望远镜自动移动到查看选定身体所需的方向. 我现在对它的工作原理有了很好的了解.涉及的大量计算是基于时间的,而另一部分则是基于坐标转换的.有了正确的时间转换,您将有足够的信息来获取恒星的方向. (获得行星和月球的方向需要更多的工作,但是恒星相对于太阳系没有明显的运动).我现在只想谈论时间,因为按时填写文章的信息已经足够多.
目录
条款和时间单位
通常用一些循环过程或事件来描述时间,其中时间单位来自对周期/事件进行计数.这可能是由于晶体的振动,某个天体的经过或其他事件引起的.从历史上看,太阳和月亮的视运动被用作我们的时间系统所基于的周期性事件.我们都使用了来自这些事件的时间单位.小时,分钟,秒,年和月,以及术语AM,PM,AD和BC,以及度.让我们剖析这些术语背后的物理事件.
罗马日历
据说罗马日历是由Romulus(罗马的创始人)于公元前753年发明的.此日历有10个月,而春分是第一个月.日历有304天,另外还有从12月到下个月的冬日,这些天不在日历中.
朱利安历法
朱利安历法是罗马历法的修改版.它有365天,分为12个月.每4年增加一次a日.这听起来很像我们今天使用的民用日历,除了我们没有leap年可以除以400而不是千年的leap日.如果有足够的时间,太阳活动和季节活动将开始蔓延到日历的其他部分.这已使用公历校正.
公历,天文年和朱利安日期
阳历(也称为西历或民用日历)是当今世界大多数人知道,喜爱和使用的日历的名称.日历的名称是[教皇格雷戈里十三世(http://en.wikipedia.org/wiki/Pope_Gregory_XIII).地球绕太阳公转的自转次数是365次,加上一些分数单位(约0.2524).朱利安历法试图通过每4年引入a年来纠正此问题.这项贡献减缓了日历上各个季节的迁移速度,但并没有完全停止.[教皇格雷戈里十三世(http://en.wikipedia.org/wiki/Pope_Gregory_XIII)对日历的贡献在于如果该年可被400整除且是千禧年,则没有have年.朱利安历法的最后一天是1582年10月4日,星期四.第二天是公历的第一天. 1582年10月15日,星期五.10月5日至14日(含10月5日至14日)的日期范围不存在-跨越此边界的时间转换需要记住一些内容.
朱利安日期
另一个常用的日历是计算公元前4713年1月1日中午以来的天数.这也称为儒略日期. 4713年1月1日中午是朱利安日期0.4713年1月1日至4714年1月2日之间的午夜是朱利安日期0.5.请注意,一天中的时间是儒略日期的一部分,以小数为单位.对于最近的日期,用来表示朱利安日期的数字超过了24,000亿.为了避免处理不必要的大数字,还有经过修改的儒略日(MJD),它计算自1858年11月17日午夜以来的天数.请注意,MJD从午夜开始,而JD从中午开始.因此,这两个日期表达式中的时间单位对于小数点后的数字将相差0.5.您可能还会听到儒略日期号,它只是儒略日期的整数部分.这种形式的日期对于天文计算特别重要.
公元前,公元前和天文年
跟踪年份系统的怪异之一是没有零年份.日历的第一年基于对基督教的耶稣基督的推测,是公元1年(AD =Anno Domino,拉丁语为"领主年",也为共同时代写为" CE").紧接其后的年份是公元前1年(BC =在基督之前.有时写为BCE,指"共同时代之前").在进行天文计算时,没有人想解决零值的问题.因此,还有天文年的概念.天文年大部分与我们当前的跟踪年系统保持一致.因此1984 AD也是1984年的天文学年.当您查看BC范围内的年份时,差异显而易见. 1 BC是天文年0.2 BC是天文年-1,依此类推.
太阳日
太阳日是太阳显然在路径上移动并返回其起点的时间段.我之所以说是显而易见的,是因为虽然我们知道这种现象是地球自转产生的,但是太阳的运动仍然用地心来描述. ,依此类推).太阳的路径从一天到另一天略有不同,因此它并没有真正回到起点.因此子午线用作起点.子午线是地球上从北极延伸到南极的假想圆.太阳和其他物体在子午线到达天空中的最高点,然后从爬升到下降.这条线还用于将一天分成两半.太阳经过子午线后,该时间称为后子午线(PM).当它通过地球另一侧的这条线时,我们说它在子午线之前. before的拉丁语单词是" ante",因此被称为A.M. (适用于子午线).当太阳在子午线上.它是在天空的最高点.这称为"太阳正午".星期日不一定发生在当地时间为12:00 PM的同一时刻.太阳到达这一点的时间略有变化,我们通常会用民用时钟忽略掉它们. 太阳绕我们观察者传播的路径通常分为24个单位.请注意,如果将一个圆的360度除以24,则得到15.这24个相等的单位称为小时(换句话说,一小时的旋转是15度).这15度也可以分为60个单位(分钟).旋转的分钟为15/60,即0.25度.您可能已经猜到了下一个除法级别是将一分钟分为60个相等的部分(第二个部分),其中包含0.26/60的度.通过使用小时,分钟和秒(HMS)作为旋转单位,您可以得出的推论是,对于经过的每个小时,您可以估算出夜空中的天体在单位时间内行进的旋转距离. ;在2小时内,物体将移动60度.我说的是近似值,因为如果您高精度地测量距离,您会发现在这段时间内,太阳和月亮的移动量似乎与60度略有不同.对于临时观察,这种差异不会很明显.
恒星日
如果将太阳用作旋转距离的参考,则看来地球需要24小时才能旋转一整圈.但这不是很正确.地球每天绕太阳绕轨道运动约1度.因此,不应使用太阳来精确测量地球旋转了多远.任何其他明星都可以.其他恒星相距足够远,因此无论地球在轨道上的什么位置,它们的视在位置都相同.
选择一颗星星(除了我们的太阳,任何一颗星星都可以).每当地球自转,那颗恒星就会到达子午线.如果您使用挂钟来测量时间量,那么一颗恒星再次到达子午线就需要花费24小时.这是23小时56分4秒.使用此方法测得的天数是恒星天.由于这些天少于24小时,因此恒星年的太阳日数约为366.25,而不是365.25.由于恒星日比任何给定太阳日的太阳日都短,因此存在一定范围的恒星时,在太阳日内发生两次.
时区
我们的通用时间系统基于格林威治时间.格林威治在零经度上.在子午线上观测天体事件曾经是我们计时系统的基础.它的子午线也称为本初子午线.为了方便起见,我们还有本地时间的概念,该时间是通过将格林威治时间上的分钟数和小时数相加得出的.地球分为40个共享当地时间的区域.这些区域或时区通常与格林威治(GMT)的时间间隔有几个小时的时间差.有些时区也会相隔一个小时间隔加上30分钟.从最大正偏移量到最大负偏移量的差值为26小时.平均而言,时区之间的差异可以通过其经度来推断(回想一下,一小时是15度旋转).但是,时区线不是直线.时区边界不会将较小的地理区域划分为多个时区,而是会与该地理区域的边界重合.
地球的天体运动
恒星可感知地处于固定位置.对于一个想要极高技术的人来说,恒星的移动速度相对于我们的位置或相对于其旋转的银河系来说,要快得惊人.但是它们是如此之遥,以至于我们无法察觉它们的运动,从而使我们能够将它们视为静止的物体,在数百年的短时间内测量出来.有几个因素会影响恒星相对于地球观测者的方向.
- 轴向进动
- 垂头 在这些运动中,对观察者最直接的影响是地球的自转.通过太阳,月亮和其他物体在我们的天空中传播的明显路径,可以直接观察到它的影响.如果您正在用望远镜看物体,除非您有自动调节的电动望远镜,否则运动会更加明显.当您观察物体时,它会在一分钟或更短的时间内从望远镜视线中移出.这是我最关心的运动. 地球绕太阳行进时,每天大约前进1度.每过一天,由于光与太阳的竞争而变得不可观察的天球部分将略有移动.这意味着在一年中的某些部分看不到某些星星.尽管除日食外仍可以确定它们的方向,但您将无法在白天观察这些恒星.还要注意,这会影响太阳升起的时间,日落的时间以及一天中可见阳光的小时数(冬季的白天小时数较少).就目前而言,我在一般情况下并不特别关注恒星的可见时间.由于我仅在时间和天气出乎意料的情况下才使用望远镜,因此我无需进行过多的前期计划.如果您对此感兴趣,建议您先探索各种暮光的定义(例如:民用,航海,天文). 第三运动发生在大约25,700年的过程中.它会导致地球旋转轴指向的方向发生轻微的圆形漂移.可以通过依赖时间的坐标空间调整来解决.但我不想在本文中谈论坐标转换.以防万一您好奇,地球每71年绕其旋转轴的方向移动大约1度,因此我们现在可以忽略此移动,并且不会对我们的结果产生重大影响.
当地恒星时间
由于地球相对于太阳的方向不断变化,因此我们不想使用太阳日来计算恒星相对于地球的位置.恒星时间是我们想要的.为了获得恒星时间,我们需要知道儒略日期.我们将从民用(格里高利历)日期中获取儒略日期.我已经为获取这些日期做了一系列扩展.在计算公历日期时,您将需要能够以十进制格式计算到一天的距离.中午12:00是一天的0.5,18:00是一天的0.75,依此类推.这些可以很容易地从日期或时间计算出来.
static double ToFractionalDay(this TimeSpan sourceTime)
{
return sourceTime.TotalHours / 24d;
}
static double ToFractionalDay(this DateTime sourceDate)
{
return sourceDate.TimeOfDay.ToFractionalDay();
}
这些被称为扩展方法,因为我发现调用语法更加简洁.现在我们知道一天要走多远了,我们可以使用该信息来计算儒略日期.
public static double ToJulianDate(this DateTime sourceDate)
{
double y, m, c;
if (sourceDate.Month <= 2)
{
y = sourceDate.Year - 1;
m = sourceDate.Month + 2;
}
else
{
y = sourceDate.Year;
m = sourceDate.Month;
}
double leapDayCount = (sourceDate > GregorianReformDate) ?
(2 - Math.Floor(y / 100) + Math.Floor(y/400) ) : 0;
if (sourceDate.Year < 0)
c = (int)(365.25 * (double)sourceDate.Year - 0.75);
else
c = (int)(365.25 * (double)sourceDate.Year);
double d = Math.Floor(30.6001 * (m + 1));
var retVal = leapDayCount +c+ d + sourceDate.Day + 1720994.5;
return retVal + sourceDate.ToFractionalDay();;
}
我没有提到什么.所有这些计算均以0经度为中心,并且基于GMT时区而无夏令时.如果要调整结果以弄清楚时区相对于可观察宇宙其余部分的方向,则需要对经度进行调整.如果您的经度在格林尼治标准时间(GMT)的西边,请用负数表示,否则请使用正数.将该数字除以15,然后将其添加到恒星时间中.我生活在0经度以西84度.因此,要获取本地恒星时间,请执行以下操作.
localSiderealTimeClock.CurrentTime = DateTime.Now.ToUniversalTime().ToSiderealTime().
Add(TimeSpan.FromHours(-84d/15d));
本地恒星时间描述了您从春分点(♈)方向的旋转位移.虽然空间上没有空间,但在春分点时从太阳到地球画一条线所形成的方向是几个天球坐标系的基础(黄道,它是基于地球绕太阳公转的轨道,基于地球自转的赤道).
纠正用户时钟中的方差
用户有意和无意地将其时钟设置为错误的时间.避免问题的一种方法是利用NTP(网络时间协议).我之前已经写过关于获取NTP时间的文章.您可以在此处阅读有关它的内容.虽然可以持续轮询一段时间的NTP源,但我每隔几分钟只能抓一次它.当我获得NTP时间时,将保存用户关闭时间和NTP时间源之间的时差,并将其添加到来自用户时钟的值中.期望在NTP时间刷新之间,用户的时钟将可靠地计数秒数,而不会出现任何明显的漂移(如果没有漂移,则用户需要一个新设备!).
NtpClient _ntpClient;
TimeSpan _ntpOffset;
DateTime _lastNtpRefresh = DateTime.MinValue;
TimeSpan _ntpRefreshPeriod = TimeSpan.FromMinutes(1);
public MainViewModel()
{
_ntpClient = new NtpClient();
_ntpClient.TimeReceived +=
new EventHandler<NtpClient.TimeReceivedEventArgs>(_ntpClient_TimeReceived);
//Default the difference to zero and provisionally assume the user's
//clock is correct until we receive information of otherwise
_ntpOffset = TimeSpan.Zero;
}
void _ntpClient_TimeReceived(object sender, NtpClient.TimeReceivedEventArgs e)
{
_lastNtpRefresh = DateTime.Now;
DateTime NtpTime = e.CurrentTime;
// NTP time is always in universal time, so we need to adjust the system clock
// to universal before getting the time offset.
_ntpOffset = NtpTime.Subtract(DateTime.Now.ToUniversalTime());
}
//Use this method to get time adjusted for NTP offset.
DateTime GetDate()
{
return DateTime.Now.Add(_ntpOffset);
}
显示时间
如果您查看了显示多个时区中时间的时钟,则大多数时区中显示的分钟数和秒数可能是相同的.同时查看民事时间和恒星时间时,情况并非如此.秒将不同步.由于个人喜好(我只是觉得这很不愉快),因此我同时更新了秒数.我已经做了两个显示时间的控件.模拟时钟和数字时钟.两者都可以以12小时或24小时格式显示时间.
使用模拟时钟显示24小时可能对许多人来说都是新的.我在线上查看了几个24小时模拟时钟.一些开始于午夜在时钟的顶部,而另一些则从午夜在底部的时钟开始.我决定在底部设置午夜(0)小时.这将中午放在时钟的顶部.虽然我仍在玩以恒星格式显示24小时时间的东西.当我有一个类似圆形规的时钟时,我将把它从用户控件更改为模板控件,并提供有关如何渲染的新选项. (即将发生的更改的提示在源代码中可见).
帮助文件
在尝试其他方法时,我包括了该应用程序的帮助HTML文件.帮助文件作为内容存储在应用程序中,但在首次运行时未打包.为了防止每次应用程序运行时都不必要地解压缩文件,它会在解压缩之前检查文件是否已存在.
public class ContentUnpacker
{
static string[] ContentFileList = { "About.html", "459441/Sidereal.png", "appTimes.png", "settings.png" };
public static void UnpackAllFiles()
{
IsolatedStorageFile sourceArchive = IsolatedStorageFile.GetUserStoreForApplication();
if (!sourceArchive.DirectoryExists("Content"))
sourceArchive.CreateDirectory("Content");
foreach (string s in ContentFileList)
{
string targetName = String.Format("Content/{0}", s);
string sourceName = String.Format("Content/{0}", s);
if(!sourceArchive.FileExists(targetName))
{
var outStream = sourceArchive.CreateFile(targetName);
var contentStream = Application.GetResourceStream
(new Uri(sourceName, UriKind.Relative));
using (var br = new BinaryReader(contentStream.Stream))
{
var length = (int)br.BaseStream.Length;
outStream.Write(br.ReadBytes(length), 0, length);
}
}
}
}
}
“关于"页面仅包含一个网络浏览器元素,该元素已获得帮助文件的URL.关于页面后面的全部代码如下.
public partial class AboutPage : PhoneApplicationPage
{
public AboutPage()
{
InitializeComponent();
}
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
aboutBrowser.Navigate(new Uri("Content/About.html", UriKind.Relative));
}
}
从这里到哪里
有许多应用程序,其中一些与天文学有关,而另一些与我无关的应用程序对于此功能很有用.一个与天文学无关的例子是我想到的增强现实应用程序,我希望该应用程序根据太阳的位置来阴影投影在屏幕上的模型.与天文学有关的应用之一是,我可以进入一个在所有4面墙上都有投影仪和屏幕的房间.只是为了好玩,我想让控制四面墙上的投影机的计算机相互通信并显示太阳系的360度视图.对于其他一些应用程序来说,获取恒星时间是一个垫脚石,但最终目标本身并不是.我打算写这些想法在每个想法付诸实现时如何发展.
人物和插图
修订记录
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
C# .NET Visual-Studio HTML Mobile Dev XAML Intermediate VS2010 Windows-Phone-7 新闻 翻译