REPLACE ALL TEXT IN THIS FILE.
Here is where you write a short, coherent description of an idea for your clock.
license: mit |
<head> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.3/p5.js"></script> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.3/addons/p5.dom.js"></script> | |
<script language="javascript" type="text/javascript" src="z_purview_helper.js"></script> | |
<script language="javascript" type="text/javascript" src="clock.js"></script> | |
<script language="javascript" type="text/javascript" src="runner.js"></script> | |
</head> | |
<body style="background-color:white"> | |
<div class="outer"> | |
<div class="inner"> | |
<div id="canvasContainer"></div> | |
</div> | |
</div> | |
</table> | |
<br> | |
<a href="part1.html">part1</a> | |
<a href="part2.html">part2</a> | |
</body> |
/* | |
* use p5.js to draw a clock on a 960x500 canvas | |
*/ | |
function draw_clock(obj) { | |
// draw your own clock here based on the values of obj: | |
// obj.hours goes from 0-23 | |
// obj.minutes goes from 0-59 | |
// obj.seconds goes from 0-59 | |
// obj.millis goes from 0-999 | |
// obj.seconds_until_alarm is: | |
// < 0 if no alarm is set | |
// = 0 if the alarm is currently going off | |
// > 0 --> the number of seconds until alarm should go off | |
} |
/* | |
* us p5.js to draw a clock on a 960x500 canvas | |
*/ | |
function draw_clock(obj) { | |
// draw your own clock here based on the values of obj: | |
// obj.hours goes from 0-23 | |
// obj.minutes goes from 0-59 | |
// obj.seconds goes from 0-59 | |
// obj.millis goes from 0-999 | |
// obj.seconds_until_alarm is: | |
// < 0 if no alarm is set | |
// = 0 if the alarm is currently going off | |
// > 0 --> the number of seconds until alarm should go off | |
let hours = obj.hours; | |
let minutes = obj.minutes; | |
let seconds = obj.seconds; | |
let millis = obj.millis; | |
let alarm = obj.seconds_until_alarm; | |
background(255,255,200); // beige | |
fill(128,100,100); // dark grey | |
text("Hour: " + hours, 10, 22); | |
text("Minute: " + minutes, 10, 42); | |
text("Second: " + seconds, 10, 62); | |
text("Millis: " + millis, 10, 82); | |
let hourBarWidth = map(hours, 0, 23, 0, width); | |
let minuteBarWidth = map(minutes, 0, 59, 0, width); | |
let secondBarWidth = map(seconds, 0, 59, 0, width); | |
let millisBarWidth = map(millis, 0, 1000, 0, width); | |
noStroke(); | |
fill(40); | |
rect(0, 100, hourBarWidth, 50); | |
fill(80); | |
rect(0, 150, minuteBarWidth, 50); | |
fill(120) | |
rect(0, 200, secondBarWidth, 50); | |
fill(160) | |
rect(0, 250, millisBarWidth, 50); | |
// Make a bar which *smoothly* interpolates across 1 minute. | |
// We calculate a version that goes from 0...60, | |
// but with a fractional remainder: | |
let secondBarWidthChunky = map(seconds, 0, 60, 0, width); | |
let secondsWithFraction = seconds + (millis / 1000.0); | |
let secondBarWidthSmooth = map(secondsWithFraction, 0, 60, 0, width); | |
fill(100, 100, 200) | |
rect(0, 350, secondBarWidthChunky, 50); | |
fill(120, 120, 240) | |
rect(0, 400, secondBarWidthSmooth, 50); | |
text("Minute: " + secondsWithFraction, 200, 42); | |
fill(200, 100, 100) | |
let alarm_message = "" | |
if(alarm < 0) { | |
alarm_message = "Alarm: Not Set" | |
} | |
else if(alarm == 0) { | |
alarm_message = "Alarm: GOING OFF" | |
} | |
else { | |
let seconds_remaining = int(alarm); | |
alarm_message = "Alarm: will go off in " + seconds_remaining + " seconds" | |
} | |
text(alarm_message, 400, 42); | |
} |
<head> | |
<style> body {padding: 0; margin: 0;} </style> | |
</head> | |
<body style="background-color:white"> | |
<img src="sketch.jpg" width="960" height="500"/> | |
<br> | |
<a href="part2.html">part2</a> | |
<a href="clock.html">clock</a> | |
</body> |
const spacing = 70; | |
// Update this function to draw you own maeda clock on a 960x500 canvas | |
function draw_clock(obj) { | |
fill(0); | |
background(0); | |
strokeWeight(5); | |
stroke(255, 0, 0); | |
for(let i = -2*spacing; i <= 2*spacing; i = i+spacing) { | |
ellipse(width/2, height/2+i, 45, 45); | |
} | |
strokeWeight(3); | |
stroke(255, 255, 0); | |
for(let i = -2*spacing; i <= 2*spacing; i = i+spacing) { | |
ellipse(width/2, height/2+i, 40, 40); | |
} | |
stroke(0, 0, 255); | |
for(let i = -2*spacing; i <= 2*spacing; i = i+spacing) { | |
ellipse(width/2, height/2+i, 30, 30); | |
} | |
} |
<head> | |
<style> body {padding: 0; margin: 0;} </style> | |
</head> | |
<body style="background-color:white"> | |
<img src="sketch.jpg" width="960" height="500"/> | |
<br> | |
<a href="part2.html">part2</a> | |
<a href="clock.html">clock</a> | |
</body> |
<head> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.3/p5.js"></script> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.3/addons/p5.dom.js"></script> | |
<script language="javascript" type="text/javascript" src="z_purview_helper.js"></script> | |
<script language="javascript" type="text/javascript" src="maeda_clock.js"></script> | |
<script language="javascript" type="text/javascript" src="runner.js"></script> | |
</head> | |
<body style="background-color:white"> | |
<div class="outer"> | |
<div class="inner"> | |
<div id="canvasContainer"></div> | |
</div> | |
</div> | |
</table> | |
<br> | |
<a href="part1.html">part1</a> | |
<a href="clock.html">clock</a> | |
</body> |
var canvasWidth = 960; | |
var canvasHeight = 500; | |
var prevSec; | |
var millisRolloverTime; | |
var nextAlarm; | |
var debug_is_on = (typeof DEBUG !== 'undefined'); | |
function setup () { | |
// create the drawing canvas, save the canvas element | |
var main_canvas = createCanvas(canvasWidth, canvasHeight); | |
main_canvas.parent('canvasContainer'); | |
// this is true if debug.js is included | |
if(debug_is_on) { | |
debug_setup(); | |
} | |
turn_off_alarm(); | |
} | |
function turn_on_alarm() { | |
nextAlarm = millis() + 20000; | |
print("Alarm on: T minus 20 seconds"); | |
} | |
function turn_off_alarm() { | |
nextAlarm = -1; | |
print("Alarm turned off"); | |
} | |
function mouseClicked() { | |
if (debug_is_on && debugCheckbox.checked()) { | |
return; | |
} | |
if (nextAlarm > 0) { | |
turn_off_alarm(); | |
} | |
else { | |
turn_on_alarm(); | |
} | |
} | |
// taking ideas from http://cmuems.com/2016/60212/deliverables/deliverables-02/ | |
function draw () { | |
var H, M, S, mils, alarm; | |
if (debug_is_on && debugCheckbox.checked()) { | |
hourSlider.removeAttribute('disabled'); | |
minSlider.removeAttribute('disabled'); | |
secSlider.removeAttribute('disabled'); | |
millisSlider.removeAttribute('disabled'); | |
alarmCheckbox.removeAttribute('disabled'); | |
alarmSlider.removeAttribute('disabled'); | |
H = hourSlider.value(); | |
M = minSlider.value(); | |
S = secSlider.value(); | |
mils = millisSlider.value(); | |
if (alarmCheckbox.checked()) { | |
alarm = alarmSlider.value(); | |
} | |
else { | |
alarm = -1; | |
} | |
} | |
else { | |
// Fetch the current time | |
H = hour(); | |
M = minute(); | |
S = second(); | |
if (nextAlarm > 0) { | |
now = millis(); | |
var millis_offset = nextAlarm - now; | |
if (millis_offset < -10000 ){ | |
// turn off alarm | |
nextAlarm = -1; | |
alarm = -1; | |
} | |
else if (millis_offset < 0) { | |
alarm = 0; | |
} | |
else { | |
alarm = millis_offset / 1000.0; | |
} | |
} | |
else { | |
alarm = -1; | |
} | |
// Reckon the current millisecond, | |
// particularly if the second has rolled over. | |
// Note that this is more correct than using millis()%1000; | |
if (prevSec != S) { | |
millisRolloverTime = millis(); | |
} | |
prevSec = S; | |
mils = floor(millis() - millisRolloverTime); | |
if (debug_is_on) { | |
hourSlider.attribute('disabled',''); | |
minSlider.attribute('disabled',''); | |
secSlider.attribute('disabled',''); | |
millisSlider.attribute('disabled',''); | |
alarmCheckbox.attribute('disabled',''); | |
alarmSlider.attribute('disabled',''); | |
hourSlider.value(H); | |
minSlider.value(M); | |
secSlider.value(S); | |
millisSlider.value(mils); | |
alarmCheckbox.checked(alarm >= 0); | |
alarmSlider.value(alarm); | |
} | |
} | |
obj = {}; | |
obj.hours = H; | |
obj.minutes = M; | |
obj.seconds = S; | |
obj.millis = mils; | |
obj.seconds_until_alarm = alarm; | |
draw_clock(obj); | |
} | |
function keyTyped() { | |
if (key == '!') { | |
saveBlocksImages(); | |
} | |
else if (key == '@') { | |
saveBlocksImages(true); | |
} | |
} |
// note: this file is poorly named - it can generally be ignored. | |
// helper functions below for supporting blocks/purview | |
function saveBlocksImages(doZoom) { | |
if(doZoom == null) { | |
doZoom = false; | |
} | |
// generate 960x500 preview.jpg of entire canvas | |
// TODO: should this be recycled? | |
var offscreenCanvas = document.createElement('canvas'); | |
offscreenCanvas.width = 960; | |
offscreenCanvas.height = 500; | |
var context = offscreenCanvas.getContext('2d'); | |
// background is flat white | |
context.fillStyle="#FFFFFF"; | |
context.fillRect(0, 0, 960, 500); | |
context.drawImage(this.canvas, 0, 0, 960, 500); | |
// save to browser | |
var downloadMime = 'image/octet-stream'; | |
var imageData = offscreenCanvas.toDataURL('image/jpeg'); | |
imageData = imageData.replace('image/jpeg', downloadMime); | |
p5.prototype.downloadFile(imageData, 'preview.jpg', 'jpg'); | |
// generate 230x120 thumbnail.png centered on mouse | |
offscreenCanvas.width = 230; | |
offscreenCanvas.height = 120; | |
// background is flat white | |
context = offscreenCanvas.getContext('2d'); | |
context.fillStyle="#FFFFFF"; | |
context.fillRect(0, 0, 230, 120); | |
if(doZoom) { | |
// pixelDensity does the right thing on retina displays | |
var pd = this._pixelDensity; | |
var sx = pd * mouseX - pd * 230/2; | |
var sy = pd * mouseY - pd * 120/2; | |
var sw = pd * 230; | |
var sh = pd * 120; | |
// bounds checking - just displace if necessary | |
if (sx < 0) { | |
sx = 0; | |
} | |
if (sx > this.canvas.width - sw) { | |
sx = this.canvas.width - sw; | |
} | |
if (sy < 0) { | |
sy = 0; | |
} | |
if (sy > this.canvas.height - sh) { | |
sy = this.canvas.height - sh; | |
} | |
// save to browser | |
context.drawImage(this.canvas, sx, sy, sw, sh, 0, 0, 230, 120); | |
} | |
else { | |
// now scaledown | |
var full_width = this.canvas.width; | |
var full_height = this.canvas.height; | |
context.drawImage(this.canvas, 0, 0, full_width, full_height, 0, 0, 230, 120); | |
} | |
imageData = offscreenCanvas.toDataURL('image/png'); | |
imageData = imageData.replace('image/png', downloadMime); | |
p5.prototype.downloadFile(imageData, 'thumbnail.png', 'png'); | |
} |