ios – 这些日光夜间近似值中的错误在哪里?

ios – 这些日光夜间近似值中的错误在哪里?,第1张

概述我试图近似从日出到日落的一天的长度,以及从日落到日出的夜晚.我目前的近似是粗略的(它假设昨天和明天有与今天相同的值),但是现在我并没有特别关注精确定位昨天的日落,今天的日出,今天的日落和明天的日出.我的目标是基于每晚12个相等的小时计算(12个相等于彼此,不等于标准小时或白天小时),每天12个相等的小时. 我关心的是,在我的iOS应用程序中,计算方法已经过时了;一分钟在5-6(标准)秒的时间内飞逝 我试图近似从日出到日落的一天的长度,以及从日落到日出的夜晚.我目前的近似是粗略的(它假设昨天和明天有与今天相同的值),但是现在我并没有特别关注精确定位昨天的日落,今天的日出,今天的日落和明天的日出.我的目标是基于每晚12个相等的小时计算(12个相等于彼此,不等于标准小时或白天小时),每天12个相等的小时.

我关心的是,在我的iOS应用程序中,计算方法已经过时了;一分钟在5-6(标准)秒的时间内飞逝.当我使用未修改的时间时,在这里的其他代码中,时钟以标准速度移动,但是当我尝试使用此代码来提供时钟代码时,某些东西超出了界限.

作为近似,我一直在研究的代码是:

NSDate *Now = [[NSDate alloc] init];NSDate *factory = [[NSDate alloc] init];NSDate *summerSolstice2013 = [factory initWithTimeIntervalSinceReferenceDate:_referenceSummerSolstice];double distanceAlong = [Now timeIntervalSinceDate:summerSolstice2013];double angleAlong = M_PI * 2 * distanceAlong / (2 * (_referenceWinterSolstice - _referenceSummerSolstice));double currentHeight = cos(angleAlong) * _latitudeAngle + _tiltAngle;...if (_secondsAreNatural){    _secondsAreShadowed = FALSE;    double dayDuration = 12 * 60 * 60 + 12 * 60 * 60 * sin(currentHeight);    double mIDday = fmod(24 * 60 * 60 * _longitudeAngle / (2 * M_PI) + 12 * 60 * 60,24 * 60 * 60);    double sunrise = mIDday - dayDuration / 2;    double sunset = mIDday + dayDuration / 2;    double seconds = fmod([Now timeIntervalSinceReferenceDate],24 * 60 * 60);    double proportionAlong = 0;    if (seconds < sunrise)    {        _naturalSeconds = (seconds - sunset - 24 * 60 * 60) / (sunrise - sunset - 24 * 60 * 60);    }    else if (seconds > sunset)    {        _naturalSeconds = 12 * 60 * 60 * (seconds - sunset) / (sunrise + 24 * 60 * 60 - sunset) + 18 * 60 * 60;    }    else    {        _naturalSeconds = 12 * 60 * 60 * (seconds - sunrise) / (sunset - sunrise) + 6 * 60 * 60;    }}

有没有问题(鉴于这种近似可能会在任何程度上得到改进)你可以在这段代码中找到答案吗?

谢谢,

– 编辑 –

我上面写的代码对于阅读它的人来说是松散的结果是相当苛刻的.我试图接受另一个传递,并用更简单的术语和更纯粹的数学模型重写它.我写道,评论补充道:

