{"id":4030,"date":"2020-06-20T18:26:14","date_gmt":"2020-06-20T22:26:14","guid":{"rendered":"http:\/\/faculty.fiu.edu\/~theobald\/?page_id=4030"},"modified":"2021-03-16T22:33:41","modified_gmt":"2021-03-17T02:33:41","slug":"clock","status":"publish","type":"page","link":"https:\/\/faculty.fiu.edu\/~theobald\/fun\/clock\/","title":{"rendered":"clock"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"4030\" class=\"elementor elementor-4030\">\n\t\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-09d1925 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"09d1925\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9a500f5\" data-id=\"9a500f5\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-75e0b97 elementor-widget elementor-widget-text-editor\" data-id=\"75e0b97\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h3>A Better Clock<\/h3><p>Everyone hates today&#8217;s clocks, which display the same configuration for completely different times of day, like noon and midnight. Here is a better clock that displays solar noon, midnight, sunrise, and sunset, with colors to represent solar elevation. I wrote this when I realized that even though I like analog <em>displays<\/em>, I dislike analog <em>clocks<\/em> because they misrepresent the single periodic nature of a day, and this has bothered me ever since I was a kid learning to tell time. Input your latitude and longitude, in degrees, with Southern latitudes and Western longitudes as negative values.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c5724f9 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c5724f9\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6afa513\" data-id=\"6afa513\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4f95482 elementor-widget elementor-widget-html\" data-id=\"4f95482\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<!DOCTYPE HTML>\n<html>\n  <meta charset=\"utf-8\" \/>\n  <body>\n    <div>\n    <input id=\"latn\", name=\"latn\", type=\"number\" size=\"6\">\n    <label for=\"lat\">Latitude<\/label>\n    <br>\n    <input id=\"lonn\", name=\"lonn\", type=\"number\" size=\"6\">\n    <label for=\"lon\">Longitude<\/label>\n    <br> <p style=\"margin-left:10px;\">\n    <input type=\"checkbox\" id=\"show_minutes\" name=\"show_minutes\" value=\"show\">\n    <label for=\"lat\">Show minutes hand<\/label>\n    &nbsp;&nbsp;&nbsp;&nbsp;\n    <input type=\"checkbox\" id=\"show_minutes_top\" name=\"show_minutes_top\" value=\"show\">\n    <label for=\"lat\", id=\"show_minutes_top_label\">Zero minutes on top<\/label> <\/p>\n    <\/div>\n    <canvas id=\"clockcanvas\"><\/canvas>\n    <script>\n      'use strict';\n      var canvas=document.getElementById(\"clockcanvas\");\n      var latn=document.getElementById(\"latn\");\n      var lonn=document.getElementById(\"lonn\");\n      var showmin=document.getElementById(\"show_minutes\");\n      var showmintop=document.getElementById(\"show_minutes_top\");\n      var showmintoplab=document.getElementById(\"show_minutes_top_label\");\n      const ctx = canvas.getContext('2d');\n      const width = canvas.width = Math.min(window.innerWidth, window.innerHeight);\n      const height = canvas.height = Math.min(window.innerWidth, window.innerHeight);\n      const cx = Math.floor(width\/2);\n      const cy = Math.floor(height\/2);\n      const cr = Math.floor(.75*width\/2);\n      \/\/ Latitude and Longitude input\n      latn.setAttribute(\"type\", \"number\");\n      latn.setAttribute(\"value\", 26.0);\n      latn.setAttribute(\"size\", 5);\n      latn.onchange = function() {update()}\n      \/\/ lonl.textContent = \"Longitude\";\n      \/\/ lonl.style.display = 'inline-block'\n      \/\/ lonl.style.width = '250px'\n      lonn.setAttribute(\"type\", \"number\");\n      lonn.setAttribute(\"value\", -80.0);\n      lonn.setAttribute(\"size\", 5);\n      lonn.onchange = function() {update()}\n      \/\/ show minutes box\n      showmin.onchange =  function() {update()}\n      showmintop.onchange =  function() {update()}\n      var i;\n      var timer = setInterval(update, 10000);\n\n      \/\/ colormaps roughly interpolated from matplotlib\n      function cm_plasma(x) { \/\/x = 0--1\n\t  var r = Math.min(Math.max(Math.round(-104.1*x**3 + -135.0*x**2 + 462.6*x + 19.3), 0), 255);\n\t  var g = Math.min(Math.max(Math.round(-254.9*x**3 + 617.4*x**2 + -127.7*x + 7.0), 0), 255);\n\t  var b = Math.min(Math.max(Math.round(582.1*x**3 + -1023.3*x**2 + 344.7*x + 133.4), 0), 255);\n\t  return \"rgb(\"+r+\",\"+g+\",\"+b+\")\";\n      }\n\n      function geosuccess(pos) {\n\t  var crd = pos.coords;\n\t  console.log('Your current position is:');\n\t  console.log(`Latitude : ${crd.latitude}`);\n\t  console.log(`Longitude: ${crd.longitude}`);\n\t  console.log(`More or less ${crd.accuracy} meters.`);\n      }\n\n      function geoerror(err) {\n\t  para.innerHTML = `ERROR(${err.code}): ${err.message}<br>Please enter Latitude and Longitude`;\n\t  \/\/ alert(`ERROR(${err.code}): ${err.message}\\nPlease enter Latitude and Longitude`);\n      }\n\n      \/\/ navigator.geolocation.getCurrentPosition(geosuccess, geoerror, {timeout: 500});\n\n\n      function draw_day_colors(ctx, latitude_rad, declination_sun) {\n\t  const divs = 179;\n\t  const dd = \"day\";\n\t  var i;\n\t  var grd;\n\t  var ha, han; \/\/current hour angle and the next hour angle\n\t  var se, sen; \/\/solar elevation and the next solar elevation\n\t  ctx.clearRect(0, 0, canvas.width, canvas.height);\n\t  for (i=0; i<divs; i++){\n\t      ha = i\/divs*2*Math.PI;\n\t      han = (i+1)\/divs*2*Math.PI;\n\t      se = Math.asin(Math.sin(latitude_rad)*Math.sin(declination_sun) + Math.cos(latitude_rad)*Math.cos(declination_sun)*Math.cos(ha));\n\t      sen = Math.asin(Math.sin(latitude_rad)*Math.sin(declination_sun) + Math.cos(latitude_rad)*Math.cos(declination_sun)*Math.cos(han));\n\t      \/\/ converted to 0--1\n\t      se = (se + Math.PI)\/(2*Math.PI);\n\t      sen = (sen + Math.PI)\/(2*Math.PI);\n\t      \/\/ sigmoid to make color change at dawn and dusk less gradual\n\t      se = 1.0\/(1+Math.exp(-40*(se-.50)))+ .0;\n\t      sen = 1.0\/(1+Math.exp(-40*(sen-.50)))+ .0;\n\t      \/\/ console.log({dd, i, ha, han, se, sen} )\n\t      grd = ctx.createLinearGradient(cx+cr*Math.cos(ha-Math.PI\/2), cy+cr*Math.sin(ha-Math.PI\/2), cx+cr*Math.cos(han-Math.PI\/2), cy+cr*Math.sin(han-Math.PI\/2));\n\t      \/\/ grd = ctx.createLinearGradient(cx, cy, cx+cr*Math.cos(ha-Math.PI\/2), cy+cr*Math.sin(ha-Math.PI\/2));\n\t      \/\/ grd.addColorStop(0, \"black\");\n\t      grd.addColorStop(0, cm_plasma(se));\n\t      grd.addColorStop(1, cm_plasma(sen));\n\t      ctx.beginPath();\n\t      ctx.fillStyle = grd;\n\t      ctx.arc(cx, cy, cr, i\/divs*2*Math.PI-Math.PI\/2, (i+2)\/divs*2*Math.PI-Math.PI\/2);\n\t      ctx.lineTo(cx, cy);\n\t      ctx.fill();\n\n\t  }\n      }\n\n\n      function draw_tick(ctx, ang, inner, outer) {\n\t  ang += Math.PI\/2;\n\t  var startx = cx + cr*inner*Math.cos(ang);\n\t  var starty = cy + cr*inner*Math.sin(ang);\n\t  var endx = cx + cr*outer*Math.cos(ang);\n\t  var endy = cy + cr*outer*Math.sin(ang);\n\t  ctx.beginPath();\n\t  ctx.strokeStyle = 'white';\n\t  ctx.moveTo(startx, starty);\n\t  ctx.lineTo(endx, endy);\n\t  ctx.lineWidth = 2;\n\t  ctx.stroke();\n      }\n\n      function draw_text(ctx, text, ang, dist, color=\"black\", frat=0.1) {\n\t  ang += Math.PI\/2;\n\t  var fsize = Math.round(cr)*frat;\n\t  var x = cx + cr*dist*Math.cos(ang);\n\t  var y = cy + cr*dist*Math.sin(ang)+fsize\/3;\n\t  ctx.font = fsize + \"px Arial\";\n\t  ctx.fillStyle = color;\n\t  ctx.textAlign = \"center\";\n\t  ctx.fillText(text, x, y);\n      }\n\n      function draw_hand(ctx, ang) {\n\t  ang += Math.PI\/2;\n\t  const width = .03;\n\t  var tipx = cx + cr*Math.cos(ang);\n\t  var tipy = cy + cr*Math.sin(ang);\n\t  var lx = cx + cr*width*Math.cos(ang + Math.PI\/2);\n\t  var ly = cy + cr*width*Math.sin(ang + Math.PI\/2);\n\t  var rx = cx + cr*width*Math.cos(ang - Math.PI\/2);\n\t  var ry = cy + cr*width*Math.sin(ang - Math.PI\/2);\n\t  ctx.beginPath();\n\t  ctx.fillStyle = 'white';\n\t  ctx.moveTo(tipx, tipy);\n\t  ctx.lineTo(lx, ly);\n\t  ctx.lineTo(rx, ry);\n\t  ctx.fill();\n\t  ctx.beginPath();\n\t  ctx.fillStyle = 'white';\n\t  ctx.arc(cx, cy, cr\/10, 0, 2*Math.PI);\n\t  ctx.fill();\n      }\n\n      function draw_minute_face(ctx, latitude_rad, declination_sun, now, day_rot) {\n\t  const divs = 179;\n\t  const dd = \"hour\";\n\t  var i;\n\t  var grd;\n\t  var ang, angn; \/\/current and next angles through the hour cycle\n\t  var ha0, ha1, ha, han; \/\/current hour angle and the next hour angle\n\t  var se, sen; \/\/solar elevation and the next solar elevation\n\t  var top_rot = Math.PI; \/\/do we rotate to show minutes on top\n\t  if (showmintop.checked) {top_rot=0}\n\t  for (i=0; i<divs; i++){\n\t      ang = i\/divs*2*Math.PI + top_rot;\n\t      angn = (i+1)\/divs*2*Math.PI + top_rot;\n\t      ha0 = ((now.getHours() + 0)*15 - day_rot)*Math.PI\/180 - Math.PI;\n\t      ha1 = ((now.getHours() + 1)*15 - day_rot)*Math.PI\/180 - Math.PI;\n\t      ha = ha0 + (ha1-ha0)*i\/divs\n\t      han = ha0 + (ha1-ha0)*(i+1)\/divs\n\t      se = Math.asin(Math.sin(latitude_rad)*Math.sin(declination_sun) + Math.cos(latitude_rad)*Math.cos(declination_sun)*Math.cos(ha));\n\t      sen = Math.asin(Math.sin(latitude_rad)*Math.sin(declination_sun) + Math.cos(latitude_rad)*Math.cos(declination_sun)*Math.cos(han));\n\t      \/\/ converted to 0--1\n\t      se = (se + Math.PI)\/(2*Math.PI);\n\t      sen = (sen + Math.PI)\/(2*Math.PI);\n\t      \/\/ sigmoid to make color change at dawn and dusk less gradual\n\t      se = 1.0\/(1+Math.exp(-40*(se-.50)))+ .0;\n\t      sen = 1.0\/(1+Math.exp(-40*(sen-.50)))+ .0;\n\t      \/\/ console.log( {dd, i, ha, han, se, sen} )\n\t      grd = ctx.createLinearGradient(cx+cr\/3*Math.cos(ang-Math.PI\/2), cy+cr\/3*Math.sin(ang-Math.PI\/2), cx+cr\/3*Math.cos(angn-Math.PI\/2), cy+cr\/3*Math.sin(angn-Math.PI\/2));\n\t      grd.addColorStop(0, cm_plasma(se));\n\t      grd.addColorStop(1, cm_plasma(sen));\n\t      ctx.beginPath();\n\t      ctx.fillStyle = grd;\n\t      ctx.arc(cx, cy, cr\/3, i\/divs*2*Math.PI-Math.PI\/2 + top_rot, (i+2)\/divs*2*Math.PI-Math.PI\/2 + top_rot);\n\t      ctx.lineTo(cx, cy);\n\t      ctx.fill();\n\t  }\n\t  for (i=0; i<60; i++){\n\t      draw_tick(ctx, i\/60*2*Math.PI, .32, .33);\n\t  }\n\t  for (i=0; i<12; i++){\n\t      draw_tick(ctx, i\/12*2*Math.PI, .29, .33);\n\t  }\n\t  for (i=0; i<4; i++){\n\t      draw_tick(ctx, i\/4*2*Math.PI, .26, .33);\n\t  }\n\t  for (i=0; i<60; i+=5) \/\/ clock hours\n\t      draw_text(ctx, i, i\/30*Math.PI+Math.PI + top_rot, 0.4, \"white\", .07);\n\t  ang = (now.getMinutes() + now.getSeconds()\/60)*Math.PI\/30 - Math.PI\/2 + top_rot; \/\/reuse ang variable\n\t  ctx.beginPath();\n\t  ctx.fillStyle = 'white';\n\t  ctx.moveTo(cx + cr\/3*Math.cos(ang), cy + cr\/3*Math.sin(ang)); \/\/tip\n\t  ctx.lineTo(cx + cr*.01*Math.cos(ang + Math.PI\/2), cy + cr*.01*Math.sin(ang + Math.PI\/2));  \/\/left\n\t  ctx.lineTo(cx + cr*.01*Math.cos(ang - Math.PI\/2), cy + cr*.01*Math.sin(ang - Math.PI\/2));  \/\/right\n\t  ctx.fill();\n\t  ctx.beginPath();\n\t  ctx.fillStyle = 'white';\n\t  ctx.arc(cx, cy, cr\/15, 0, 2*Math.PI);\n\t  ctx.fill();\n\n      }\n\n      function draw_clock(ctx) {\n\t  const divs = 180;\n\t  const latitude_rad = latn.value*Math.PI\/180;\n\t  const longitude = lonn.value;\n\t  var i;\n\t  var grd\n\t  \/\/ date\n\t  var now = new Date();\n\t  var start = new Date(now.getFullYear(), 0, 0);\n\t  var end = new Date(now.getFullYear(), 11, 30);\n\t  var now_diff = (now - start) + ((start.getTimezoneOffset() - now.getTimezoneOffset()) * 60 * 1000);\n\t  var year_diff = (end - start) + ((start.getTimezoneOffset() - end.getTimezoneOffset()) * 60 * 1000);\n\t  var oneDay = 1000 * 60 * 60 * 24;\n\t  var yday = Math.floor(now_diff \/ oneDay); \/\/ get day of year\n\t  var ydays = Math.floor(year_diff \/ oneDay); \/\/ how many days this year\n\t  var year_frac = 2*Math.PI\/ydays*(yday-1);\n\t  \/\/ the equation of time accounts for different day lengths in the year\n\t  var eq_time = 229.18*(0.000075 + 0.001868*Math.cos(year_frac) - 0.032077*Math.sin(year_frac) - 0.014615*Math.cos(2*year_frac) - 0.040849*Math.sin(2*year_frac));\n\t  var timezone = -now.getTimezoneOffset()\/60;\n\t  var solar_noon = 720-4*longitude-eq_time; \/\/in minutes\n\t  var day_rot = (solar_noon - 720 + timezone*60)*360\/(60*24)%360;\n\t  var elev = -0.83*Math.PI\/180 \/\/ just below horizon accounting for atmospheric refraction and solar radius\n\t  var declination_sun = -Math.asin(.39779*Math.cos(0.0172028*(yday+10) + 0.0334056*Math.sin(0.0172028*(yday-2))));\n\t  var ha_rise = Math.acos(Math.sin(elev)\/(Math.cos(declination_sun)*Math.cos(latitude_rad)) - Math.tan(declination_sun)*Math.tan(latitude_rad));\n\t  var ha_set = -ha_rise + 2*Math.PI;\n\n\t  draw_day_colors(ctx, latitude_rad, declination_sun);\n\n\t  draw_tick(ctx, 0, .7, .9); \/\/ solar midnight\n\t  draw_tick(ctx, Math.PI, .7, .9); \/\/ solar noon\n\t  draw_tick(ctx, Math.PI-ha_rise, .7, .9); \/\/ sunrise\n\t  draw_tick(ctx, Math.PI-ha_set, .7, .9); \/\/ sunset\n\t  for (i=0; i<360; i+=180) \/\/ clock noon and midnight\n\t      draw_tick(ctx, (i-day_rot)*Math.PI\/180, .8, 1.0);\n\t  for (i=0; i<360; i+=15) \/\/ clock hours\n\t      draw_tick(ctx, (i-day_rot)*Math.PI\/180, .9, 1.0);\n\t  for (i=0; i<360; i+=15\/4) \/\/ clock 15 mins\n\t      draw_tick(ctx, (i-day_rot)*Math.PI\/180, .95, 1.0);\n\t  for (i=0; i<24; i++) \/\/ clock hours\n\t      draw_text(ctx, i, (i*15-day_rot)*Math.PI\/180, 1.05);\n\n\t  draw_hand(ctx, (now.getHours()*15 + now.getMinutes()*.25 - day_rot)*Math.PI\/180);\n\t  if (showmin.checked) {\n\t      showmintop.disabled = false;\n\t      showmintoplab.style.color=\"black\";\n\t      draw_minute_face(ctx, latitude_rad, declination_sun, now, day_rot);\n\t  } else {\n\t      showmintop.disabled = true\n\t      showmintoplab.style.color=\"gray\";\n\t  }\n      }\n\n      function update() {\n\t  draw_clock(ctx)\n      }\n\n      update()\n      <\/script>\n  <\/body>\n<\/html>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-567a189 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"567a189\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-84a68f3\" data-id=\"84a68f3\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-da933ed elementor-widget elementor-widget-text-editor\" data-id=\"da933ed\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h3>Why is this clock better?<\/h3><p><strong>Displays <a href=\"https:\/\/en.wikipedia.org\/wiki\/24-hour_clock\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #3366ff;\">24 hours<\/span><\/a><\/strong>. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Sundial\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #3366ff;\">Sundials<\/span><\/a> are the precursors to modern clocks, and although they only cast a shadow when the sun is up, they track a single revolution per day (and you can actually see the whole revolution near the poles in the summer). So why have clocks switched to <a href=\"https:\/\/en.wikipedia.org\/wiki\/12-hour_clock\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #3366ff;\">two, twelve hour revolutions<\/span><\/a> per day? Did we run out of numbers? Should we go one more step with a 6 hour clock face and 4 daily periods (aam, apm, pam, and ppm)?\u00a0 This is like observing January\u00a0 &#8211; June, then renaming July to &#8220;January pm&#8221;, and August to &#8220;February pm&#8221;, until December becomes &#8220;June pm&#8221;. Why would we do this? And why should we do it to the 24 hour day? Imagine how many mistakes have stemmed from mixing up am and pm alarms. A <a href=\"https:\/\/en.wikipedia.org\/wiki\/24-hour_analog_dial\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #3366ff;\">24 hour clock face<\/span><\/a> eliminates these tragedies.<\/p><p><strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Noon#Solar_noon\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #3366ff;\">True noon<\/span><\/a> is on top<\/strong>. Solar noon occurs when the sun reaches its highest point above the horizon for the day at your location, which varies with longitude. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Time_zone\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #3366ff;\">Time zones<\/span><\/a> lump regions so you don&#8217;t need to reset your clock every time you move slightly east or west, but keep observed noon pretty close to solar noon. <span style=\"color: #3366ff;\"><a style=\"color: #3366ff;\" href=\"https:\/\/en.wikipedia.org\/wiki\/Daylight_saving_time\" target=\"_blank\" rel=\"noopener\">Daylight savings time<\/a><span style=\"color: #000000;\">, <\/span><\/span>however, ruins this, intentionally setting clocks wrong (and throwing away centuries of advances in timekeeping)\u00a0 to pretend we have an extra hour of daylight. We don&#8217;t have an extra hour &#8211; if you simply wanted to get up early you could have done that without setting your clock to an incorrect time. This is like skipping March and claiming its April (springing forward), just to pretend Summer lasts longer (&#8220;Look, it&#8217;s October and still summertime!&#8221;). Later, you&#8217;d need to repeat October twice in a row (falling back) to get back on schedule. What&#8217;s the point when the length of summer (like the length of the day) isn&#8217;t actually affected at all? The better clock simply rotates the indicator numbers to adjust for longitude (and stupid daylight savings time), so the hand points to the current time but both the sun and clock reach their highest points simultaneously.<\/p><p><strong>Indicates <a href=\"https:\/\/en.wikipedia.org\/wiki\/Daytime\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #3366ff;\">sunrise, sunset<\/span><\/a> and <a href=\"https:\/\/en.wikipedia.org\/wiki\/Solar_zenith_angle\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #3366ff;\">solar zenith angle<\/span><\/a><\/strong>. Sunrise and sunset are important events for biologists in the field, or hikers, or divers, or cyclists &#8211; they are important for humans in general. This better clock marks them in the same style as solar noon and midnight, and varies radial colors to represent the sun&#8217;s elevation. Here we have used an approximation of &#8220;<span style=\"color: #3366ff;\"><a style=\"color: #3366ff;\" href=\"https:\/\/bids.github.io\/colormap\/\" target=\"_blank\" rel=\"noopener\">plasma<\/a><\/span>&#8220;, one of the beautiful, perceptually uniform, default <a href=\"https:\/\/matplotlib.org\/tutorials\/colors\/colormaps.html\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #3366ff;\">colormaps<\/span><\/a> from <a href=\"https:\/\/matplotlib.org\/\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #3366ff;\">matplotlib<\/span><\/a>, a plotting library for the <a href=\"https:\/\/www.python.org\/\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #3366ff;\">Python<\/span><\/a> programming language. All these values depend on your latitude.<\/p><p><strong>No <a href=\"https:\/\/en.wikipedia.org\/wiki\/Roman_numerals\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #3366ff;\">Roman numerals<\/span><\/a><\/strong>. The Romans <span style=\"color: #3366ff;\"><a style=\"color: #3366ff;\" href=\"https:\/\/www.youtube.com\/watch?v=Qc7HmhrgTuQ\" target=\"_blank\" rel=\"noopener\">did a lot for us<\/a><\/span>, but Roman numerals are something we should leave behind. They make simple math difficult, include only a finite set of numbers, many of which don&#8217;t have a standardized representation, and most people can&#8217;t count to a hundred with them. They also lack a zero, and have different bases for whole numbers and fractions! <a href=\"https:\/\/en.wikipedia.org\/wiki\/Arabic_numerals\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #3366ff;\">Arabic numerals<\/span><\/a> in the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Decimal\" target=\"_blank\" rel=\"noopener\"><span style=\"color: #3366ff;\">decimal system<\/span><\/a> are so vastly superior in every way that it is bizarre we feel nostalgic enough to retain Roman numerals at all (and not the many other <span style=\"color: #3366ff;\"><a style=\"color: #3366ff;\" href=\"https:\/\/en.wikipedia.org\/wiki\/List_of_numeral_systems\" target=\"_blank\" rel=\"noopener\">numeral systems<\/a><\/span> people once used). Clock faces are one of the few places they still survive, and getting them off of clocks, (and a few other holdouts, like the opening pages of some books, movies, and the superbowl) would let us remove them from children&#8217;s education. Reallocate time spent teaching Roman numerals for something useful, like maybe bring back recess. Historians still have to learn Roman numerals, which is okay because they aren&#8217;t really hard, but no one should <em>use<\/em> them and they should be off of clocks forever.<\/p><div><b>Optional minutes display<\/b>. Most clock faces demand that we quickly multiply the labeled value of the hours indicator by 5 to get the unlabeled value of the minutes. This is bizarre given that the clock is supposed to <em>tell<\/em> <em>me<\/em> what time it is, but instead requires me to calculate minutes from a formula. Also strange is that the minutes, which aren&#8217;t labeled, are indicated by the <em>larger<\/em> hand, despite being a less significant digit than hours. On this clock I can usually tell the time within a minute or two just by the progression of the hour hand. But if you need better precision, you can activate the minutes indicator, which has its own, labeled dial, and is properly represented as the smaller hand on the clock. You can keep zero near the bottom, as with the hour hand, or put it at its traditional place on top, if you prefer.<\/div>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>A Better Clock Everyone hates today&#8217;s clocks, which display the same configuration for completely different times of day, like noon and midnight. Here is a better clock that displays solar noon, midnight, sunrise, and sunset, with colors to represent solar elevation. I wrote this when I realized that even though I like analog displays, I [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":4040,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-4030","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/faculty.fiu.edu\/~theobald\/wp-json\/wp\/v2\/pages\/4030","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/faculty.fiu.edu\/~theobald\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/faculty.fiu.edu\/~theobald\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/faculty.fiu.edu\/~theobald\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/faculty.fiu.edu\/~theobald\/wp-json\/wp\/v2\/comments?post=4030"}],"version-history":[{"count":82,"href":"https:\/\/faculty.fiu.edu\/~theobald\/wp-json\/wp\/v2\/pages\/4030\/revisions"}],"predecessor-version":[{"id":4301,"href":"https:\/\/faculty.fiu.edu\/~theobald\/wp-json\/wp\/v2\/pages\/4030\/revisions\/4301"}],"up":[{"embeddable":true,"href":"https:\/\/faculty.fiu.edu\/~theobald\/wp-json\/wp\/v2\/pages\/4040"}],"wp:attachment":[{"href":"https:\/\/faculty.fiu.edu\/~theobald\/wp-json\/wp\/v2\/media?parent=4030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}