Дни золотого сечения в году
Вспоминая о золотом сечении, мы не пытались рассмотреть обычный календарный год как интервал дней, который тоже можно разбить в бессмертной пропорции.
В не-високосном году наиболее точно в пропорции золотого сечения год разбивают даты 19 мая и 14 августа, в високосном - 19 мая и 13 августа. Но константа Φ нравится мне больше, чем φ, так что пусть днём Золотого Сечения будет 14 августа :)
Разумеется, расчёты приблизительны и сделаны с точностью до суток показанным ниже маленьким скриптом.
Пригодиться из него может простой метод getDayOfYear
(номер для в году для даты-аргумента dt
, начиная с единицы) и не самый лаконичный, но простой и безопасный способ организации цикла по датам от startDate
до endDate
включительно, в нашем случае по всем дням года year
.
<div id="goldLog"> <script> function getGoldDays (year, id) { //Год и id раздела для вывода строки function isLeapYear (year) { //Високосный ли год if ((year & 3) != 0) return false; return ((year % 100) != 0 || (year % 400) == 0); } function getDayOfYear (dt) { //Номер дня в году с единицы let dayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; let mn = dt.getMonth(); let dn = dt.getDate(); let dayOfYear = dayCount[mn] + dn; if (mn > 1 && isLeapYear(dt.getFullYear())) dayOfYear++; return dayOfYear; } function strDate (dt) { //дата в формате "31 декабря" из Date dt var monthes = [ 'января','февраля','марта','апреля','мая','июня', 'июля','августа','сентября','октября','ноября','декабря' ]; return dt.getDate() + ' ' + monthes[dt.getMonth()]; } let startDate = new Date (year,0,1), endDate = new Date (year,11,31); let startTime = startDate.getTime(), endTime = endDate.getTime(); let cnt = 365; if (isLeapYear(year)) cnt++; let Phi = (Math.sqrt(5.)+1)/2., minPhi = 2, minDate1; //1.618 let phi = (Math.sqrt(5.)-1)/2., minphi = 2, minDate2; //0.618 for (let loopTime = startTime; loopTime <= endTime; loopTime += 86400000) { let loop = new Date (loopTime); let n = getDayOfYear (loop); let d; if (n < cnt / 2) { d = Math.abs (n / (cnt - n) - phi); if (d < minphi) { minphi = d; minDate1 = loop; } } else if (n < cnt) { d = Math.abs (n / (cnt - n) - Phi); if (d < minPhi) { minPhi = d; minDate2 = loop; } } //console.log (strDate(loop) + ' (' + n + ') ' + d + "\n"); } let el = document.getElementById(id); el.innerHTML += 'Год '+year+': '+strDate(minDate1)+', '+strDate(minDate2)+'<br>'+"\n\n"; } //getGoldDays getGoldDays (2019,'goldLog'); getGoldDays (2020,'goldLog'); </script> <noscript>Нужен включённый JavaScript для работы приложения</noscript> </div>
15.12.2019, 17:13 [1473 просмотра]