NSDate *Now = [[NSDate alloc] init];NSDate *summerSolstice2013 = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:_referenceSummerSolstice];double distanceAlong = [Now timeIntervalSinceDate:summerSolstice2013];    // How far along are we,in seconds,since the reference date?double angleAlong = M_PI * 2 * distanceAlong / (2 * (_referenceWinterSolstice - _referenceSummerSolstice));    // What's the angle if 2 &pi; radians corresponds to a whole year?double currentHeight = cos(angleAlong) * _latitudeAngle + _tiltAngle;    // _latitudeAngle is the angle represented by our latitude; _tiltAngle is the angle of the earth's tilt.NSInteger day = 24 * 60 * 60;    // 'day' Could have been called secondsInADay,but it was mean to reduce the number of multiplicands represented in the code.// If we are in the endless day or endless night around the poles,leave the user with standard clock hours.if (currentHeight > M_PI / 2){    _secondsAreShadowed = TRUE;}else if (currentHeight < - M_PI / 2){     _secondsAreShadowed = TRUE;}// Otherwise,calculate the time this routine is meant to calculate. (This is the main intended use case.)else if (_secondsAreNatural){    _secondsAreShadowed = FALSE;    // closestDay is intended to be the nearest mIDnight (or,in another hemisphere,mIDday),not exactly in hours offset from UTC,but in longitude offset from Greenwich.    double closestDay;    if (fmod(distanceAlong,day) < .5 * day)    {        closestDay = distanceAlong - fmod(distanceAlong,day);    }    else    {        closestDay = day + distanceAlong - fmod(distanceAlong,day);    }    // As we go through the calculations,for the most part we keep up information on the prevIoUs and next days,which will to some degree be consulted at the end.    double prevIoUsDay = closestDay - day;    double nextDay = closestDay + day;    // For the three days,what proportion of the way along are they from the solstices?    double closestDayAngleAlong = M_PI * 2 * closestDay / (2 * (_referenceWinterSolstice - _referenceSummerSolstice));    double prevIoUsDayAngleAlong = M_PI * 2 * prevIoUsDay / (2 * (_referenceWinterSolstice - _referenceSummerSolstice));    double nextDayAngleAlong = M_PI * 2 * nextDay / (2 * (_referenceSummerSolstice - _referenceSummerSolstice));    // What angle are we placed by on the year's cycle,between _latitudeAngle + _tiltAngle and -latitudeAngle + _tiltAngle?    double closestDayHeight = cos(closestDayAngleAlong) * _latitudeAngle + _tiltAngle;    double prevIoUsDayHeight = cos(prevIoUsDayAngleAlong) * _latitudeAngle + _tiltAngle;    double nextDayHeight = cos(nextDayAngleAlong) * _latitudeAngle + _tiltAngle;    // Based on that,what are the daylight durations for the three twenty-four hour days?    double closestDayDuration = day / 2 + (day / 2) * sin(closestDayHeight);    double prevIoUsDayDuration = day / 2 + (day / 2) * sin(prevIoUsDayHeight);    double nextDayDuration = day / 2 + (day / 2) * sin(nextDayHeight);    // Here we use both morning and evening for the closest day,and the prevIoUs day's morning and the next day's evening.    double closestDayMorning = closestDay + (day / 2) - (closestDayDuration / 2);    double closestDayEvening = closestDay + (day / 2) + (closestDayDuration / 2);    double prevIoUsDayEvening = prevIoUsDay + (day / 2) + (prevIoUsDayDuration / 2);    double nextDayMorning = nextDay + (day / 2) + (nextDayDuration / 2);    // We calculate the proportion along the day that we are between evening and morning (or morning and evening),along with the sooner endpoint of that interval.    double proportion;    double referenceTime;    if (distanceAlong < closestDayMorning)    {        proportion = (distanceAlong - prevIoUsDayEvening) / (closestDayMorning - prevIoUsDayEvening);        referenceTime = prevIoUsDay + day * 3 / 4;    }    else if (distanceAlong > closestDayEvening)    {        proportion = (distanceAlong - closestDayEvening) / (nextDayMorning - closestDayEvening);        referenceTime = closestDay + day * 3 / 4;                }    else    {        proportion = (distanceAlong - closestDayMorning) / (closestDayEvening - closestDayMorning);        referenceTime = closestDay + day * 1 / 4;    }    // Lastly,we take both that endpoint and the proportion of it,and we get the number of seconds according to the daylight / nighttime calculation intended.    _naturalSeconds = referenceTime + proportion * day / 2;

我希望能让代码更清晰,更容易掌握,我想我已经做到了,但是它显示出与我之前的尝试类似的行为:时钟指针旋转大约十倍于自然时间,当它们应该在标准小时/分钟/秒的.8到1.2.

有什么建议?我编辑的代码是否更明确是针对什么是错误的?

谢谢,

解决方法 您的代码很难遵循,但我会尝试为您提供一些提示:

>现有的库可以计算给定日期的太阳角/方位角和日出/日落.使用谷歌作为帮助,这里是一些相关的资源:http://www.esrl.noaa.gov/gmd/grad/solcalc/如果你没有找到任何有用的源代码,我可以发布一些.
>不要使用double来计算日期和时间.这令人困惑并导致错误.使用旨在存储日期的数据类型.
>对于您的代码,您说时间正在快速运行.由于最后一行中的referenceTime和day是常量(至少半天),因此误差必须成比例.我觉得你在那里混合很多案子.插值应该从范围的开始到结束,所以在这种情况下

比例=(distanceAlong – prevIoUsDayEvening)/(nearestDayMorning – prevIoUsDayEvening);
referenceTime = prevIoUsDay day * 3/4;

比例应该从(prevIoUsDay day * 3/4)到(nearestDayday * 3/4),或者描述不同,从nearestDay的黄昏到黎明.但是完全不清楚这种插值应该如何工作.

尝试绘制不同情况的图表(我相信应该只有两个,一个用于白天,一个用于夜晚)和相应的插值.

但是:毕竟你想要实现什么目标?结果时间只是一个前进的时间,它实际上与纬度或经度或一天中的时间无关.所以为了让时间流逝,你不需要知道太阳在哪里.

总结

以上是内存溢出为你收集整理的ios – 这些日光/夜间近似值中的错误在哪里?全部内容,希望文章能够帮你解决ios – 这些日光/夜间近似值中的错误在哪里?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1021031.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存