我关心的是,在我的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 π 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 – 这些日光/夜间近似值中的错误在哪里?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)